name: build # Default to 'contents: read', which grants actions to read commits. # # If any permission is set, any permission not included in the list is # implicitly set to "none". # # see https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: VERSION: ${{ github.ref }} on: workflow_dispatch: push: branches: - 'master' - '[0-9]+.[0-9]+' tags: - 'v*' pull_request: jobs: prepare: runs-on: ubuntu-24.04 outputs: matrix: ${{ steps.platforms.outputs.matrix }} steps: - name: Checkout uses: actions/checkout@v4 - name: Create matrix id: platforms run: | echo "matrix=$(docker buildx bake cross --print | jq -cr '.target."cross".platforms')" >>${GITHUB_OUTPUT} - name: Show matrix run: | echo ${{ steps.platforms.outputs.matrix }} build: runs-on: ubuntu-24.04 needs: - prepare strategy: fail-fast: false matrix: target: - binary - dynbinary platform: ${{ fromJson(needs.prepare.outputs.matrix) }} use_glibc: - "" - glibc steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build uses: docker/bake-action@v5 with: targets: ${{ matrix.target }} set: | *.platform=${{ matrix.platform }} env: USE_GLIBC: ${{ matrix.use_glibc }} - name: Create tarball working-directory: ./build run: | mkdir /tmp/out platform=${{ matrix.platform }} platformPair=${platform//\//-} tar -cvzf "/tmp/out/docker-${platformPair}.tar.gz" . if [ -z "${{ matrix.use_glibc }}" ]; then echo "ARTIFACT_NAME=${{ matrix.target }}-${platformPair}" >> $GITHUB_ENV else echo "ARTIFACT_NAME=${{ matrix.target }}-${platformPair}-glibc" >> $GITHUB_ENV fi - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} path: /tmp/out/* if-no-files-found: error bin-image: runs-on: ubuntu-24.04 if: ${{ github.event_name != 'pull_request' && github.repository == 'docker/cli' }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Docker meta id: meta uses: docker/metadata-action@v5 with: images: dockereng/cli-bin tags: | type=semver,pattern={{version}} type=ref,event=branch type=ref,event=pr type=sha - name: Login to DockerHub if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_CLIBIN_USERNAME }} password: ${{ secrets.DOCKERHUB_CLIBIN_TOKEN }} - name: Build and push image uses: docker/bake-action@v5 with: files: | ./docker-bake.hcl ${{ steps.meta.outputs.bake-file }} targets: bin-image-cross push: ${{ github.event_name != 'pull_request' }} set: | *.cache-from=type=gha,scope=bin-image *.cache-to=type=gha,scope=bin-image,mode=max prepare-plugins: runs-on: ubuntu-24.04 outputs: matrix: ${{ steps.platforms.outputs.matrix }} steps: - name: Checkout uses: actions/checkout@v4 - name: Create matrix id: platforms run: | echo "matrix=$(docker buildx bake plugins-cross --print | jq -cr '.target."plugins-cross".platforms')" >>${GITHUB_OUTPUT} - name: Show matrix run: | echo ${{ steps.platforms.outputs.matrix }} plugins: runs-on: ubuntu-24.04 needs: - prepare-plugins strategy: fail-fast: false matrix: platform: ${{ fromJson(needs.prepare-plugins.outputs.matrix) }} steps: - name: Checkout uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build uses: docker/bake-action@v5 with: targets: plugins-cross set: | *.platform=${{ matrix.platform }}