Make README template customizable #33
Workflow file for this run
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
# https://github.com/actions-rs/example/blob/23ffb1bf0016f41999902ba7542b4f1bb1a89c48/.github/workflows/quickstart.yml#L4 | |
name: CI | |
on: | |
push: | |
branches: | |
- main | |
# See: | |
# https://stackoverflow.com/questions/62968897/is-it-possible-to-not-run-github-action-for-readme-updates | |
# and | |
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-excluding-paths | |
paths-ignore: | |
- '**.md' | |
pull_request: | |
paths-ignore: | |
- '**.md' | |
env: | |
CARGO_TERM_COLOR: always | |
jobs: | |
check: | |
name: Check | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v2 | |
- name: Run cargo check | |
run: cargo check | |
test: | |
name: Test Suite | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v2 | |
- name: Run cargo test with backtrace | |
run: cargo test -- --nocapture | |
env: | |
RUST_BACKTRACE: 1 | |
lints: | |
name: Lints | |
runs-on: ubuntu-latest | |
env: | |
RUSTFLAGS: "-Dwarnings" | |
steps: | |
- name: Checkout sources | |
uses: actions/checkout@v2 | |
- name: Run cargo fmt | |
run: cargo fmt --all -- --check | |
- name: Run cargo clippy | |
run: cargo clippy --all-targets --all-features | |
release: | |
runs-on: macos-latest | |
needs: | |
- test | |
- lints | |
- check | |
outputs: | |
new_version: ${{ steps.check_for_version_changes.outputs.new_version }} | |
changed: ${{ steps.check_for_version_changes.outputs.changed }} | |
if: github.ref == 'refs/heads/main' | |
steps: | |
- uses: actions/checkout@v3 | |
with: | |
# https://stackoverflow.com/questions/65944700/how-to-run-git-diff-in-github-actions | |
# TLDR – By default this action fetches no history. | |
# We need a bit of history to be able to check if we've recently updated the version in Cargo.toml | |
fetch-depth: 2 | |
- name: Toolchain info | |
run: | | |
cargo --version --verbose | |
rustc --version | |
cargo clippy --version | |
- name: Build | |
run: cargo build --release --target aarch64-apple-darwin --target x86_64-apple-darwin | |
- name: Check for version changes in Cargo.toml | |
id: check_for_version_changes | |
run: | | |
# When there are no changes, VERSION_CHANGES will be empty | |
# Without the echo, this command would exit with a 1, causing the GitHub Action to fail | |
# Instead, we want it to succeed, but just evaluate `changed=false` in the other branch of the conditional | |
VERSION_CHANGES=$(git diff HEAD~1 HEAD Cargo.toml | grep "\+version" || echo "") | |
if [[ -n $VERSION_CHANGES ]]; then | |
NEW_VERSION=$(echo $VERSION_CHANGES | awk -F'"' '{print $2}') | |
echo "changed=true" >> $GITHUB_OUTPUT | |
echo "new_version=v$NEW_VERSION" >> $GITHUB_OUTPUT | |
else | |
echo "changed=false" >> $GITHUB_OUTPUT | |
fi | |
- name: Create GitHub Release if current commit has updated the version in Cargo.toml | |
if: steps.check_for_version_changes.outputs.changed == 'true' | |
run: | | |
gh release create ${{steps.check_for_version_changes.outputs.new_version}} --target "${{ github.sha }}" --generate-notes | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
upload-mac-universal-bin: | |
needs: release | |
runs-on: macos-latest | |
if: ${{needs.release.outputs.new_version}} | |
steps: | |
- uses: actions/checkout@v3 | |
- name: Build | |
run: cargo build --release --target aarch64-apple-darwin --target x86_64-apple-darwin | |
- name: Upload mac universal binary | |
run: | | |
# This combines the intel and m1 binaries into a single binary | |
lipo -create -output target/pks target/aarch64-apple-darwin/release/pks target/x86_64-apple-darwin/release/pks | |
# Creates artifact for homebrew. -C means run from `target` directory | |
tar -czf target/pks-mac.tar.gz -C target pks | |
# This tarball is a binary that is executable | |
gh release upload $NEW_VERSION target/pks-mac.tar.gz | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NEW_VERSION: ${{ needs.release.outputs.new_version }} | |
upload-linux-bin: | |
needs: release | |
if: ${{needs.release.outputs.new_version}} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Update local toolchain | |
run: | | |
cargo install cross | |
- name: Build linux binaries | |
run: | | |
cross build --release --target x86_64-unknown-linux-gnu | |
cross build --release --target aarch64-unknown-linux-gnu | |
- name: Upload linux binaries | |
run: | | |
tar -czf target/x86_64-unknown-linux-gnu.tar.gz -C target/x86_64-unknown-linux-gnu/release pks | |
tar -czf target/aarch64-unknown-linux-gnu.tar.gz -C target/aarch64-unknown-linux-gnu/release pks | |
gh release upload $NEW_VERSION target/x86_64-unknown-linux-gnu.tar.gz | |
gh release upload $NEW_VERSION target/aarch64-unknown-linux-gnu.tar.gz | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
NEW_VERSION: ${{ needs.release.outputs.new_version }} | |
generate-dotslash-files: | |
name: Generating and uploading DotSlash files | |
needs: | |
- release | |
- upload-linux-bin | |
- upload-mac-universal-bin | |
if: success() && ${{needs.release.outputs.new_version}} | |
runs-on: ubuntu-latest | |
steps: | |
- uses: facebook/dotslash-publish-release@v1 | |
# This is necessary because the action uses | |
# `gh release upload` to publish the generated DotSlash file(s) | |
# as part of the release. | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
with: | |
# Additional file that lives in your repo that defines | |
# how your DotSlash file(s) should be generated. | |
config: .github/workflows/dotslash-config.json | |
# Tag for the release to target. | |
tag: ${{ needs.release.outputs.new_version }} |