name: Release and deploy new version on: push: branches: - main jobs: Build-docker-and-push: name: Build the production docker container image and push it to dockerhub runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: submodules: recursive - uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - uses: docker/build-push-action@v5 with: push: true context: . file: ./docker/prod/Dockerfile tags: ${{ secrets.DOCKERHUB_USERNAME }}/pico-web-server:latest Test-Trivy: name: Scan production docker container with trivy runs-on: ubuntu-latest needs: Build-docker-and-push steps: - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: ${{ secrets.DOCKERHUB_USERNAME }}/pico-web-server:latest format: 'sarif' output: 'trivy-results.sarif' exit-code: 0 ignore-unfixed: true - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v2 with: sarif_file: 'trivy-results.sarif' sha: ${{ github.sha }} ref: ${{ github.ref }} Release: name: Make github release runs-on: ubuntu-latest needs: Test-Trivy steps: - uses: actions/checkout@v4 - uses: rymndhng/release-on-push-action@master env: GITHUB_TOKEN: ${{ secrets.TOKEN_GITHUB }} with: bump_version_scheme: norelease # PR must have one of these labels: release:major, release:minor, release:patch # This emulates deploying to an actual (remote) cluster by first setting up the cluster on older commit and then rolling out current one Deploy-kubernetes: name: Deploy kubernetes cluster locally to an action runs-on: ubuntu-latest needs: Test-Trivy steps: # Setup dependencies - name: Install socat run: sudo apt-get install -y socat - uses: medyagh/setup-minikube@master - uses: actions/checkout@v2 with: fetch-depth: 2 - name: Pull (release) docker image run: | docker pull ${{ secrets.DOCKERHUB_USERNAME }}/pico-web-server:latest - name: Configure demo data run: | minikube cp ./demo/index.md /usr/share/demo/ # Setup old deployment - name: Checkout previous commit run: | git checkout HEAD^ # Deploy previous version - name: Minikube deploy run: | kubectl apply -f kubernetes/ kubectl rollout status deployment/pico-web-server-deployment - name: Using cluster run: | kubectl get all echo -ne 'demo@/' | socat STDIO TCP:$(minikube service pico-web-server-service --url | cut -d/ -f3-) # Setup current deployment - name: Checkout current run: | git checkout main # Deploy current version - name: Minikube deploy run: | kubectl apply -f kubernetes/ kubectl rollout status deployment/pico-web-server-deployment - name: Using cluster run: | kubectl get all echo -ne 'demo@/' | socat STDIO TCP:$(minikube service pico-web-server-service --url | cut -d/ -f3-) # End - name: Minikube stop run: | minikube stop