From b2c29f9759dc5cb2623e44aaee9dd7acfac333c4 Mon Sep 17 00:00:00 2001 From: Vito Date: Wed, 8 Jan 2025 07:00:10 +0000 Subject: [PATCH] refactor(ci): Use docker/build-push-action to build docker images Replace the build-docker.sh script with a GitHub action to standardize the ci workflow and reduce complexity. --- .github/scripts/build-docker-alpine.sh | 27 ------ .github/scripts/build-docker.sh | 32 ------- .github/workflows/ci.yml | 120 +++++++++++++++++-------- 3 files changed, 84 insertions(+), 95 deletions(-) delete mode 100755 .github/scripts/build-docker-alpine.sh delete mode 100755 .github/scripts/build-docker.sh diff --git a/.github/scripts/build-docker-alpine.sh b/.github/scripts/build-docker-alpine.sh deleted file mode 100755 index 8aa226ca64..0000000000 --- a/.github/scripts/build-docker-alpine.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/sh - -set -eux - -APK_FILE="$1" -TAG="$2" -ARCHITECTURE="$3" - -docker build \ - --pull \ - --no-cache \ - --provenance false \ - --build-arg "APK_FILE=$APK_FILE" \ - --file .github/docker/alpine.dockerfile \ - --tag "savonet/liquidsoap-ci-build:${TAG}_alpine_${ARCHITECTURE}" \ - . - -if [ "${PUBLISH_DOCKER_IMAGE}" != "true" ]; then - exit 0 -fi - -docker tag \ - "savonet/liquidsoap-ci-build:${TAG}_alpine_${ARCHITECTURE}" \ - "ghcr.io/savonet/liquidsoap-ci-build:${TAG}_alpine_${ARCHITECTURE}" - -docker push "savonet/liquidsoap-ci-build:${TAG}_alpine_${ARCHITECTURE}" -docker push "ghcr.io/savonet/liquidsoap-ci-build:${TAG}_alpine_${ARCHITECTURE}" diff --git a/.github/scripts/build-docker.sh b/.github/scripts/build-docker.sh deleted file mode 100755 index fe985c2a81..0000000000 --- a/.github/scripts/build-docker.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/sh - -set -eux - -DEB_FILE="$1" -DEB_DEBUG_FILE="$2" -TAG="$3" -ARCHITECTURE="$4" - -docker build \ - --pull \ - --no-cache \ - --provenance false \ - --build-arg "DEB_FILE=$DEB_FILE" \ - --build-arg "DEB_DEBUG_FILE=$DEB_DEBUG_FILE" \ - --file .github/docker/debian.dockerfile \ - --tag "savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" \ - . - - -docker tag \ - "savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" \ - "ghcr.io/savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" -docker push "ghcr.io/savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" - -if [ "${PUBLISH_DOCKER_IMAGE}" != "true" ]; then - exit 0 -fi - - -docker push "savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" -#docker push "ghcr.io/savonet/liquidsoap-ci-build:${TAG}_${ARCHITECTURE}" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c86eba9933..31a802e830 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -645,21 +645,28 @@ jobs: username: ${{ secrets.DOCKERHUB_USER }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Login to GitHub Container Registry - # if: needs.build_details.outputs.publish_docker_image == 'true' + if: needs.build_details.outputs.publish_docker_image == 'true' uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build docker image - env: - PUBLISH_DOCKER_IMAGE: ${{ needs.build_details.outputs.publish_docker_image }} - run: .github/scripts/build-docker.sh "${{ steps.debian_package.outputs.deb-file }}" "${{ steps.debian_debug_package.outputs.deb-file }}" "${{ needs.build_details.outputs.branch }}" "${{ matrix.platform }}" + - name: Build and push docker image + uses: docker/build-push-action@v6 + with: + build-args: | + "DEB_FILE=${{ steps.debian_package.outputs.deb-file }}" + "DEB_DEBUG_FILE=${{ steps.debian_debug_package.outputs.deb-file }}" + context: . + file: .github/docker/debian.dockerfile + tags: | + "savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}_${{ matrix.platform }}" + "ghcr.io/savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}_${{ matrix.platform }}" + push: ${{ needs.build_details.outputs.publish_docker_image }} build_docker_alpine: runs-on: ${{ matrix.runs-on }} needs: [build_details, build_posix, fetch_s3_artifacts] - if: needs.build_details.outputs.is_fork != 'true' strategy: fail-fast: false matrix: @@ -678,15 +685,30 @@ jobs: run: | echo "apk-file=$(find artifacts/${{ needs.build_details.outputs.sha }} -type f | grep -v minimal | grep 'apk$' | grep -v dbg | grep ${{ matrix.alpine-arch }})" >> "${GITHUB_OUTPUT}" id: alpine_package - - name: Log in to container registries + - name: Login to Docker Hub if: needs.build_details.outputs.publish_docker_image == 'true' - run: | - echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USER }}" --password-stdin - echo "${{ secrets.GITHUB_TOKEN }}" | docker login -u "${{ github.actor }}" --password-stdin ghcr.io - - name: Build docker image - env: - PUBLISH_DOCKER_IMAGE: ${{ needs.build_details.outputs.publish_docker_image }} - run: .github/scripts/build-docker-alpine.sh "${{ steps.alpine_package.outputs.apk-file }}" "${{ needs.build_details.outputs.branch }}" "${{ matrix.platform }}" + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Login to GitHub Container Registry + if: needs.build_details.outputs.publish_docker_image == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push docker image + uses: docker/build-push-action@v6 + with: + build-args: | + "APK_FILE=${{ steps.alpine_package.outputs.apk-file }}" + context: . + file: .github/docker/alpine.dockerfile + tags: | + "savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}_alpine_${{ matrix.platform }}" + "ghcr.io/savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}_alpine_${{ matrix.platform }}" + push: ${{ needs.build_details.outputs.publish_docker_image }} build_docker_minimal: runs-on: ${{ matrix.runs-on }} @@ -713,20 +735,35 @@ jobs: run: | echo "deb-file=$(find artifacts/${{ needs.build_details.outputs.sha }} -type f | grep ${{ matrix.docker-debian-os }} | grep minimal | grep '${{ matrix.platform }}\.deb$' | grep dbgsym | grep deb)" >> "${GITHUB_OUTPUT}" id: debian_debug_package - - name: Log in to container registries + - name: Login to Docker Hub if: needs.build_details.outputs.publish_docker_image == 'true' - run: | - echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USER }}" --password-stdin - echo "${{ secrets.GITHUB_TOKEN }}" | docker login -u "${{ github.actor }}" --password-stdin ghcr.io - - name: Build docker image - env: - PUBLISH_DOCKER_IMAGE: ${{ needs.build_details.outputs.publish_docker_image }} - run: .github/scripts/build-docker.sh "${{ steps.debian_package.outputs.deb-file }}" "${{ steps.debian_debug_package.outputs.deb-file }}" "${{ needs.build_details.outputs.branch }}-minimal" "${{ matrix.platform }}" + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Login to GitHub Container Registry + if: needs.build_details.outputs.publish_docker_image == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push docker image + uses: docker/build-push-action@v6 + with: + build-args: | + "DEB_FILE=${{ steps.debian_package.outputs.deb-file }}" + "DEB_DEBUG_FILE=${{ steps.debian_debug_package.outputs.deb-file }}" + context: . + file: .github/docker/debian.dockerfile + tags: | + "savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}-minimal_${{ matrix.platform }}" + "ghcr.io/savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}-minimal_${{ matrix.platform }}" + push: ${{ needs.build_details.outputs.publish_docker_image }} build_docker_alpine_minimal: runs-on: ${{ matrix.runs-on }} - needs: [build_details, run_tests, build_posix, fetch_s3_artifacts] - if: needs.build_details.outputs.is_fork != 'true' + needs: [build_details, build_posix, fetch_s3_artifacts] strategy: fail-fast: false matrix: @@ -745,19 +782,30 @@ jobs: run: | echo "apk-file=$(find artifacts/${{ needs.build_details.outputs.sha }} -type f | grep minimal | grep 'apk$' | grep -v dbg | grep ${{ matrix.alpine-arch }})" >> "${GITHUB_OUTPUT}" id: alpine_package - - name: Get alpine debug package - run: | - echo "apk-file=$(find artifacts/${{ needs.build_details.outputs.sha }} -type f | grep minimal | grep 'apk$' | grep dbg | grep ${{ matrix.alpine-arch }})" >> "${GITHUB_OUTPUT}" - id: alpine_dbg_package - - name: Log in to container registries + - name: Login to Docker Hub if: needs.build_details.outputs.publish_docker_image == 'true' - run: | - echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USER }}" --password-stdin - echo "${{ secrets.GITHUB_TOKEN }}" | docker login -u "${{ github.actor }}" --password-stdin ghcr.io - - name: Build docker image - env: - PUBLISH_DOCKER_IMAGE: ${{ needs.build_details.outputs.publish_docker_image }} - run: .github/scripts/build-docker-alpine.sh "${{ steps.alpine_package.outputs.apk-file }}" "${{ steps.alpine_dbg_package.outputs.apk-file }}" "${{ needs.build_details.outputs.branch }}-minimal" "${{ matrix.platform }}" + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USER }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + - name: Login to GitHub Container Registry + if: needs.build_details.outputs.publish_docker_image == 'true' + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build and push docker image + uses: docker/build-push-action@v6 + with: + build-args: | + "APK_FILE=${{ steps.alpine_package.outputs.apk-file }}" + context: . + file: .github/docker/alpine.dockerfile + tags: | + "savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}-minimal_alpine_${{ matrix.platform }}" + "ghcr.io/savonet/liquidsoap-ci-build:${{ needs.build_details.outputs.branch }}-minimal_alpine_${{ matrix.platform }}" + push: ${{ needs.build_details.outputs.publish_docker_image }} build_docker_release: runs-on: ubuntu-latest