-
Notifications
You must be signed in to change notification settings - Fork 339
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix(release): scope tag matching pattern and rename workflow file
- Loading branch information
1 parent
25fd235
commit b6fd41e
Showing
2 changed files
with
122 additions
and
318 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,9 +4,9 @@ | |
# CI that: | ||
# | ||
# * checks for a Git Tag that looks like a release | ||
# * builds artifacts with cargo-dist (executable-zips, installers, hashes) | ||
# * uploads those artifacts to the Github Release™ | ||
# * undrafts the Github Release™ on success | ||
# * builds artifacts with cargo-dist (archives, installers, hashes) | ||
# * uploads those artifacts to temporary workflow zip | ||
# * on success, uploads the artifacts to a Github Release™ | ||
# | ||
# Note that a Github Release™ with this tag is assumed to exist as a draft | ||
# with the appropriate title/body, and will be undrafted for you. | ||
|
@@ -39,138 +39,167 @@ permissions: | |
on: | ||
push: | ||
tags: | ||
- 'libsql-server-**[0-9]+.[0-9]+.[0-9]+*' | ||
- 'libqsl-server-**[0-9]+.[0-9]+.[0-9]+*' | ||
pull_request: | ||
|
||
jobs: | ||
# Run 'cargo dist plan' to determine what tasks we need to do | ||
plan: | ||
runs-on: ubuntu-latest | ||
outputs: | ||
has-releases: ${{ steps.plan.outputs.has-releases }} | ||
releases: ${{ steps.plan.outputs.releases }} | ||
val: ${{ steps.plan.outputs.manifest }} | ||
tag: ${{ !github.event.pull_request && github.ref_name || '' }} | ||
tag-flag: ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} | ||
publishing: ${{ !github.event.pull_request }} | ||
env: | ||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
- name: Install cargo-dist | ||
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.6/cargo-dist-installer.sh | sh" | ||
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.2/cargo-dist-installer.sh | sh" | ||
- id: plan | ||
run: | | ||
cargo dist plan --tag=${{ github.ref_name }} --output-format=json > dist-manifest.json | ||
echo "dist plan ran successfully" | ||
cargo dist plan ${{ !github.event.pull_request && format('--tag={0}', github.ref_name) || '' }} --output-format=json > dist-manifest.json | ||
echo "cargo dist plan ran successfully" | ||
cat dist-manifest.json | ||
# We're assuming a draft Github Release™ with the desired title/tag/body already exists | ||
# Upload the manifest to the Github Release™ | ||
gh release upload ${{ github.ref_name }} dist-manifest.json | ||
echo "uploaded manifest!" | ||
# Disable all the upload-artifacts tasks if we have no actual releases | ||
HAS_RELEASES=$(jq --raw-output ".releases != null" dist-manifest.json) | ||
echo "has-releases=$HAS_RELEASES" >> "$GITHUB_OUTPUT" | ||
echo "releases=$(jq --compact-output ".releases" dist-manifest.json)" >> "$GITHUB_OUTPUT" | ||
echo "manifest=$(jq -c "." dist-manifest.json)" >> "$GITHUB_OUTPUT" | ||
- name: "Upload dist-manifest.json" | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: dist-manifest.json | ||
|
||
# Build and packages all the platform-specific things | ||
upload-local-artifacts: | ||
# Let the initial task tell us to not run (currently very blunt) | ||
needs: plan | ||
if: ${{ needs.plan.outputs.has-releases == 'true' }} | ||
if: ${{ fromJson(needs.plan.outputs.val).releases != null && (needs.plan.outputs.publishing == 'true' || fromJson(needs.plan.outputs.val).ci.github.pr_run_mode == 'upload') }} | ||
strategy: | ||
fail-fast: false | ||
matrix: | ||
# For these target platforms | ||
include: | ||
- os: "macos-11" | ||
dist-args: "--artifacts=local --target=aarch64-apple-darwin" | ||
install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.6/cargo-dist-installer.sh | sh" | ||
- os: "macos-11" | ||
dist-args: "--artifacts=local --target=x86_64-apple-darwin" | ||
install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.6/cargo-dist-installer.sh | sh" | ||
- os: "ubuntu-20.04" | ||
dist-args: "--artifacts=local --target=x86_64-unknown-linux-gnu" | ||
install-dist: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.6/cargo-dist-installer.sh | sh" | ||
runs-on: ${{ matrix.os }} | ||
# Target platforms/runners are computed by cargo-dist in create-release. | ||
# Each member of the matrix has the following arguments: | ||
# | ||
# - runner: the github runner | ||
# - dist-args: cli flags to pass to cargo dist | ||
# - install-dist: expression to run to install cargo-dist on the runner | ||
# | ||
# Typically there will be: | ||
# - 1 "global" task that builds universal installers | ||
# - N "local" tasks that build each platform's binaries and platform-specific installers | ||
matrix: ${{ fromJson(needs.plan.outputs.val).ci.github.artifacts_matrix }} | ||
runs-on: ${{ matrix.runner }} | ||
env: | ||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
BUILD_MANIFEST_NAME: target/distrib/${{ join(matrix.targets, '-') }}-dist-manifest.json | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
- uses: swatinem/rust-cache@v2 | ||
- name: Install cargo-dist | ||
run: ${{ matrix.install-dist }} | ||
- name: Run cargo-dist | ||
# This logic is a bit janky because it's trying to be a polyglot between | ||
# powershell and bash since this will run on windows, macos, and linux! | ||
# The two platforms don't agree on how to talk about env vars but they | ||
# do agree on 'cat' and '$()' so we use that to marshal values between commands. | ||
run: ${{ matrix.install_dist }} | ||
- name: Install dependencies | ||
run: | | ||
${{ matrix.packages_install }} | ||
- name: Build artifacts | ||
run: | | ||
# Actually do builds and make zips and whatnot | ||
cargo dist build --tag=${{ github.ref_name }} --output-format=json ${{ matrix.dist-args }} > dist-manifest.json | ||
echo "dist ran successfully" | ||
cat dist-manifest.json | ||
cargo dist build ${{ needs.plan.outputs.tag-flag }} --print=linkage --output-format=json ${{ matrix.dist_args }} > dist-manifest.json | ||
echo "cargo dist ran successfully" | ||
- id: cargo-dist | ||
name: Post-build | ||
# We force bash here just because github makes it really hard to get values up | ||
# to "real" actions without writing to env-vars, and writing to env-vars has | ||
# inconsistent syntax between shell and powershell. | ||
shell: bash | ||
run: | | ||
# Parse out what we just built and upload it to the Github Release™ | ||
jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json > uploads.txt | ||
echo "uploading..." | ||
cat uploads.txt | ||
gh release upload ${{ github.ref_name }} $(cat uploads.txt) | ||
echo "uploaded!" | ||
echo "paths<<EOF" >> "$GITHUB_OUTPUT" | ||
jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json >> "$GITHUB_OUTPUT" | ||
echo "EOF" >> "$GITHUB_OUTPUT" | ||
cp dist-manifest.json "$BUILD_MANIFEST_NAME" | ||
- name: "Upload artifacts" | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: | | ||
${{ steps.cargo-dist.outputs.paths }} | ||
${{ env.BUILD_MANIFEST_NAME }} | ||
# Build and package all the platform-agnostic(ish) things | ||
upload-global-artifacts: | ||
needs: upload-local-artifacts | ||
needs: [plan, upload-local-artifacts] | ||
runs-on: "ubuntu-20.04" | ||
env: | ||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
- name: Install cargo-dist | ||
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.2.0-prerelease.6/cargo-dist-installer.sh | sh" | ||
run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.4.2/cargo-dist-installer.sh | sh" | ||
# Get all the local artifacts for the global tasks to use (for e.g. checksums) | ||
- name: Fetch local artifacts | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: target/distrib/ | ||
- id: cargo-dist | ||
shell: bash | ||
run: | | ||
gh release download ${{ github.ref_name }} --dir target/distrib/ | ||
- name: Run cargo-dist | ||
run: | | ||
cargo dist build --tag=${{ github.ref_name }} --output-format=json "--artifacts=global" > dist-manifest.json | ||
echo "dist ran successfully" | ||
cat dist-manifest.json | ||
cargo dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json | ||
echo "cargo dist ran successfully" | ||
# Parse out what we just built and upload it to the Github Release™ | ||
jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json > uploads.txt | ||
echo "uploading..." | ||
cat uploads.txt | ||
gh release upload ${{ github.ref_name }} $(cat uploads.txt) | ||
echo "uploaded!" | ||
echo "paths<<EOF" >> "$GITHUB_OUTPUT" | ||
jq --raw-output ".artifacts[]?.path | select( . != null )" dist-manifest.json >> "$GITHUB_OUTPUT" | ||
echo "EOF" >> "$GITHUB_OUTPUT" | ||
- name: "Upload artifacts" | ||
uses: actions/upload-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: ${{ steps.cargo-dist.outputs.paths }} | ||
|
||
should-publish: | ||
needs: | ||
- plan | ||
- upload-local-artifacts | ||
- upload-global-artifacts | ||
if: ${{ needs.plan.outputs.publishing == 'true' }} | ||
runs-on: ubuntu-latest | ||
steps: | ||
- name: print tag | ||
run: echo "ok we're publishing!" | ||
|
||
upload-homebrew-formula: | ||
needs: [plan, upload-global-artifacts] | ||
publish-homebrew-formula: | ||
needs: [plan, should-publish] | ||
runs-on: "ubuntu-20.04" | ||
env: | ||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
RELEASES: ${{ needs.plan.outputs.releases }} | ||
PLAN: ${{ needs.plan.outputs.val }} | ||
GITHUB_USER: "axo bot" | ||
GITHUB_EMAIL: "[email protected]" | ||
if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/checkout@v4 | ||
with: | ||
repository: "libsql/homebrew-sqld" | ||
token: ${{ secrets.HOMEBREW_TAP_TOKEN }} | ||
# So we have access to the formula | ||
- name: Fetch local artifacts | ||
run: | | ||
gh release download ${{ github.ref_name }} --dir Formula --repo ${GITHUB_REPOSITORY} --clobber | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: Formula/ | ||
- name: Commit formula files | ||
run: | | ||
git config --global user.name "${GITHUB_USER}" | ||
git config --global user.email "${GITHUB_EMAIL}" | ||
for release in $(echo "$RELEASES" | jq --compact-output '.[]'); do | ||
for release in $(echo "$PLAN" | jq --compact-output '.releases[]'); do | ||
name=$(echo "$release" | jq .app_name --raw-output) | ||
version=$(echo "$release" | jq .app_version --raw-output) | ||
|
@@ -179,18 +208,32 @@ jobs: | |
done | ||
git push | ||
# Mark the Github Release™ as a non-draft now that everything has succeeded! | ||
# Create a Github Release with all the results once everything is done | ||
publish-release: | ||
# Only run after all the other tasks, but it's ok if upload-artifacts was skipped | ||
needs: [plan, upload-local-artifacts, upload-global-artifacts] | ||
if: ${{ always() && needs.plan.result == 'success' && (needs.upload-local-artifacts.result == 'skipped' || needs.upload-local-artifacts.result == 'success') && (needs.upload-global-artifacts.result == 'skipped' || needs.upload-global-artifacts.result == 'success') }} | ||
needs: [plan, should-publish] | ||
runs-on: ubuntu-latest | ||
env: | ||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
steps: | ||
- uses: actions/checkout@v3 | ||
- uses: actions/checkout@v4 | ||
with: | ||
submodules: recursive | ||
- name: mark release as non-draft | ||
- name: "Download artifacts" | ||
uses: actions/download-artifact@v3 | ||
with: | ||
name: artifacts | ||
path: artifacts | ||
- name: Cleanup | ||
run: | | ||
gh release edit ${{ github.ref_name }} --draft=false | ||
# Remove the granular manifests | ||
rm artifacts/*-dist-manifest.json | ||
- name: Create Release | ||
uses: ncipollo/release-action@v1 | ||
with: | ||
tag: ${{ needs.plan.outputs.tag }} | ||
allowUpdates: true | ||
updateOnlyUnreleased: true | ||
omitBodyDuringUpdate: true | ||
omitNameDuringUpdate: true | ||
prerelease: ${{ fromJson(needs.plan.outputs.val).announcement_is_prerelease }} | ||
artifacts: "artifacts/*" |
Oops, something went wrong.