Skip to content
Snippets Groups Projects
Commit 36b2a582 authored by Tom Prince's avatar Tom Prince
Browse files

Add script to update nixpkgs pin.

parent 0460bee9
No related branches found
No related tags found
2 merge requests!180merge develop into production,!165Add a script to update nixos version, and run it.
......@@ -39,6 +39,24 @@ Inside that is bin/nixos-test-driver which gives you a kind of REPL for interact
The kind of `Python in this testScript <https://whetstone.privatestorage.io/privatestorage/PrivateStorageio/-/blob/78881a3/nixos/modules/tests/private-storage.nix#L180>`_ is what you can enter into this REPL.
Consult the `official documentation on NixOS Tests <https://nixos.org/manual/nixos/stable/index.html#sec-nixos-tests>`_ for more information.
Updatings Pins
--------------
Nixpkgs
```````
To update the version of NixOS we deploy with, run:
.. code: shell
nix-shell --command 'tools/update-nixpkgs'
That will update ``nixpkgs-2015.json`` to the latest release on the nixos-21.05 channel.
To update the channel, the script will need to be updated,
along with the filenames that have the channel in them.
Architecture overview
---------------------
......
#!/usr/bin/env python
import argparse
import json
from pathlib import Path
import httpx
from ps_tools import get_url_hash
# We pass this to builtins.fetchTarball which only supports sha256
HASH_TYPE = "sha256"
DEFAULT_CHANNEL = "nixos-21.05"
CHANNEL_URL_TEMPLATE = "https://channels.nixos.org/{channel}/nixexprs.tar.xz"
def get_nixos_channel_url(*, channel):
"""
Get the URL for the current release of the given nixos channel.
`https://channels.nixos.org/<channel>` redirects to the path on
`https://releases.nixos.org` that corresponds to the current release
of that channel. This captures that redirect, so we can pin against
the release.
"""
response = httpx.head(
CHANNEL_URL_TEMPLATE.format(channel=channel), allow_redirects=False
)
response.raise_for_status()
assert response.is_redirect
return str(response.next_request.url)
def main():
parser = argparse.ArgumentParser(description="Update a pinned nixos repository.")
parser.add_argument(
"repo_file",
metavar="repo-file",
nargs="?",
default=Path(__file__).parent.with_name("nixpkgs-2105.json"),
type=Path,
help="JSON file with pinned configuration.",
)
parser.add_argument(
"--dry-run",
action="store_true",
)
parser.set_defaults(channel=DEFAULT_CHANNEL)
args = parser.parse_args()
repo_file = args.repo_file
config = json.loads(repo_file.read_text())
config["url"] = get_nixos_channel_url(channel=args.channel)
hash_data = get_url_hash(HASH_TYPE, name=config["name"], url=config["url"])
config["sha256"] = hash_data["outputHash"]
output = json.dumps(config, indent=2)
if args.dry_run:
print(output)
else:
repo_file.write_text(output)
if __name__ == "__main__":
main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment