fix: add build-and-push script, fix K8s manifests for image pull #6
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Develop CI/CD | |
| on: | |
| push: | |
| branches: [develop] | |
| jobs: | |
| detect-changes: | |
| name: Detect Changed Services | |
| runs-on: ubuntu-latest | |
| outputs: | |
| api-gateway: ${{ steps.changes.outputs.api-gateway }} | |
| user-service: ${{ steps.changes.outputs.user-service }} | |
| post-service: ${{ steps.changes.outputs.post-service }} | |
| connections-service: ${{ steps.changes.outputs.connections-service }} | |
| notification-service: ${{ steps.changes.outputs.notification-service }} | |
| uploader-service: ${{ steps.changes.outputs.uploader-service }} | |
| config-server: ${{ steps.changes.outputs.config-server }} | |
| discovery-server: ${{ steps.changes.outputs.discovery-server }} | |
| k8s: ${{ steps.changes.outputs.k8s }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: dorny/paths-filter@v3 | |
| id: changes | |
| with: | |
| filters: | | |
| api-gateway: | |
| - 'api-gateway/**' | |
| user-service: | |
| - 'user-service/**' | |
| post-service: | |
| - 'post-service/**' | |
| connections-service: | |
| - 'connections-service/**' | |
| notification-service: | |
| - 'notification-service/**' | |
| uploader-service: | |
| - 'uploader-service/**' | |
| config-server: | |
| - 'config-server/**' | |
| discovery-server: | |
| - 'discovery-server/**' | |
| k8s: | |
| - 'k8s/**' | |
| build-and-push: | |
| name: Build and Push Images | |
| runs-on: ubuntu-latest | |
| needs: detect-changes | |
| strategy: | |
| matrix: | |
| service: | |
| - { name: api-gateway, changed: "${{ needs.detect-changes.outputs.api-gateway }}" } | |
| - { name: user-service, changed: "${{ needs.detect-changes.outputs.user-service }}" } | |
| - { name: post-service, changed: "${{ needs.detect-changes.outputs.post-service }}" } | |
| - { name: connections-service, changed: "${{ needs.detect-changes.outputs.connections-service }}" } | |
| - { name: notification-service, changed: "${{ needs.detect-changes.outputs.notification-service }}" } | |
| - { name: uploader-service, changed: "${{ needs.detect-changes.outputs.uploader-service }}" } | |
| - { name: config-server, changed: "${{ needs.detect-changes.outputs.config-server }}" } | |
| - { name: discovery-server, changed: "${{ needs.detect-changes.outputs.discovery-server }}" } | |
| steps: | |
| - uses: actions/checkout@v4 | |
| if: matrix.service.changed == 'true' | |
| - name: Set up JDK 17 | |
| if: matrix.service.changed == 'true' | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'corretto' | |
| cache: maven | |
| - name: Build service | |
| if: matrix.service.changed == 'true' | |
| run: cd ${{ matrix.service.name }} && mvn package -DskipTests | |
| - name: Login to DockerHub | |
| if: matrix.service.changed == 'true' | |
| uses: docker/login-action@v3 | |
| with: | |
| username: ${{ secrets.DOCKER_USER }} | |
| password: ${{ secrets.DOCKER_PASS }} | |
| - name: Build and push image | |
| if: matrix.service.changed == 'true' | |
| uses: docker/build-push-action@v5 | |
| with: | |
| context: ./${{ matrix.service.name }} | |
| platforms: linux/amd64 | |
| push: true | |
| tags: | | |
| premtsd18/${{ matrix.service.name }}:develop | |
| premtsd18/${{ matrix.service.name }}:develop-${{ github.sha }} | |
| deploy-dev: | |
| name: Deploy to DEV | |
| runs-on: ubuntu-latest | |
| needs: build-and-push | |
| environment: development | |
| steps: | |
| - name: Deploy to Hetzner DEV | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.HETZNER_IP }} | |
| username: ${{ secrets.HETZNER_USER }} | |
| key: ${{ secrets.HETZNER_SSH_KEY }} | |
| script: | | |
| cd ~/personal/linkedin | |
| git pull origin develop | |
| docker compose pull | |
| docker compose up -d --remove-orphans | |
| docker image prune -f | |
| - name: Health check | |
| run: | | |
| sleep 30 | |
| curl -f http://${{ secrets.HETZNER_IP }}:10000/actuator/health | |
| echo "DEV deployment successful ✅" | |
| - name: Rollback on failure | |
| if: failure() | |
| uses: appleboy/ssh-action@master | |
| with: | |
| host: ${{ secrets.HETZNER_IP }} | |
| username: ${{ secrets.HETZNER_USER }} | |
| key: ${{ secrets.HETZNER_SSH_KEY }} | |
| script: | | |
| cd ~/personal/linkedin | |
| docker compose up -d | |
| echo "Rolled back ✅" | |
| e2e-tests: | |
| name: E2E Tests | |
| runs-on: ubuntu-latest | |
| needs: deploy-dev | |
| continue-on-error: true | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'corretto' | |
| cache: maven | |
| - name: Wait for services to be ready | |
| run: | | |
| echo "Waiting for DEV to be ready..." | |
| sleep 30 | |
| curl -f http://${{ secrets.HETZNER_IP }}:10000/actuator/health || echo "Health check failed, running tests anyway" | |
| echo "Services ready!" | |
| - name: Run E2E tests | |
| run: | | |
| cd e2e-tests | |
| mvn test -De2e.base.url=http://${{ secrets.HETZNER_IP }}:10000 | |
| - name: Upload E2E results | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: e2e-test-results | |
| path: e2e-tests/target/surefire-reports/ |