Files
ccpkgs/README.md
2018-07-14 00:40:44 -04:00

286 lines
8.5 KiB
Markdown

# Overview
This repository overlays the [upstream nixpkgs-channels
repository](https://github.com/NixOS/nixpkgs-channels) with fixes and
additional packages to create a repository suitable for use on Compute
Canada HPC clusters. It is available to use by default on Compute
Canada clusters. It's layout is modelled after the upstream one.
# Using
The `nix` module must be loaded
```bash
module load nix
```
To update to the latest version of these packages (i.e., the last one
for which all overlays built successfully) do
```bash
nix-channel --update
```
This is safe to do as the prior version can always be returned to by
doing a rollback
```bash
nix-channel --rollback
```
The `nix-env` command can be used to install, update, or remove
packages from the environment.
## Installing
To install (or update) a package, specify the packages attribute to
`nix-env` using the `--attr` option
```bash
nix-env --install --attr nixpkgs.attribute
```
where `attribute` is replaced with the attribute that designates the
package (e.g., `emacs`).
## Removing
Removing a package requires knowing its name. Get this by querying
the current environment
```bash
nix-env --query
```
Then it can be uninstalled with the `--uninstall` options
```bash
nix-env --uninstall name
```
where `name` is a placeholder for the name returned by `--query`
(e.g., emacs).
## Reverting
These commands are always safe to do as they can always be undone by
doing a rollback
```bash
nix-env --rollback
```
## Using
A development environment consisting of a given set of packages can be
entered using the `nix-shell` command with the `--packages` option
(unlike `nix-env`, this automatically uses the `nixpkgs` channel)
```bash
nix-shell --packages attribute ...
```
Dependencies of non-installed packages are not tracked, so it is not
guaranteed that the specified packages will remain on the system for
more than the current day (nor does the fact that they sometimes
remain for more than a day imply they will always remain). Should
they be removed, rerunning the command will temporarily reinstall them
again.
# Developing
To add to this repository, `git clone` it into a local directory.
```bash
git clone https://git.computecanada.ca/nix/ccpkgs.git
cd ccpkgs
```
As it is an overlay, it also requires a matching release of the
upstream `nixpkgs-channels` repository. This should be cloned into
the *upsteam* subdirectory (if this directory does not it exist it
will use the current channel if it is the correct version)
```bash
git clone https://github.com/NixOS/nixpkgs-channels.git -b nixos-$(< .version) upstream
```
## Layout
Longer term items, like package additions, are put in the *pkgs*
subdirectory. Shorter term items, like temporary upstream
workarounds, are placed in the *temporary* subdirectory. The
*pkgs/all-packages.nix* and *temporary/all-temporary.nix* files are
applied as [overlays](https://nixos.org/nixpkgs/manual/#chap-overlays)
on top of the the upstream nixpkgs-channel. This means attributes
defined in them (first *all-temporary.nix* and then
*all-packages.nix*) will replace or augment attributes defined in
nixpkgs-channel.
Inside both of these files, the default scope is the final attribute
set (i.e., after all overlays have been applied). The final, prior
(before the file's overlays are applied), and next (after the file's
overlays are applied) attribute sets are also available under the
attributes `pkgs`, `super`, and `self`. Consider the `emacs`
attribute for example. `emacs` and `pkgs.emacs` refer to the final
`emacs` definition. The prior (before this overlay) definition is
available as `super.emacs`, and the next (after this overlay)
definition is available as `self.emacs`.
## Adding
Packages are added by creating an appropriate *pkgs/.../package.nix*
or, if additional patch files and such are required,
*pkgs/.../package/default.nix* expression, where `package` is a
placeholder for an appropriate name (e.g., `emacs`). This expression
is then assigned to an attribute by adding an
`attribute = callPackage ...` line to *pkgs/all-packages.nix*, where
`attribute` is replaced with the attribute that will designate the
package (e.g., `emacs`).
The easiest way to create the nix expression, is to look through the
existing overlay expressions, find one that is suitably close to what
is desired, and then duplicate and modify it. [Upstream
nixpkgs](https://github.com/NixOS/nixpkgs/tree/master/pkgs)
expressions can also be used as a starting point as they also follow
the exact same format.
More information on creating packages can be found in the [Nixpkgs
Contributor Guide](https://nixos.org/nixpkgs/manual/). More
information about the nix expression language itself can be found in
the [Nix Package Manager
Guide](https://nixos.org/nix/manual/#ch-expression-language).
## Testing
Nix expressions can be build from the top-level directory by using the
`nix-build` command. For example
```bash
nix-build --attr attribute
```
It is highly recommended to do this before pushing any changes to the
master repository as any breakage will prevent further releases of the
channel to the clusters until fixed.
## Debugging
The `nix-shell` command can be used to enter a non-sandboxed version
of the build environment from the top-level directory. Passing the
`--pure` option causes it to purge the environment (RHEL and Fedora do
not guard against multiple evaluations of the */etc/profile.d* scripts
via `__ETC_PROFILE_SOURCED` so this may not be 100% effective)
```bash
nix-shell --pure --attr attribute
```
`NIX_ENFORCE_PURITY` should be set in the entered environment to
enable additional checks against system libraries making it into the
build. The build and install locations should also be reset to
somewhere writable (e.g., */tmp*)
```bash
export NIX_ENFORCE_PURITY=1
NIX_BUILD_TOP=/tmp/nix-$USER
out=$NIX_BUILD_TOP/out
prefix=$out
```
```bash
mkdir -p "$NIX_BUILD_TOP" "$out"
cd "$NIX_BUILD_TOP"
```
After this, the standard [build
phases](https://nixos.org/nixpkgs/manual/#sec-stdenv-phases) can be
manually invoked and debugged
```bash
eval "${unpackPhase:-unpackPhase}"
cd "$sourceRoot"
```
```bash
eval "${patchPhase:-patchPhase}"
eval "${configurePhase:-configurePhase}"
eval "${buildPhase:-buildPhase}"
eval "${installPhase:-installPhase}"
```
where the above evaluates the `*Phase` environment variable if it
exists (the phase is overridden) or otherwise calls the standard
`*Phase` function (the phase is not overridden). In some extreme
cases it can be useful to look at the [actual
implementation](https://github.com/NixOS/nixpkgs/blob/master/pkgs/stdenv/generic/setup.sh)
of these functions and the `genericBuild` function which ties
them all together.
# Deployment
Both this repository and nixpkgs-channel are regularly checked for
updates by the [hydra server](https://hydra.sharcnet.ca). If a newer
version of either of these are found, the hydra server automatically
clones them and attempts to build all the overlays defined in
*pkgs/all-packages.nix* and *temporary/all-temporary.nix* and a channel
tarball too. The Compute Canada clusters monitor this process, and,
if it succeeds, download the channel tarball and make it available as
a new release.
This means deployment is as simple as doing (please prefix commits
message with `package: ...` as is done upstream)
```bash
git push
```
and waiting for a while (see the [hydra
server](https://hydra.sharcnet.ca/) to check on progress). Once it
propagates to the clusters, anyone can update to it by running
```bash
nix-channel --update
```
## Normal Changes
As mentioned in the [developing section](#testing), new or changed
attribute should first be test built before pushing changes upstream
```bash
nix-build --attr attribute
```
where `attribute` is replaced with the appropriate attribute (e.g.,
`emacs`).
## Sweeping Changes
The top-level *release.nix* expression contains the builds performed
by the hydra server. If significant changes have been made, these can
be manually tested before pushing
```bash
nix-build release.nix --arg stableBranch true --attr tested
```
A build of the channel tarball can also be done
```bash
nix-build release.nix --arg stableBranch true --attr channel
```
The resulting channel tarball can even be imported as new channel
and used the same as the default channel
```bash
nix-channel --add "file://$(echo "$PWD"/result/tarballs/*)" channel
nix-channel --update channel
nix-env --install --attr channel.attribute
```
where `channel` is a place holder for an arbitrary new channel name
(e.g., `test`) and `attribute` for some attribute (e.g., `emacs`).