diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 42f82f4a245a..c8d9a8eb89e7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,71 +1,68 @@ 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 + contents: write concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true -env: - VERSION: ${{ github.ref }} - on: workflow_dispatch: - push: - branches: - - 'master' - - '[0-9]+.[0-9]+' - - '[0-9]+.x' - tags: - - 'v*' - pull_request: + inputs: + build_target: + description: "Select build target" + required: true + type: choice + default: windows + options: + - all + - binary + - dynbinary + - windows + - windows-docker + - windows-git-bash jobs: + + # ========================= + # PREPARE (unchanged) + # ========================= prepare: + if: ${{ github.event.inputs.build_target != 'windows' && github.event.inputs.build_target != 'windows-docker' }} runs-on: ubuntu-24.04 outputs: matrix: ${{ steps.platforms.outputs.matrix }} steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v6 - - - name: Create matrix + + - 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 }} + # ========================= + # LINUX BUILD + # ========================= build: + if: ${{ github.event.inputs.build_target != 'windows' && github.event.inputs.build_target != 'windows-docker' }} runs-on: ubuntu-24.04 - needs: - - prepare + needs: prepare strategy: fail-fast: false matrix: - target: - - binary - - dynbinary + target: ${{ github.event.inputs.build_target == 'all' && fromJson('["binary","dynbinary"]') || fromJson(format('["{0}"]', github.event.inputs.build_target)) }} platform: ${{ fromJson(needs.prepare.outputs.matrix) }} use_glibc: - "" - glibc + steps: - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - - name: Build + + - name: Build uses: docker/bake-action@v6 with: targets: ${{ matrix.target }} @@ -73,103 +70,202 @@ jobs: *.platform=${{ matrix.platform }} env: USE_GLIBC: ${{ matrix.use_glibc }} - - - name: Create tarball + + - name: Package working-directory: ./build run: | - mkdir /tmp/out + mkdir -p /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 + tar -czf "/tmp/out/docker-${platformPair}.tar.gz" . + + - name: Upload artifact uses: actions/upload-artifact@v6 with: - name: ${{ env.ARTIFACT_NAME }} + name: docker-${{ matrix.platform }} 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: 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: 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=semver,pattern={{major}} - type=semver,pattern={{major}}.{{minor}} - - - name: Build and push image - uses: docker/bake-action@v6 - with: - files: | - ./docker-bake.hcl - cwd://${{ 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 + # ========================= + # PLUGINS + # ========================= prepare-plugins: + if: ${{ github.event.inputs.build_target != 'windows' && github.event.inputs.build_target != 'windows-docker' }} runs-on: ubuntu-24.04 outputs: matrix: ${{ steps.platforms.outputs.matrix }} steps: - - - name: Checkout + - name: Checkout uses: actions/checkout@v6 - - - name: Create matrix + + - 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: + if: ${{ github.event.inputs.build_target != 'windows' && github.event.inputs.build_target != 'windows-docker' }} runs-on: ubuntu-24.04 - needs: - - prepare-plugins + needs: prepare-plugins strategy: fail-fast: false matrix: platform: ${{ fromJson(needs.prepare-plugins.outputs.matrix) }} steps: - - - name: Set up Docker Buildx + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - - name: Build + + - name: Build uses: docker/bake-action@v6 with: targets: plugins-cross set: | *.platform=${{ matrix.platform }} + + windows-native: + if: ${{ github.event.inputs.build_target == 'windows' || github.event.inputs.build_target == 'all' }} + runs-on: windows-2022 + + env: + VERSION: 29.2.1 + + steps: + - name: Set up GOPATH + run: | + $env:GOPATH = "$env:USERPROFILE\go" + echo "GOPATH=$env:GOPATH" >> $env:GITHUB_ENV + + - name: Clone repo into GOPATH + run: | + $gopath = $env:GOPATH + $dest = Join-Path $gopath "src\github.com\docker" + New-Item -ItemType Directory -Path $dest -Force + git clone https://github.com/docker/cli.git (Join-Path $dest "cli") + shell: pwsh + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: 1.24 + + - name: Build Windows CLI + run: | + $env:GOPATH = "$env:USERPROFILE\go" + $env:GO111MODULE = "off" + $cliRoot = Join-Path $env:GOPATH "src\github.com\docker\cli" + Set-Location $cliRoot + go build -trimpath ` + -ldflags "-s -w ` + -X github.com/docker/cli/cli/version.Version=29.2.1.bravura-1 ` + -X github.com/docker/cli/cli/version.GitCommit=73fb37341bd10886885873244bdf6e5c486a5267 ` + -X github.com/docker/cli/cli/version.BuildTime=2026-02-16T13:44:00Z" ` + -o "docker.exe" ./cmd/docker + $versioned = "docker-v29.2.1.bravura-1.exe" + Copy-Item "docker.exe" $versioned -Force + $files = Get-ChildItem -Path . -Filter "docker*.exe" -Recurse | Select-Object -ExpandProperty FullName + Write-Host "Found Docker executables: " + $files | ForEach-Object { Write-Host $_ } + shell: pwsh + + - name: Upload Windows exe artifact + uses: actions/upload-artifact@v6 + with: + name: docker-windows-amd64 + path: | + C:\Users\runneradmin\go\src\github.com\docker\cli\docker-v29.2.1.bravura-1.exe + C:\Users\runneradmin\go\src\github.com\docker\cli\docker.exe + + - name: Create GitHub Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: v${{ env.VERSION }} + release_name: Docker CLI ${{ env.VERSION }} + draft: false + prerelease: false + body: "Automated build of Docker CLI ${{ env.VERSION }}" + + - name: Upload release assets + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: C:\Users\runneradmin\go\src\github.com\docker\cli\docker.exe + asset_name: docker.exe + asset_content_type: application/octet-stream + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload versioned release asset + uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: C:\Users\runneradmin\go\src\github.com\docker\cli\docker-v29.2.1.bravura-1.exe + asset_name: docker-v${{ env.VERSION }}.bravura-1.exe + asset_content_type: application/octet-stream + token: ${{ secrets.GITHUB_TOKEN }} + + windows-git-bash: + if: ${{ github.event.inputs.build_target == 'windows-git-bash' || github.event.inputs.build_target == 'all' }} + runs-on: windows-2022 + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install Git for Windows + shell: pwsh + run: | + choco install git --version 2.53.0 -y + $gitBash = "C:\Program Files\Git\bin" + echo "$gitBash" >> $env:GITHUB_PATH + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version: 1.24 + + - name: Build Windows CLI using Git Bash + shell: bash + run: | + chmod +x scripts/build/binary + ./scripts/build/binary + + - name: Upload Windows exe artifacts + shell: pwsh + run: | + $files = Get-ChildItem -Path ./ -Filter "docker*.exe" -Recurse | Select-Object -ExpandProperty FullName + echo "Uploading files: $files" + echo $files >> $GITHUB_ENV + + - uses: actions/upload-artifact@v6 + with: + name: docker-windows-git-bash + path: ${{ env.files }} + + windows-docker: + if: ${{ github.event.inputs.build_target == 'windows-docker' || github.event.inputs.build_target == 'all' }} + runs-on: windows-2022 + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Windows Docker CLI + run: | + docker buildx bake cross --set "*.platform=windows/amd64" + + - name: List built binaries + run: docker run --rm dir C:\path\to\output # adjust path if needed + + - name: Upload Windows Docker artifacts + uses: actions/upload-artifact@v6 + with: + name: docker-windows-docker + path: ./build/* # adjust to match your Docker output