Skip to content

Release

Release #13

Workflow file for this run

name: Release
on:
push:
tags: ['v*.*.*']
workflow_run:
workflows: ["CI"]
types: [completed]
branches: [main]
permissions:
contents: write
jobs:
create-release:
runs-on: ubuntu-latest
if: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) || (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success')
outputs:
release_id: ${{ steps.create_release.outputs.result }}
upload_url: ${{ steps.create_release.outputs.upload_url }}
version: ${{ steps.get_version.outputs.version }}
steps:
- uses: actions/checkout@v4
- name: Get version
id: get_version
run: |
if [[ $GITHUB_REF == refs/tags/* ]]; then
VERSION=${GITHUB_REF#refs/tags/}
else
VERSION=$(grep '^version' Cargo.toml | cut -d '"' -f 2)
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version: $VERSION"
- name: Create Release
id: create_release
uses: actions/github-script@v7
with:
script: |
const version = '${{ steps.get_version.outputs.version }}';
const isTag = context.ref.startsWith('refs/tags/');
const tagName = isTag ? version : `v${version}`;
const releaseName = isTag ? `Release ${version}` : `Development Release ${version}`;
try {
const release = await github.rest.repos.createRelease({
owner: context.repo.owner,
repo: context.repo.repo,
tag_name: tagName,
name: releaseName,
body: `Automated release for ${isTag ? 'tag' : 'commit'} ${context.sha.substring(0, 7)}`,
draft: false,
prerelease: !isTag
});
core.setOutput('upload_url', release.data.upload_url);
return release.data.id;
} catch (error) {
if (error.status === 422) {
// Release already exists, get it
const releases = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo
});
const existingRelease = releases.data.find(r => r.tag_name === tagName);
if (existingRelease) {
core.setOutput('upload_url', existingRelease.upload_url);
return existingRelease.id;
}
}
throw error;
}
build-and-upload:
needs: create-release
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-linux
system: x86_64-linux
- os: macos-latest
target: aarch64-darwin
system: aarch64-darwin
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- name: Install Nix
uses: cachix/install-nix-action@v27
with:
github_access_token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Nix cache
uses: cachix/cachix-action@v15
with:
name: nix-community
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
skipPush: true
- name: Build with Nix
run: nix build --system ${{ matrix.system }}
- name: Prepare artifacts
run: |
mkdir -p artifacts
cp result/bin/termcopy artifacts/termcopy-${{ matrix.target }}
cd artifacts
sha256sum termcopy-${{ matrix.target }} > termcopy-${{ matrix.target }}.sha256
- name: Upload Release Asset
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ./artifacts/termcopy-${{ matrix.target }}
asset_name: termcopy-${{ matrix.target }}
asset_content_type: application/octet-stream
- name: Upload Checksum
uses: actions/upload-release-asset@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
upload_url: ${{ needs.create-release.outputs.upload_url }}
asset_path: ./artifacts/termcopy-${{ matrix.target }}.sha256
asset_name: termcopy-${{ matrix.target }}.sha256
asset_content_type: text/plain