From e7f0c1947e4a7b51e878b1f9ba6e525dfd4209a3 Mon Sep 17 00:00:00 2001 From: Ashley Cui Date: Fri, 19 Apr 2024 09:12:30 -0400 Subject: [PATCH] [CI:DOCS] Build & upload release artifacts with GitHub Actions Add a new GitHub Action that builds and uploads release artifacts. This action is triggered by publishing a release on GitHub. The action will only build if the specfic artifact is missing. This action also triggers the Windows installer action, since the Windows installer action depends on an uploaded artifact. Note that the action runs on ubuntu-22.04 Signed-off-by: Ashley Cui --- .github/workflows/release-artifacts.yml | 179 +++++++++++++++++++++ .github/workflows/upload-win-installer.yml | 2 - 2 files changed, 179 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/release-artifacts.yml diff --git a/.github/workflows/release-artifacts.yml b/.github/workflows/release-artifacts.yml new file mode 100644 index 0000000000..e53cf3165b --- /dev/null +++ b/.github/workflows/release-artifacts.yml @@ -0,0 +1,179 @@ +name: Upload Release Artifacts + +on: + release: + types: [published] + workflow_dispatch: + inputs: + version: + description: 'Release version to build and upload (e.g. "v9.8.7")' + required: true + dryrun: + description: 'Perform all the steps except uploading to the release page' + required: true + default: "true" # 'choice' type requires string value + type: choice + options: + - "true" # Must be quoted string, boolean value not supported. + - "false" + +permissions: + contents: write + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Determine Version + id: getversion + run: | + if [[ -z "${{ inputs.version }}" ]] + then + VERSION=${{ github.event.release.tag_name }} + else + VERSION=${{ inputs.version }} + fi + echo + echo "version=$VERSION" >> $GITHUB_OUTPUT + + - name: Consolidate dryrun setting to always be true or false + id: actual_dryrun + run: | + # The 'release' trigger will not have a 'dryrun' input set. Handle + # this case in a readable/maintainable way. + if [[ -z "${{ inputs.dryrun }}" ]] + then + echo "dryrun=false" >> $GITHUB_OUTPUT + else + echo "dryrun=${{ inputs.dryrun }}" >> $GITHUB_OUTPUT + fi + + - name: Check uploads + id: check + run: | + URI="https://github.com/containers/podman/releases/download/${{steps.getversion.outputs.version}}" + for artifact in "podman-remote-release-darwin_amd64.zip darwin_amd" \ + 'podman-remote-release-darwin_arm64.zip darwin_arm' \ + 'podman-remote-release-windows_amd64.zip windows_amd' \ + 'podman-remote-static-linux_amd64.tar.gz linux_amd' \ + 'podman-remote-static-linux_arm64.tar.gz linux_arm' + do + set -- $artifact # Convert the "tuple" into the param args $1 $2... + status=$(curl -s -o /dev/null -w "%{http_code}" "${URI}/${1:?}") + if [[ "$status" == "404" ]] ; then + needsbuild=true + echo "${2:?}=true" + else + echo "::warning::${artifact} already exists, skipping" + fi + done + + if [ "$needsbuild" = true ]; then + echo "buildartifacts=true" >> $GITHUB_OUTPUT + else + echo "No new artifacts need to be built." + fi + + - name: Checkout Version + if: >- + steps.check.outputs.buildartifacts == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4 + with: + repository: containers/podman + ref: ${{steps.getversion.outputs.version}} + + - name: Set up Go + if: >- + steps.check.outputs.buildartifacts == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + uses: actions/setup-go@v5 + with: + go-version: stable + + - name: Setup artifact directory + if: >- + steps.check.outputs.buildartifacts == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: mkdir -p release/ + + - name: Build Darwin AMD + if: >- + steps.check.outputs.darwin_amd == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + make podman-remote-release-darwin_amd64.zip + mv podman-remote-release-darwin_amd64.zip release/ + + - name: Build Darwin ARM + if: >- + steps.check.outputs.darwin_arm == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + make podman-remote-release-darwin_arm64.zip + mv podman-remote-release-darwin_arm64.zip release/ + + - name: Build Linux AMD + if: >- + steps.check.outputs.linux_amd == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + make podman-remote-static-linux_amd64 + tar -cvzf podman-remote-static-linux_amd64.tar.gz bin/podman-remote-static-linux_amd64 + mv podman-remote-static-linux_amd64.tar.gz release/ + + - name: Build Linux ARM + if: >- + steps.check.outputs.linux_arm == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + make podman-remote-static-linux_arm64 + tar -cvzf podman-remote-static-linux_arm64.tar.gz bin/podman-remote-static-linux_arm64 + mv podman-remote-static-linux_arm64.tar.gz release/ + + - name: Build Windows AMD + if: >- + steps.check.outputs.windows_amd == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + sudo apt-get install -y pandoc + make podman-remote-release-windows_amd64.zip + mv podman-remote-release-windows_amd64.zip release/ + + - name: shasums + if: >- + steps.check.outputs.buildartifacts == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + run: | + pushd release + sha256sum *.zip *.tar.gz > shasums + popd + + - name: Upload to Actions as artifact + if: >- + steps.check.outputs.buildartifacts == 'true' || + steps.actual_dryrun.outputs.dryrun == 'true' + uses: actions/upload-artifact@v4 + with: + name: artifacts + path: | + release/* + + - name: Upload to Release + if: >- + steps.check.outputs.buildartifacts == 'true' && + steps.actual_dryrun.outputs.dryrun == 'false' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + (gh release download ${{steps.getversion.outputs.version}} -p "shasums" || exit 0) + cat release/shasums >> shasums + gh release upload ${{steps.getversion.outputs.version}} release/*.zip release/*.tar.gz + gh release upload ${{steps.getversion.outputs.version}} --clobber shasums + + - name: Trigger Windows Installer + if: >- + steps.check.outputs.windows_amd == 'true' || + steps.actual_dryrun.outputs.dryrun == 'false' + run: | + gh workflow run upload-win-installer.yml -f ${{steps.getversion.outputs.version}} -f dryrun=false diff --git a/.github/workflows/upload-win-installer.yml b/.github/workflows/upload-win-installer.yml index d27f0e6542..ca0d94d842 100644 --- a/.github/workflows/upload-win-installer.yml +++ b/.github/workflows/upload-win-installer.yml @@ -1,8 +1,6 @@ name: Upload Windows Installer on: - release: - types: [created, published, edited] workflow_dispatch: inputs: version: