diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 7f9785d09..bb006fcbc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -43,73 +43,124 @@ concurrency: permissions: # added using https://github.com/step-security/secure-workflows contents: read -jobs: +env: + DOCKERHUB_REPO: openthread/environment - buildx: - name: buildx-${{ matrix.docker_name }}-${{ matrix.arch }} - runs-on: ${{ matrix.runner }} +jobs: + build: strategy: fail-fast: false matrix: include: - - docker_name: environment - arch: amd64 + - platform: linux/amd64 runner: ubuntu-24.04 - - docker_name: environment - arch: arm64 + - platform: linux/arm64 runner: ubuntu-24.04-arm + + runs-on: ${{ matrix.runner }} + steps: - - name: Harden Runner - uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 - with: - egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs + - name: Harden Runner + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 + with: + egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - name: Free Disk Space (Ubuntu) - uses: jlumbroso/free-disk-space@main + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + with: + submodules: true - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - with: - submodules: true + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV - - name: Prepare - id: prepare - run: | - DOCKER_IMAGE=openthread/${{ matrix.docker_name }} - DOCKER_FILE=etc/docker/${{ matrix.docker_name }}/Dockerfile - DOCKER_PLATFORMS=linux/${{ matrix.arch }} - VERSION=latest + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.DOCKERHUB_REPO }} - TAGS="--tag ${DOCKER_IMAGE}:${VERSION}" + - name: Login to Docker Hub + if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} - echo "docker_image=${DOCKER_IMAGE}" >> $GITHUB_OUTPUT - echo "version=${VERSION}" >> $GITHUB_OUTPUT - echo "buildx_args=--platform ${DOCKER_PLATFORMS} \ - --build-arg OT_GIT_REF=${{ github.sha }} \ - --build-arg VERSION=${VERSION} \ - --build-arg BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ') \ - --build-arg VCS_REF=${GITHUB_SHA::8} \ - ${TAGS} --file ${DOCKER_FILE} ." >> $GITHUB_OUTPUT + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + - name: Build and push by digest + if: success() + id: build + uses: docker/build-push-action@v6 + with: + file: etc/docker/environment/Dockerfile + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + outputs: type=image,"name=${{ env.DOCKERHUB_REPO }}",push-by-digest=true,name-canonical=true + push: ${{ github.repository == 'openthread/openthread' && github.event_name != 'pull_request' }} - - name: Docker Buildx (build) - run: | - docker buildx build --output "type=image,push=false" ${{ steps.prepare.outputs.buildx_args }} + - name: Export digest + if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" - - name: Login to DockerHub - if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_PASSWORD }} + - name: Upload digest + if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 - - name: Docker Buildx (push) - if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' - run: | - docker buildx build --output "type=image,push=true" ${{ steps.prepare.outputs.buildx_args }} + merge: + if: success() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Harden Runner + uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2 + with: + egress-policy: audit # TODO: change to 'egress-policy: block' after couple of runs - - name: Inspect Image - if: always() && github.repository == 'openthread/openthread' && github.event_name != 'pull_request' - run: | - docker buildx imagetools inspect ${{ steps.prepare.outputs.docker_image }}:${{ steps.prepare.outputs.version }} + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + + - name: Login to Docker Hub + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.DOCKERHUB_REPO }} + tags: | + type=ref,event=branch + type=raw,value=latest,enable={{is_default_branch}} + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf '${{ env.DOCKERHUB_REPO }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.DOCKERHUB_REPO }}:${{ steps.meta.outputs.version }}