diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ae07a6e --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,227 @@ +# https://github.com/foundry-rs/foundry/blob/master/.github/workflows/release.yml + +name: Release version + +on: + workflow_dispatch: + +env: + IS_NIGHTLY: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} + +jobs: + prepare: + name: Prepare release + runs-on: ubuntu-latest + + outputs: + tag_name: ${{ steps.release_info.outputs.tag_name }} + release_name: ${{ steps.release_info.outputs.release_name }} + changelog: ${{ steps.build_changelog.outputs.changelog }} + + steps: + - name: Checkout sources + uses: actions/checkout@v2 + with: + ref: ${{ env.IS_NIGHTLY && 'stage' || 'main' }} + fetch-depth: 0 + + - name: Compute release name and tag + id: release_info + run: | + if [[ $IS_NIGHTLY ]]; then + echo "::set-output name=tag_name::nightly-${GITHUB_SHA}" + echo "::set-output name=release_name::Nightly ($(date '+%Y-%m-%d'))" + else + echo "::set-output name=tag_name::${GITHUB_REF_NAME}" + echo "::set-output name=release_name::${GITHUB_REF_NAME}" + fi + # Creates a `nightly-SHA` tag for this specific nightly + # This tag is used for this specific nightly version's release + # which allows users to roll back. It is also used to build + # the changelog. + - name: Create build-specific nightly tag + if: ${{ env.IS_NIGHTLY }} + uses: actions/github-script@v5 + env: + TAG_NAME: ${{ steps.release_info.outputs.tag_name }} + with: + script: | + const createTag = require('./.github/scripts/create-tag.js') + await createTag({ github, context }, process.env.TAG_NAME) + - name: Build changelog + id: build_changelog + uses: mikepenz/release-changelog-builder-action@v2 + with: + configuration: "./.github/changelog.json" + fromTag: ${{ env.IS_NIGHTLY && 'nightly' || '' }} + toTag: ${{ steps.release_info.outputs.tag_name }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + release-docker: + name: Release Docker + uses: ./.github/workflows/docker-publish.yaml + + release: + name: ${{ matrix.job.target }} (${{ matrix.job.os }}) + runs-on: ${{ matrix.job.os }} + needs: prepare + strategy: + matrix: + job: + # The OS is used for the runner + # The platform is a generic platform name + # The target is used by Cargo + # The arch is either 386, arm64 or amd64 + # The svm target platform to use for the binary https://github.com/roynalnaruto/svm-rs/blob/84cbe0ac705becabdc13168bae28a45ad2299749/svm-builds/build.rs#L4-L24 + - os: ubuntu-latest + platform: linux + target: x86_64-unknown-linux-gnu + arch: amd64 + svm_target_platform: linux-amd64 + - os: ubuntu-latest + platform: linux + target: aarch64-unknown-linux-gnu + arch: arm64 + svm_target_platform: linux-aarch64 + - os: macos-latest + platform: darwin + target: x86_64-apple-darwin + arch: amd64 + svm_target_platform: macosx-amd64 + - os: macos-latest + platform: darwin + target: aarch64-apple-darwin + arch: arm64 + svm_target_platform: macosx-aarch64 + #- os: windows-latest + # platform: win32 + # target: x86_64-pc-windows-msvc + # arch: amd64 + # svm_target_platform: macosx-amd64 + + steps: + - name: Checkout sources + uses: actions/checkout@v2 + with: + ref: ${{ env.IS_NIGHTLY && 'stage' || 'main' }} + + - name: Install toolchain + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + target: ${{ matrix.job.target }} + override: true + + - uses: Swatinem/rust-cache@v1 + with: + cache-on-failure: true + + - name: Apple M1 setup + if: ${{ matrix.job.target == 'aarch64-apple-darwin' }} + run: | + echo "SDKROOT=$(xcrun -sdk macosx --show-sdk-path)" >> $GITHUB_ENV + echo "MACOSX_DEPLOYMENT_TARGET=$(xcrun -sdk macosx --show-sdk-platform-version)" >> $GITHUB_ENV + - name: Linux ARM setup + if: ${{ matrix.job.target == 'aarch64-unknown-linux-gnu' }} + run: | + sudo apt-get update -y + sudo apt-get install -y gcc-aarch64-linux-gnu + echo "CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc" >> $GITHUB_ENV + - name: Build binaries + uses: actions-rs/cargo@v1 + env: + SVM_TARGET_PLATFORM: ${{ matrix.job.svm_target_platform }} + with: + command: build + args: --release --bins --target ${{ matrix.job.target }} + + - name: Archive binaries + id: artifacts + env: + PLATFORM_NAME: ${{ matrix.job.platform }} + TARGET: ${{ matrix.job.target }} + ARCH: ${{ matrix.job.arch }} + VERSION_NAME: ${{ (env.IS_NIGHTLY && 'nightly') || needs.prepare.outputs.tag_name }} + run: | + if [ "$PLATFORM_NAME" == "linux" ]; then + tar -czvf "huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release huffc + echo "::set-output name=file_name::huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" + elif [ "$PLATFORM_NAME" == "darwin" ]; then + # We need to use gtar here otherwise the archive is corrupt. + # See: https://github.com/actions/virtual-environments/issues/2619 + gtar -czvf "huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release huffc + echo "::set-output name=file_name::huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" + else + cd ./target/${TARGET}/release + 7z a -tzip "huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" huff.exe + mv "huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ../../../ + echo "::set-output name=file_name::huff_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" + fi + shell: bash + + - name: Build man page + id: man + if: ${{ matrix.job.target == 'x86_64-unknown-linux-gnu' }} + env: + PLATFORM_NAME: ${{ matrix.job.platform }} + TARGET: ${{ matrix.job.target }} + VERSION_NAME: ${{ (env.IS_NIGHTLY && 'nightly') || needs.prepare.outputs.tag_name }} + run: | + sudo apt-get -y install help2man + help2man -N ./target/${TARGET}/release/huffc > huff.1 + gzip huff.1 + tar -czvf "huff_man_${VERSION_NAME}.tar.gz" huff.1.gz + echo "::set-output name=huff_man::huff_man_${VERSION_NAME}.tar.gz" + shell: bash + + # Creates the release for this specific version + - name: Create release + uses: softprops/action-gh-release@v1 + with: + name: ${{ needs.prepare.outputs.release_name }} + tag_name: ${{ needs.prepare.outputs.tag_name }} + prerelease: ${{ env.IS_NIGHTLY }} + body: ${{ needs.prepare.outputs.changelog }} + files: | + ${{ steps.artifacts.outputs.file_name }} + ${{ steps.man.outputs.huff_man }} + # If this is a nightly release, it also updates the release + # tagged `nightly` for compatability with `huffup` + - name: Update nightly release + if: ${{ env.IS_NIGHTLY }} + uses: softprops/action-gh-release@v1 + with: + name: 'Nightly' + tag_name: 'nightly' + prerelease: true + body: ${{ needs.prepare.outputs.changelog }} + files: | + ${{ steps.artifacts.outputs.file_name }} + ${{ steps.man.outputs.huff_man }} + cleanup: + name: Release cleanup + runs-on: ubuntu-latest + needs: release + + steps: + - name: Checkout sources + uses: actions/checkout@v2 + with: + ref: ${{ env.IS_NIGHTLY && 'stage' || 'main' }} + + # Moves the `nightly` tag to `HEAD` + - name: Move nightly tag + if: ${{ env.IS_NIGHTLY }} + uses: actions/github-script@v5 + with: + script: | + const moveTag = require('./.github/scripts/move-tag.js') + await moveTag({ github, context }, 'nightly') + - name: Delete old nightlies + uses: actions/github-script@v5 + with: + script: | + const prunePrereleases = require('./.github/scripts/prune-prereleases.js') + await prunePrereleases({github, context})