Release #13
This file contains hidden or 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
| 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 |