Skip to content

Commit

Permalink
Merge pull request #16 from NixOS/automated-releases
Browse files Browse the repository at this point in the history
This sets up automated releases, mainly so that we can distribute a pre-built version of the tool, allowing Nixpkgs' CI to fetch it without building.
  • Loading branch information
philiptaron committed Mar 21, 2024
2 parents 0f556f9 + ce41249 commit adb1f8a
Show file tree
Hide file tree
Showing 4 changed files with 122 additions and 4 deletions.
3 changes: 0 additions & 3 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,6 @@ on:
pull_request:
branches:
- main
push:
branches:
- main

jobs:
check:
Expand Down
16 changes: 16 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: CD
on:
push:
branches:
- main

jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: cachix/install-nix-action@v26

- name: release
run: scripts/release.sh
4 changes: 3 additions & 1 deletion package.nix
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
}:
let
fs = lib.fileset;
version = (builtins.fromTOML (builtins.readFile ./Cargo.toml)).package.version;
in
rustPlatform.buildRustPackage {
name = "nixpkgs-check-by-name";
pname = "nixpkgs-check-by-name";
inherit version;
src = fs.toSource {
root = ./.;
fileset = fs.unions [
Expand Down
103 changes: 103 additions & 0 deletions scripts/release.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
#!/usr/bin/env bash

set -euo pipefail

tmp=$(mktemp -d)
trap 'rm -rf "$tmp"' exit

nixeval() {
# Since there's no stable `nix eval --raw`, also see https://github.com/NixOS/nix/pull/9361
nix-instantiate --eval --json "$@" | jq -r .
}

# The system to pre-build the release for and distribute artifacts for
system=x86_64-linux
root=$(git rev-parse --show-toplevel)
repository=${GITHUB_REPOSITORY:-NixOS/nixpkgs-check-by-name}

# Get the version from the Cargo.toml file
version=$(nixeval "$root" -A build.version)
echo "Current version is $version"

if existingRelease=$(gh api \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/"$repository"/releases/tags/"$version"); then
echo "Release $version already exists, no new release necessary"
exit 0
else
echo "$existingRelease"
echo "Release $version doesn't exist yet, creating it"
fi

echo "Building release artifact for system $system"

nix-build "$root" -A build -o "$tmp/build" >/dev/null
readarray -t closure < <(nix-store -qR "$tmp/build")
nix-store --export "${closure[@]}" > "$tmp/$system.nar"
gzip "$tmp/$system.nar"
artifactName=$system.nar.gz

body='Automated release.
The artifact is a gzip-compressed [Nix Archive](https://nixos.org/manual/nix/stable/command-ref/nix-store/export.html) of the [build closure](https://nixos.org/manual/nix/stable/glossary#gloss-closure).
To import it:
```bash
gzip -cd '"$artifactName"' | nix-store --import | tail -1
```
'

echo "Creating draft release"
if ! release=$(gh api \
--method POST \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/"$repository"/releases \
-f tag_name="$version" \
-f name="Version $version" \
-f body="$body" \
-F draft=true); then
echo "Failed to create release: $release"
fi

releaseId=$(jq .id <<< "$release")

abortRelease() {
echo "Aborting, deleting the draft release"
gh api \
--method DELETE \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/"$repository"/releases/"$releaseId"
exit 1
}

echo "Uploading release artifact"
# GitHub docs say to use the releases' upload_url, but that's of the RFC 6570 form, see
# https://docs.github.com/en/rest/using-the-rest-api/getting-started-with-the-rest-api?apiVersion=2022-11-28#hypermedia
# And neither the GitHub CLI nor curl seem to have support for that right now, so let's do it
# manually instead
if ! uploadResult=$(curl -sSfL \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer $(gh auth token)" \
-H "X-GitHub-Api-Version: 2022-11-28" \
-H "Content-Type: application/octet-stream" \
"https://uploads.github.com/repos/$repository/releases/$releaseId/assets?name=$artifactName" \
--data-binary "@$tmp/$artifactName"); then
echo "Failed to upload artifact: $uploadResult"
abortRelease
fi

if ! publishResult=$(gh api \
--method PATCH \
-H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
/repos/"$repository"/releases/"$releaseId" \
-F draft=false); then
echo "Failed to publish release: $publishResult"
abortRelease
fi

echo "Published release: $(jq .html_url -r <<< "$publishResult")"

0 comments on commit adb1f8a

Please sign in to comment.