diff --git a/.github/workflows/build-push-container-images-rhbq-3.2.yml b/.github/workflows/build-push-container-images-rhbq-3.2.yml new file mode 100644 index 000000000..ad2dbe71b --- /dev/null +++ b/.github/workflows/build-push-container-images-rhbq-3.2.yml @@ -0,0 +1,343 @@ +name: Build and Push Container images - RHBQ 3.2 + +env: + IMAGE_BASE_NAME: "quay.io/quarkus-super-heroes" + MANDREL_IMAGE: "quay.io/quarkus/ubi-quarkus-mandrel-builder-image" + MANDREL_VERSION: "23.0" + LATEST_IMAGE_TAG: "latest" + BRANCH: rhbq-3.2 + +on: + workflow_run: + workflows: + - "Basic build and test" + branches: + - rhbq-3.2 + types: + - completed + workflow_dispatch: + +concurrency: + group: "workflow = ${{ github.workflow }}, ref = ${{ github.event.workflow_run.head_branch || github.event.ref || github.ref }}" + cancel-in-progress: false + +jobs: + build-jvm-images: + if: ((github.event_name == 'workflow_dispatch') || ((github.event_name == 'workflow_run') && ((github.event.workflow_run.event == 'push') || (github.event.workflow_run.event == 'workflow_dispatch')) && (github.event.workflow_run.conclusion == 'success'))) && ((github.repository == 'quarkusio/quarkus-super-heroes') && ((github.event.workflow_run.head_branch == 'rhbq-3.2'))) + runs-on: ubuntu-latest + strategy: + matrix: + java: + - '17' + project: + - event-statistics + - rest-fights + - rest-heroes + - rest-villains + - ui-super-heroes + arch: + - amd64 + - arm64 + name: "Build JVM images (${{ matrix.arch }}-${{ matrix.project }}-java${{ matrix.java }})" + steps: + - name: Calculate Ref (workflow_run event) + if: github.event_name == 'workflow_run' + run: echo "REF=${{ github.event.workflow_run.head_commit.id }}" >> $GITHUB_ENV + + - name: Calculate Ref (workflow_dispatch event) + if: github.event_name == 'workflow_dispatch' + run: echo "REF=${{ github.sha }}" >> $GITHUB_ENV + + - name: Checkout from ${{ env.REF }} + uses: actions/checkout@v4 + with: + ref: ${{ env.REF }} + + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + + - name: Create env vars + working-directory: ${{ matrix.project }} + run: | + if [[ ${{ matrix.java }} == '17' ]]; then + echo "JVM_DOCKERFILE=Dockerfile.jvm" >> "$GITHUB_ENV" + else + echo "JVM_DOCKERFILE=Dockerfile.jvm${{ matrix.java }}" >> "$GITHUB_ENV" + fi + + - name: Create container tags + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=java${{ matrix.java }}-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}-${{ matrix.arch }}" >> $GITHUB_ENV + + - name: Set up QEMU + if: matrix.arch == 'arm64' + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ matrix.arch }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + + - name: Build JVM image (${{ matrix.project }}-java${{ matrix.java }}-${{ matrix.arch }}) + working-directory: ${{ matrix.project }} + run: | + ./mvnw -B clean package -DskipTests \ + -Dmaven.compiler.release=${{ matrix.java }} \ + -Dquarkus.http.host=0.0.0.0 \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=false \ + -Dquarkus.container-image.tag=${{ env.CONTAINER_TAG }} \ + -Dquarkus.docker.dockerfile-jvm-path=src/main/docker/${{ env.JVM_DOCKERFILE }} \ + -Dquarkus.docker.buildx.platform=linux/${{ matrix.arch }} + + - name: Save JVM Image (${{ matrix.project }}-java${{ matrix.java }}-${{ matrix.arch }}) + uses: ishworkh/docker-image-artifact-upload@v1 + with: + image: "${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }}" + + build-native-images: + if: ((github.event_name == 'workflow_dispatch') || ((github.event_name == 'workflow_run') && ((github.event.workflow_run.event == 'push') || (github.event.workflow_run.event == 'workflow_dispatch')) && (github.event.workflow_run.conclusion == 'success'))) && ((github.repository == 'quarkusio/quarkus-super-heroes') && ((github.event.workflow_run.head_branch == 'rhbq-3.2'))) + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + java: + - '17' + project: + - event-statistics + - rest-fights + - rest-heroes + - rest-villains + - ui-super-heroes + arch: + - amd64 + - arm64 + name: "Build Native images (${{ matrix.arch }}-${{ matrix.project }}-java${{ matrix.java }})" + steps: + - name: Calculate Ref (workflow_run event) + if: github.event_name == 'workflow_run' + run: echo "REF=${{ github.event.workflow_run.head_commit.id }}" >> $GITHUB_ENV + + - name: Calculate Ref (workflow_dispatch event) + if: github.event_name == 'workflow_dispatch' + run: echo "REF=${{ github.sha }}" >> $GITHUB_ENV + + - name: Checkout from ${{ env.REF }} + uses: actions/checkout@v4 + with: + ref: ${{ env.REF }} + + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + + - name: Create container tag + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=native-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}-${{ matrix.arch }}" >> $GITHUB_ENV + + - name: Set up QEMU + if: matrix.arch == 'arm64' + uses: docker/setup-qemu-action@v3 + with: + platforms: ${{ matrix.arch }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + with: + install: true + + - name: Build native image (${{ matrix.project }}-java${{ matrix.java }}-${{ matrix.arch }}) + working-directory: ${{ matrix.project }} + run: | + ./mvnw -B clean package -DskipTests -Pnative \ + -Dmaven.compiler.release=${{ matrix.java }} \ + -Dquarkus.http.host=0.0.0.0 \ + -Dquarkus.native.container-build=true \ + -Dquarkus.native.builder-image=${{ env.MANDREL_IMAGE }}:${{ env.MANDREL_VERSION }}-java${{ matrix.java }} \ + -Dquarkus.native.container-runtime-options=--platform=linux/${{ matrix.arch }} \ + -Dquarkus.container-image.build=true \ + -Dquarkus.container-image.push=false \ + -Dquarkus.container-image.tag=${{ env.CONTAINER_TAG }} \ + -Dquarkus.docker.buildx.platform=linux/${{ matrix.arch }} + + - name: Save native Image (${{ matrix.project }}-java${{ matrix.java }}-${{ matrix.arch }}) + uses: ishworkh/docker-image-artifact-upload@v1 + with: + image: "${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }}" + + push-app-images: + if: ((github.event_name == 'workflow_dispatch') || ((github.event_name == 'workflow_run') && ((github.event.workflow_run.event == 'push') || (github.event.workflow_run.event == 'workflow_dispatch')) && (github.event.workflow_run.conclusion == 'success'))) && ((github.repository == 'quarkusio/quarkus-super-heroes') && ((github.event.workflow_run.head_branch == 'rhbq-3.2'))) + needs: + - build-jvm-images + - build-native-images + runs-on: ubuntu-latest + strategy: + matrix: + java: + - '17' + kind: + - "" + - "native-" + project: + - event-statistics + - rest-fights + - rest-heroes + - rest-villains + - ui-super-heroes + arch: + - amd64 + - arm64 + name: "Push app images (${{ matrix.arch }}-${{ matrix.project }}-${{ matrix.kind }}java${{ matrix.java }})" + steps: + - name: Calculate Ref (workflow_run event) + if: github.event_name == 'workflow_run' + run: echo "REF=${{ github.event.workflow_run.head_commit.id }}" >> $GITHUB_ENV + + - name: Calculate Ref (workflow_dispatch event) + if: github.event_name == 'workflow_dispatch' + run: echo "REF=${{ github.sha }}" >> $GITHUB_ENV + + - name: Checkout from ${{ env.REF }} + uses: actions/checkout@v4 + with: + ref: ${{ env.REF }} + + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + + - name: Create container tag (JVM) + if: matrix.kind == '' + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=java${{ matrix.java }}-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}-${{ matrix.arch }}" >> $GITHUB_ENV + + - name: Create container tag (native) + if: matrix.kind == 'native-' + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=native-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}-${{ matrix.arch }}" >> $GITHUB_ENV + + - name: Get saved images (${{ matrix.project }}:${{ env.CONTAINER_TAG }}) + uses: ishworkh/docker-image-artifact-download@v1 + with: + image: "${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }}" + + - name: Login to quay + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_REPO_USERNAME }} + password: ${{ secrets.QUAY_REPO_TOKEN }} + + - name: Push images + working-directory: ${{ matrix.project }} + run: "docker push -a ${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}" + + create-app-multiarch-manifests: + if: ((github.event_name == 'workflow_dispatch') || ((github.event_name == 'workflow_run') && ((github.event.workflow_run.event == 'push') || (github.event.workflow_run.event == 'workflow_dispatch')) && (github.event.workflow_run.conclusion == 'success'))) && ((github.repository == 'quarkusio/quarkus-super-heroes') && ((github.event.workflow_run.head_branch == 'rhbq-3.2'))) + needs: push-app-images + runs-on: ubuntu-latest + strategy: + matrix: + java: + - '17' + kind: + - "" + - "native-" + project: + - event-statistics + - rest-fights + - rest-heroes + - rest-villains + - ui-super-heroes + name: Create app multiarch manifests (${{ matrix.project }}-${{ matrix.kind }}java${{ matrix.java }}) + steps: + - name: Calculate Ref (workflow_run event) + if: github.event_name == 'workflow_run' + run: echo "REF=${{ github.event.workflow_run.head_commit.id }}" >> $GITHUB_ENV + + - name: Calculate Ref (workflow_dispatch event) + if: github.event_name == 'workflow_dispatch' + run: echo "REF=${{ github.sha }}" >> $GITHUB_ENV + + - name: Checkout from ${{ env.REF }} + uses: actions/checkout@v4 + with: + ref: ${{ env.REF }} + + - name: Setup Java + uses: actions/setup-java@v3 + with: + java-version: ${{ matrix.java }} + distribution: temurin + cache: maven + + - name: Create container tag (JVM) + if: matrix.kind == '' + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=java${{ matrix.java }}-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}" >> $GITHUB_ENV + + - name: Create container tag (native) + if: matrix.kind == 'native-' + working-directory: ${{ matrix.project }} + run: echo "CONTAINER_TAG=native-${{ env.LATEST_IMAGE_TAG }}-${{ env.BRANCH }}" >> $GITHUB_ENV + + - name: Login to quay + uses: docker/login-action@v3 + with: + registry: quay.io + username: ${{ secrets.QUAY_REPO_USERNAME }} + password: ${{ secrets.QUAY_REPO_TOKEN }} + + - name: Create and push multi-arch JVM manifests + shell: bash + run: | + docker manifest create ${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }} \ + -a ${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }}-amd64 \ + -a ${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }}-arm64 + docker manifest push ${{ env.IMAGE_BASE_NAME }}/${{ matrix.project }}:${{ env.CONTAINER_TAG }} + + deploy-resources-workflow-run: + if: ((github.event_name == 'workflow_run') && ((github.event.workflow_run.event == 'push') || (github.event.workflow_run.event == 'workflow_dispatch')) && (github.event.workflow_run.conclusion == 'success') && (github.repository == 'quarkusio/quarkus-super-heroes')) && ((github.event.workflow_run.head_branch == 'rhbq-3.2')) + needs: + - create-app-multiarch-manifests + uses: quarkusio/quarkus-super-heroes/.github/workflows/create-deploy-resources.yml@main + secrets: inherit + with: + commit_id: ${{ github.event.workflow_run.head_commit.id }} + branch: ${{ github.event.workflow_run.head_branch }} + + deploy-resources-workflow-dispatch: + if: ((github.event_name == 'workflow_dispatch') && (github.repository == 'quarkusio/quarkus-super-heroes')) && ((github.ref_name == 'rhbq-3.2')) + needs: + - create-app-multiarch-manifests + uses: quarkusio/quarkus-super-heroes/.github/workflows/create-deploy-resources.yml@main + secrets: inherit + with: + commit_id: ${{ github.sha }} + branch: ${{ github.ref_name }} + + cleanup-artifacts: + needs: + - deploy-resources-workflow-run + - deploy-resources-workflow-dispatch + if: always() + runs-on: ubuntu-latest + steps: + - name: Delete artifacts + env: + WEBHOOK_SECRET: ${{ secrets.WEBHOOK_SECRET }} + run: | + echo "::add-mask::$WEBHOOK_SECRET" + curl --verbose --fail --show-error --location --request POST "https://api.github.com/repos/$GITHUB_REPOSITORY/dispatches" --header "Authorization: token $WEBHOOK_SECRET" --header 'Content-Type: application/json' --header 'Accept: application/vnd.github.everest-preview+json' --data-raw "{ \"event_type\": \"delete_all_artifacts\", \"client_payload\": {\"parent_runid\": \"$GITHUB_RUN_ID\", \"parent_repo\": \"$GITHUB_REPOSITORY\"} }"