diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..8e808b79 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +target +.mvn/wrapper/dists +.git +.gitignore +.idea +*.iml diff --git a/.github/workflows/cd-master.yml b/.github/workflows/cd-master.yml new file mode 100644 index 00000000..4e127ce9 --- /dev/null +++ b/.github/workflows/cd-master.yml @@ -0,0 +1,49 @@ +name: CD - Build, Push Image, (Optional) Rollout + +on: + push: + branches: [ master ] + +env: + IMAGE_NAME: ghcr.io/${{ github.repository_owner }}/intens-api-2022 + TAG: ${{ github.sha }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write # potrebno za push na GHCR + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 8 (Temurin) + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '8' + cache: 'maven' + + - name: Build JAR + run: mvn -B -e -DskipTests clean package + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build & push Docker image (Dockerfile.ci) + uses: docker/build-push-action@v6 + with: + context: . + file: Dockerfile.ci + push: true + tags: | + ${{ env.IMAGE_NAME }}:latest + ${{ env.IMAGE_NAME }}:${{ env.TAG }} diff --git a/.github/workflows/ci-pr.yml b/.github/workflows/ci-pr.yml new file mode 100644 index 00000000..e19445c7 --- /dev/null +++ b/.github/workflows/ci-pr.yml @@ -0,0 +1,22 @@ +name: CI - PR tests + +on: + pull_request: + branches: [ master ] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Set up JDK 8 (Temurin) + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '8' + cache: 'maven' + + - name: Run tests + run: mvn -B -e test diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..5b752e4e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,31 @@ +FROM container-registry.oracle.com/java/jdk:8 AS build + +ENV MAVEN_VERSION=3.8.8 \ + MAVEN_HOME=/opt/maven \ + PATH=/opt/maven/bin:$PATH + +RUN yum -y install curl tar gzip && \ + curl -fsSL https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -o /tmp/maven.tar.gz && \ + tar -xzf /tmp/maven.tar.gz -C /opt && \ + ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven && \ + ln -s /opt/maven/bin/mvn /usr/bin/mvn && \ + yum clean all && rm -rf /var/cache/yum /tmp/* + +WORKDIR /app + +COPY pom.xml . +RUN mvn -q -e -B -DskipTests dependency:go-offline + +COPY src ./src +RUN mvn -q -e -B -DskipTests clean package + +FROM container-registry.oracle.com/java/serverjre:8 +WORKDIR /app + +ENV PORT=8080 + +COPY --from=build /app/target/*.jar /app/app.jar + +ENTRYPOINT ["sh","-c","java -jar /app/app.jar --server.port=${PORT}"] + +EXPOSE 8080 diff --git a/Dockerfile.ci b/Dockerfile.ci new file mode 100644 index 00000000..1da26acb --- /dev/null +++ b/Dockerfile.ci @@ -0,0 +1,32 @@ +FROM eclipse-temurin:8-jdk AS build + +ARG MAVEN_VERSION=3.8.8 +ENV MAVEN_HOME=/opt/maven \ + PATH=/opt/maven/bin:$PATH + +RUN apt-get update && apt-get install -y curl tar gzip && \ + curl -fsSL https://archive.apache.org/dist/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz -o /tmp/maven.tar.gz && \ + tar -xzf /tmp/maven.tar.gz -C /opt && \ + ln -s /opt/apache-maven-${MAVEN_VERSION} /opt/maven && \ + ln -s /opt/maven/bin/mvn /usr/bin/mvn && \ + rm -rf /var/lib/apt/lists/* /tmp/* + +WORKDIR /app + +COPY pom.xml . +RUN mvn -q -e -B -DskipTests dependency:go-offline + +COPY src ./src +RUN mvn -q -e -B -DskipTests clean package + +FROM eclipse-temurin:8-jre + +WORKDIR /app + +ENV PORT=8080 + +COPY --from=build /app/target/*.jar /app/app.jar + +ENTRYPOINT ["sh","-c","java -jar /app/app.jar --server.port=${PORT}"] + +EXPOSE 8080 diff --git a/README.md b/README.md index 247e4e0b..6734eb94 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,11 @@ https://docs.github.com/en/actions/automating-builds-and-tests/building-and-test 1. Java 8 https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html 2. Eclipse / IntelliJ / Alat po izboru 3. Docker https://www.docker.com/products/docker-desktop + + +### Kako pokrenuti Kubernetes +1. Build local image: docker build -t intens-api-oracle-full:dev . +2. Start Minikube: minikube start --driver=docker +3. Load local image into Minikube: minikube image load intens-api-oracle-full:dev +4. Apply manifests: kubectl apply -f k8s/ +5. Get URL and open the app: minikube service intens-api-svc --url diff --git a/k8s/deployment.yaml b/k8s/deployment.yaml new file mode 100644 index 00000000..32c838ab --- /dev/null +++ b/k8s/deployment.yaml @@ -0,0 +1,42 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: intens-api + labels: + app: intens-api +spec: + replicas: 1 + selector: + matchLabels: + app: intens-api + template: + metadata: + labels: + app: intens-api + spec: + containers: + - name: intens-api + image: intens-api-oracle-full:dev + imagePullPolicy: IfNotPresent + env: + - name: PORT + value: "8080" + ports: + - containerPort: 8080 + readinessProbe: + tcpSocket: + port: 8080 + initialDelaySeconds: 4 + periodSeconds: 5 + livenessProbe: + tcpSocket: + port: 8080 + initialDelaySeconds: 10 + periodSeconds: 10 + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "500m" + memory: "512Mi" diff --git a/k8s/service.yaml b/k8s/service.yaml new file mode 100644 index 00000000..be903f54 --- /dev/null +++ b/k8s/service.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: Service +metadata: + name: intens-api-svc + labels: + app: intens-api +spec: + type: NodePort + selector: + app: intens-api + ports: + - name: http + port: 8080 + targetPort: 8080 + nodePort: 30080 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 1960fa73..7d0b6429 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1 @@ -server.port=${PORT} \ No newline at end of file +server.port=${PORT:8080} \ No newline at end of file