From 23c60e227371941ce768965a0d5fc68f8e7a60aa Mon Sep 17 00:00:00 2001 From: zarick1 Date: Mon, 15 Sep 2025 01:28:21 +0200 Subject: [PATCH 1/6] Add Dockerfile and .dockerignore --- .dockerignore | 6 ++++++ Dockerfile | 31 +++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .dockerignore create mode 100644 Dockerfile 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/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 From 171f05a2a9577ff55afb40d6d00cbef9fcdc7995 Mon Sep 17 00:00:00 2001 From: zarick1 Date: Mon, 15 Sep 2025 03:19:58 +0200 Subject: [PATCH 2/6] add k8s manifests and run instructions --- README.md | 8 ++++++++ k8s/deployment.yaml | 42 ++++++++++++++++++++++++++++++++++++++++++ k8s/service.yaml | 15 +++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 k8s/deployment.yaml create mode 100644 k8s/service.yaml 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 From 6c75484e020540adc83cdcd88a6b643793b73a35 Mon Sep 17 00:00:00 2001 From: zarick1 Date: Mon, 15 Sep 2025 03:55:40 +0200 Subject: [PATCH 3/6] add Dockerfile.ci for cloud build --- Dockerfile.ci | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Dockerfile.ci 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 From 316c81a8143590fa7269c0629865e9ef8820e712 Mon Sep 17 00:00:00 2001 From: Krsto Zaric <136852324+zarick1@users.noreply.github.com> Date: Mon, 15 Sep 2025 04:38:51 +0200 Subject: [PATCH 4/6] Create ci-pr.yml --- .github/workflows/ci-pr.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/ci-pr.yml 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 From 4ee50d563a6692ed4714cb4edd4446852a9bb126 Mon Sep 17 00:00:00 2001 From: zarick1 Date: Mon, 15 Sep 2025 10:29:20 +0200 Subject: [PATCH 5/6] fix: make server.port use to avoid CI NumberFormatException --- src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From fe3cb267110c9307f9536b052d2650132073f0f3 Mon Sep 17 00:00:00 2001 From: Krsto Zaric <136852324+zarick1@users.noreply.github.com> Date: Mon, 15 Sep 2025 10:38:22 +0200 Subject: [PATCH 6/6] Create cd-master.yml --- .github/workflows/cd-master.yml | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/cd-master.yml 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 }}