| on: |
| push: |
| branches: |
| - main |
| - "release/**" |
| tags: |
| - "v*" # Push events to matching v*, i.e. v1.0, v20.15.10 |
| pull_request: |
| branches: |
| - main |
| - "release/**" |
| |
| name: Release |
| |
| env: |
| GO_VERSION: "1.24.9" |
| |
| permissions: # added using https://github.com/step-security/secure-workflows |
| contents: read |
| |
| jobs: |
| check: |
| name: Check Signed Tag |
| if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') |
| runs-on: ubuntu-latest |
| timeout-minutes: 5 |
| outputs: |
| stringver: ${{ steps.contentrel.outputs.stringver }} |
| |
| steps: |
| - name: Checkout code |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 |
| with: |
| ref: ${{ github.ref }} |
| path: src/github.com/containerd/containerd |
| |
| - name: Check signature |
| run: | |
| # git tag -v requires an allowedSignersFile to be configured and exist for ssh signature verification |
| touch ${{ runner.temp }}/empty-allowedSignersFile |
| git config --global gpg.ssh.allowedSignersFile ${{ runner.temp }}/empty-allowedSignersFile |
| releasever=${{ github.ref }} |
| releasever="${releasever#refs/tags/}" |
| TAGCHECK=$(git tag -v ${releasever} 2>&1 >/dev/null) || |
| echo "${TAGCHECK}" | grep -q "error" && { |
| echo "::error::tag ${releasever} is not a signed tag. Failing release process." |
| exit 1 |
| } || { |
| echo "Tag ${releasever} is signed." |
| exit 0 |
| } |
| working-directory: src/github.com/containerd/containerd |
| |
| - name: Release content |
| id: contentrel |
| run: | |
| RELEASEVER=${{ github.ref }} |
| echo "stringver=${RELEASEVER#refs/tags/v}" >> $GITHUB_OUTPUT |
| git tag -l ${RELEASEVER#refs/tags/} -n20000 | tail -n +3 | cut -c 5- >release-notes.md |
| working-directory: src/github.com/containerd/containerd |
| |
| - name: Save release notes |
| uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 |
| with: |
| name: containerd-release-notes |
| path: src/github.com/containerd/containerd/release-notes.md |
| |
| build: |
| name: Build Release Binaries |
| runs-on: ubuntu-latest |
| timeout-minutes: 30 |
| strategy: |
| matrix: |
| include: |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: linux/amd64 |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: linux/arm64 |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: linux/ppc64le |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: linux/s390x |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: linux/riscv64 |
| - dockerfile-ubuntu: 22.04 |
| dockerfile-platform: windows/amd64 |
| steps: |
| - name: Set RELEASE_VER |
| if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') |
| shell: bash |
| run: | |
| releasever=${{ github.ref }} |
| releasever="${releasever#refs/tags/}" |
| echo "RELEASE_VER=${releasever}" >> $GITHUB_ENV |
| - name: Checkout containerd |
| uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0 |
| with: |
| # Intentionally use github.repository instead of containerd/containerd to |
| # make this action runnable on forks. |
| # See https://github.com/containerd/containerd/issues/5098 for the context. |
| repository: ${{ github.repository }} |
| ref: ${{ github.ref }} |
| path: src/github.com/containerd/containerd |
| |
| - name: Setup buildx instance |
| uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1 |
| with: |
| use: true |
| - uses: crazy-max/ghaction-github-runtime@3cb05d89e1f492524af3d41a1c98c83bc3025124 # v3.1.0 |
| - name: Make |
| shell: bash |
| run: | |
| cache="--cache-from=type=gha,scope=containerd-release --cache-to=type=gha,scope=containerd-release" |
| if [[ "${PLATFORM}" =~ "windows" ]]; then |
| # For Windows the cni build script generates a config but shells out to powershell (and also assume it is running on windows) to get a gateway and subnet. |
| # The values provided here are taken from packages that we previously generated. |
| export GATEWAY=172.21.16.1 |
| export PREFIX_LEN=12 |
| BUILD_ARGS="--build-arg GATEWAY --build-arg PREFIX_LEN" |
| fi |
| docker buildx build ${cache} --build-arg RELEASE_VER --build-arg UBUNTU_VERSION=${{ matrix.dockerfile-ubuntu }} --build-arg GO_VERSION ${BUILD_ARGS} -f .github/workflows/release/Dockerfile --platform=${PLATFORM} -o releases/ . |
| echo PLATFORM_CLEAN=${PLATFORM/\//-} >> $GITHUB_ENV |
| |
| # Remove symlinks since we don't want these in the release Artifacts (if any) |
| find ./releases/ -maxdepth 1 -type l | xargs rm -f |
| working-directory: src/github.com/containerd/containerd |
| env: |
| PLATFORM: ${{ matrix.dockerfile-platform }} |
| - name: Save Artifacts |
| uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0 |
| with: |
| name: release-tars-${{env.PLATFORM_CLEAN}} |
| path: src/github.com/containerd/containerd/releases/*.tar.gz* |
| |
| release: |
| name: Create containerd Release |
| if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v') |
| permissions: |
| contents: write |
| id-token: write |
| attestations: write |
| runs-on: ubuntu-latest |
| timeout-minutes: 10 |
| needs: [build, check] |
| steps: |
| - name: Download builds and release notes |
| uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0 |
| with: |
| path: builds |
| - name: Attest Artifacts |
| id: attest |
| uses: actions/attest-build-provenance@977bb373ede98d70efdf65b84cb5f73e068dcc2a # v3.0.0 |
| with: |
| subject-path: ./builds/release-tars-**/*.tar.gz |
| - name: Rename attestation artifact |
| run: mv ${{ steps.attest.outputs.bundle-path }} containerd-${{ needs.check.outputs.stringver }}-attestation.intoto.jsonl |
| - name: Create Release |
| uses: softprops/action-gh-release@6da8fa9354ddfdc4aeace5fc48d7f679b5214090 # v2.4.1 |
| with: |
| token: ${{ secrets.GITHUB_TOKEN }} |
| fail_on_unmatched_files: true |
| name: containerd ${{ needs.check.outputs.stringver }} |
| draft: false |
| prerelease: ${{ contains(github.ref, 'beta') || contains(github.ref, 'rc') }} |
| body_path: ./builds/containerd-release-notes/release-notes.md |
| files: | |
| builds/release-tars-**/* |
| containerd-*-attestation.intoto.jsonl |
| make_latest: true |