diff --git a/.github/scripts/create-tag.js b/.github/scripts/create-tag.js deleted file mode 100644 index 6ecd0bc..0000000 --- a/.github/scripts/create-tag.js +++ /dev/null @@ -1,14 +0,0 @@ -module.exports = async ({ github, context }, tagName) => { - try { - await github.rest.git.createRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `refs/tags/${tagName}`, - sha: context.sha, - force: true, - }); - } catch (err) { - console.error(`Failed to create tag: ${tagName}`); - console.error(err); - } -}; \ No newline at end of file diff --git a/.github/scripts/move-tag.js b/.github/scripts/move-tag.js deleted file mode 100644 index 580fa58..0000000 --- a/.github/scripts/move-tag.js +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = async ({ github, context }, tagName) => { - try { - await github.rest.git.updateRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `tags/${tagName}`, - sha: context.sha, - force: true, - }); - } catch (err) { - console.error(`Failed to move nightly tag.`); - console.error(`This should only happen the first time.`); - console.error(err); - } -}; \ No newline at end of file diff --git a/.github/scripts/prune-prereleases.js b/.github/scripts/prune-prereleases.js deleted file mode 100644 index 0537fbf..0000000 --- a/.github/scripts/prune-prereleases.js +++ /dev/null @@ -1,39 +0,0 @@ -module.exports = async ({ github, context }) => { - console.log("Pruning old prereleases"); - - // doc: https://docs.github.com/en/rest/releases/releases - const { data: releases } = await github.rest.repos.listReleases({ - owner: context.repo.owner, - repo: context.repo.repo, - }); - - let nightlies = releases.filter( - release => - // Only consider releases tagged `nightly-${SHA}` for deletion - release.tag_name.includes("nightly") && - release.tag_name !== "nightly" && - // ref: https://github.com/foundry-rs/foundry/issues/3881 - // Skipping pruning the build on 1st day of each month - !release.created_at.includes("-01T") - ); - - // Keep newest 3 nightlies - nightlies = nightlies.slice(3); - - for (const nightly of nightlies) { - console.log(`Deleting nightly: ${nightly.tag_name}`); - await github.rest.repos.deleteRelease({ - owner: context.repo.owner, - repo: context.repo.repo, - release_id: nightly.id, - }); - console.log(`Deleting nightly tag: ${nightly.tag_name}`); - await github.rest.git.deleteRef({ - owner: context.repo.owner, - repo: context.repo.repo, - ref: `tags/${nightly.tag_name}`, - }); - } - - console.log("Done."); -}; diff --git a/.github/workflows/release-dispatch.yml b/.github/workflows/release-dispatch.yml new file mode 100644 index 0000000..f060c09 --- /dev/null +++ b/.github/workflows/release-dispatch.yml @@ -0,0 +1,35 @@ +name: release-dispatch +on: + workflow_dispatch: + inputs: + version: + description: Version to release + required: true + type: string + +jobs: + propose-release: + permissions: + pull-requests: write + contents: write + runs-on: ubuntu-latest + container: + image: ghcr.io/dojoengine/dojo-dev:5d61184 + steps: + # Workaround described here: https://github.com/actions/checkout/issues/760 + - uses: actions/checkout@v3 + - run: git config --global --add safe.directory "$GITHUB_WORKSPACE" + - run: cargo release version ${{ inputs.version }} --execute --no-confirm && cargo release replace --execute --no-confirm + - id: version_info + run: | + cargo install cargo-get + echo "version=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT + - uses: peter-evans/create-pull-request@v5 + with: + # We have to use a PAT in order to trigger ci + token: ${{ secrets.CREATE_PR_TOKEN }} + title: "Prepare release: v${{ steps.version_info.outputs.version }}" + commit-message: "Prepare release: v${{ steps.version_info.outputs.version }}" + branch: prepare-release + base: main + delete-branch: true diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5ff1ec7..f802b82 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,90 +1,51 @@ name: release on: - push: - tags: - - "*" - workflow_dispatch: + pull_request: + types: [closed] + branches: + - main env: - IS_NIGHTLY: ${{ (github.event_name == 'schedule' || github.event_name == 'workflow_dispatch') && 'true' || 'false' }} CARGO_TERM_COLOR: always RUST_VERSION: 1.74.0 REGISTRY_IMAGE: ghcr.io/${{ github.repository }} jobs: prepare: - name: Prepare release + if: github.event.pull_request.merged == true && github.event.pull_request.head.ref == '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: - fetch-depth: 0 - - - name: Compute release name and tag + - uses: actions/checkout@v3 + - name: Get version id: release_info run: | - if [[ $IS_NIGHTLY == "true" ]]; then - echo "tag_name=nightly-${GITHUB_SHA}" >> $GITHUB_OUTPUT - echo "release_name=Nightly ($(date '+%Y-%m-%d'))" >> $GITHUB_OUTPUT - else - echo "tag_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT - echo "release_name=${GITHUB_REF_NAME}" >> $GITHUB_OUTPUT - 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 == 'true' }} - 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 == 'true' && 'nightly' || '' }} - toTag: ${{ steps.release_info.outputs.tag_name }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + cargo install cargo-get + echo "tag_name=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT release: name: ${{ matrix.job.target }} (${{ matrix.job.os }}) needs: prepare runs-on: ${{ matrix.job.os }} + env: + PLATFORM_NAME: ${{ matrix.job.platform }} + TARGET: ${{ matrix.job.target }} + ARCH: ${{ matrix.job.arch }} 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 + - os: ubuntu-20.04 platform: linux target: x86_64-unknown-linux-gnu arch: amd64 - - os: ubuntu-latest + - os: ubuntu-20.04 platform: linux target: aarch64-unknown-linux-gnu arch: arm64 svm_target_platform: linux-aarch64 - - os: macos-latest + - os: macos-latest-xlarge platform: darwin target: x86_64-apple-darwin arch: amd64 @@ -110,9 +71,10 @@ jobs: with: cache-on-failure: true - - uses: arduino/setup-protoc@v1 + - uses: arduino/setup-protoc@v2 with: repo-token: ${{ secrets.GITHUB_TOKEN }} + version: "25.x" - name: Apple M1 setup if: ${{ matrix.job.target == 'aarch64-apple-darwin' }} @@ -129,102 +91,97 @@ jobs: - name: Build binaries run: cargo build --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 == 'true' && 'nightly') || needs.prepare.outputs.tag_name }} + VERSION_NAME: v${{ needs.prepare.outputs.tag_name }} run: | if [ "$PLATFORM_NAME" == "linux" ]; then tar -czvf "slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release slot echo "file_name=slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT 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 "slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" -C ./target/${TARGET}/release slot echo "file_name=slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT else cd ./target/${TARGET}/release 7z a -tzip "slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" slot.exe mv "slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" ../../../ - echo "file_name=slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.tar.gz" >> $GITHUB_OUTPUT + echo "file_name=slot_${VERSION_NAME}_${PLATFORM_NAME}_${ARCH}.zip" >> $GITHUB_OUTPUT fi 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 == 'true' }} - body: ${{ needs.prepare.outputs.changelog }} - files: | - ${{ steps.artifacts.outputs.file_name }} - - # If this is a nightly release, it also updates the release - # tagged `nightly` for compatibility with `slotup` - - name: Update nightly release - if: ${{ env.IS_NIGHTLY == 'true' }} - 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 }} - - cleanup: - name: Release cleanup - runs-on: ubuntu-latest - needs: release + - name: Move Binaries + if: ${{ env.PLATFORM_NAME == 'linux' }} + run: | + mkdir -p $PLATFORM_NAME/$ARCH + mv target/$TARGET/release/slot $PLATFORM_NAME/$ARCH + shell: bash - steps: - - name: Checkout sources - uses: actions/checkout@v2 + - name: Upload docker binaries + uses: actions/upload-artifact@v3 + with: + name: binaries + path: ${{ env.PLATFORM_NAME }} + retention-days: 1 - # Moves the `nightly` tag to `HEAD` - - name: Move nightly tag - if: ${{ env.IS_NIGHTLY == 'true' }} - uses: actions/github-script@v5 + - name: Upload release artifacts + uses: actions/upload-artifact@v3 with: - script: | - const moveTag = require('./.github/scripts/move-tag.js') - await moveTag({ github, context }, 'nightly') + name: artifacts + path: ${{ steps.artifacts.outputs.file_name }} + retention-days: 1 - - name: Delete old nightlies - uses: actions/github-script@v5 + create-draft-release: + runs-on: ubuntu-20.04 + needs: [prepare, release] + env: + GITHUB_USER: ${{ github.repository_owner }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + steps: + - uses: actions/checkout@v2 + - uses: actions/download-artifact@v3 with: - script: | - const prunePrereleases = require('./.github/scripts/prune-prereleases.js') - await prunePrereleases({github, context}) + name: artifacts + path: artifacts + - id: version_info + run: | + cargo install cargo-get + echo "version=$(cargo get workspace.package.version)" >> $GITHUB_OUTPUT + - name: Display structure of downloaded files + run: ls -R artifacts + - run: gh release create v${{ steps.version_info.outputs.version }} ./artifacts/*.gz --generate-notes --draft docker-build-and-push: - name: Build and push Docker image - runs-on: ubuntu-latest - needs: prepare + runs-on: ubuntu-20.04 + needs: [prepare, release] steps: - name: Checkout repository uses: actions/checkout@v2 - + + - name: Download binaries + uses: actions/download-artifact@v3 + with: + name: binaries + path: artifacts/linux + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v1 - + - name: Login to GitHub Container Registry uses: docker/login-action@v1 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - - name: Build and push Docker image - uses: docker/build-push-action@v4 + + - name: Build and push docker image + uses: docker/build-push-action@v3 with: push: true - tags: ghcr.io/${{ github.repository }}:latest,ghcr.io/${{ github.repository }}:${{ needs.prepare.outputs.tag_name }} + tags: ghcr.io/${{ github.repository }}:latest,ghcr.io/${{ github.repository }}:v${{ needs.prepare.outputs.tag_name }} platforms: linux/amd64,linux/arm64 + build-contexts: | + artifacts=artifacts