Document not found (404)
+This URL is invalid, sorry. Please use the navigation bar or search to continue.
+ +diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..f1731109 --- /dev/null +++ b/.nojekyll @@ -0,0 +1 @@ +This file makes sure that Github Pages doesn't process mdBook's output. diff --git a/404.html b/404.html new file mode 100644 index 00000000..fdaee17c --- /dev/null +++ b/404.html @@ -0,0 +1,190 @@ + + +
+ + +This URL is invalid, sorry. Please use the navigation bar or search to continue.
+ +Traditionally, the CI build environment has to be kept in sync with the
+project. If the project needs make
to build, the CI has to be configured to
+have it available. This can become quite tricky whenever a version requirement
+changes.
With devshell, the only dependency is Nix. Once the devshell is built, all the +dependencies are loaded into scope and automatically are in sync with the +current code checkout.
+The only dependency we need installed in the CI environment is Nix.
+Assuming that the shell.nix
file exists, the general approach is to build it
+with nix to get back the entrypoint script. And then executed that script with
+the commands.
For example, let's say that make
is being used to build the project.
The devshell.toml
would have it as part of its commands:
[[commands]]
+package = "gnumake"
+
+All the CI has to do, is this: nix-shell --run "$(nix-build shell.nix)/entrypoint make"
.
$(nix-build shell.nix)/entrypoint
outputs a path to the entrypoint scriptnix-shell --run
sets the required environment variables for the entrypoint script to work.make
as an argument. It loads the
+environment.Hercules CI is a Nix-based continuous integration and deployment service.
+If you haven't packaged your project with Nix or if a check can't run in the Nix sandbox, you can run it as an effect.
+ci.nix
let
+ shell = import ./shell.nix {};
+ pkgs = shell.pkgs;
+ effectsSrc =
+ builtins.fetchTarball "https://github.com/hercules-ci/hercules-ci-effects/archive/COMMIT_HASH.tar.gz";
+ inherit (import effectsSrc { inherit pkgs; }) effects;
+in
+{
+ inherit shell;
+ build = effects.mkEffect {
+ src = ./.;
+ effectScript = ''
+ go build
+ '';
+ inputs = [
+ shell.hook
+ ];
+ };
+}
+
+Replace COMMIT_HASH by the latest git sha from hercules-ci-effects
,
+or, if you prefer, you can bring effects
into scope using another pinning method.
The hci
command is available in nixos-21.05
and nixos-unstable
.
devshell.toml
[[commands]]
+package = "hci"
+
+Use hci effect run
. Following the previous example:
hci effect run build --no-token
+
+To build the shell itself on x86_64-linux
:
ci.nix
{
+ shell = import ./shell.nix {};
+
+ # ... any extra Nix packages you want to build; perhaps
+ # pkgs = import ./default.nix {} // { recurseForDerivations = true; };
+}
+
+system
If you build for multiple systems, pass system
:
import ./shell.nix { inherit system; };
+
+Add the following file to your project. Replace the <your build command>
+part with whatever is needed to build the project.
.github/workflows/devshell.yml
name: devshell
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ workflow_dispatch:
+jobs:
+ build:
+ strategy:
+ matrix:
+ os: [ ubuntu-20.04, macos-latest ]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v2
+ - uses: cachix/install-nix-action@v12
+ - uses: cachix/cachix-action@v8
+ with:
+ name: "<your cache here>"
+ signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
+ - run: |
+ source "$(nix-build shell.nix)"
+ <your build command>
+
+Add more CI-specific examples.
+ +This section describes a few environment variables that can influence the +behaviour of devshell.
+DEVSHELL_NO_MOTD=1
When that variable is set, devshell will not display the menu that is executed +on entrypoint.
+ +When the base modules that are provided by devshell are not enough, it is +possible to extend it.
+All the devshell.toml
schema options that are Declared in:
the extra/
+folder in the schema documentation are loaded on demand.
In order to load an extra module, use the <name>
in the import section. For
+example to make the locale
options available, import locale
:
devshell.toml
:
imports = ["locale"]
+
+Make sure to add this at the first statement in the file.
+Now that the module has been loaded, the devshell.toml
understands the
+locale
prefix:
imports = ["locale"]
+
+[locale]
+lang = "en_US.UTF-8"
+
+From a nix flake you would import it like
+imports = ["${devshell}/extra/locale.nix"];
+
+Building your own modules requires to understand the Nix language. If +this is too complicated, please reach out to the issue tracker and describe +your use-case. We want to be able to support a wide variety of development +scenario.
+In the same way as previously introduced, devshell will also load files that
+are relative to the devshell.toml
. For example:
imports = ["mymodule.nix"]
+
+Will load the mymodule.nix
file in the project repository and extend the
+devshell.toml
schema accordingly.
This project has a single dependency; Nix. It will be used to pull in all +other dependencies. It can be installed by following the instructions +over there: https://nixos.org/download.html#nix-quick-install
+Now that's done, got to your project root and create an empty devshell.toml
.
There are different ways to load that config depending on your preferences:
+Add another file called shell.nix
with the following content. This file will
+contain some nix code. Don't worry about the details.
{ system ? builtins.currentSystem }:
+let
+ src = fetchTarball "https://github.com/numtide/devshell/archive/main.tar.gz";
+ devshell = import src { inherit system; };
+in
+devshell.fromTOML ./devshell.toml
+
+++NOTE: it's probably a good idea to pin the dependency by replacing
+main
with a git commit ID.
Now you can enter the developer shell for the project:
+$ nix-shell
+warning: you did not specify '--add-root'; the result might be removed by the garbage collector
+these 4 derivations will be built:
+ /nix/store/nvbfq9h68r63k5jkfnbimny3b35sx0fs-devshell-bashrc.drv
+ /nix/store/ppfyf9zv023an8477hcbjlj0rbyvmwq7-devshell.env.drv
+ /nix/store/8027cgy3xcinb59aaynh899q953dnzms-devshell-bin.drv
+ /nix/store/w33zl180ni880p18sls5ykih88zkmkqk-devshell.drv
+building '/nix/store/nvbfq9h68r63k5jkfnbimny3b35sx0fs-devshell-bashrc.drv'...
+building '/nix/store/ppfyf9zv023an8477hcbjlj0rbyvmwq7-devshell-env.drv'...
+created 1 symlinks in user environment
+building '/nix/store/8027cgy3xcinb59aaynh899q953dnzms-devshell-bin.drv'...
+building '/nix/store/w33zl180ni880p18sls5ykih88zkmkqk-devshell.drv'...
+warning: you did not specify '--add-root'; the result might be removed by the garbage collector
+🔨 Welcome to devshell
+
+[general commands]
+
+ menu - prints this menu
+
+[devshell]$
+
+For users of nix flakes, a default template is provided to get you up and +running.
+nix flake new -t "github:numtide/devshell" project/
+
+cd project/
+
+# enter the shell
+nix develop # or `direnv allow` if you want to use direnv
+
+Environment variables that are specific to the project can be added with the
+[[env]]
declaration. Each environment variable is an entry in an array, and
+will be set in the order that they are declared.
Eg:
+[[env]]
+name = "GO111MODULE"
+value = "on"
+
+There are different ways to set the environment variables. Look at the schema +to find all the ways. But in short:
+value
key to set a fixed env var.eval
key to evaluate the value. This is useful when one env var
+depends on the value of another.prefix
key to prepend a path to an environment variable that uses
+the path separator. Like PATH
.Devshell also supports adding new commands to the environment. Those are +displayed on devshell entry so that the user knows what commands are available +to them.
+In order to bring in new dependencies, you can either add them to
+devshell.packages
or as an entry in the [[commands]]
list (see TOML docs). Commands are also added to the
+menu so they might be preferable for discoverability.
As an exercise, add the following snippet to your devshell.toml
:
[[commands]]
+package = "go"
+
+Then re-enter the shell with nix-shell
/nix develop
/direnv reload
. You should see something like this:
$ nix-shell
+warning: you did not specify '--add-root'; the result might be removed by the garbage collector
+these 4 derivations will be built:
+ /nix/store/nvbfq9h68r63k5jkfnbimny3b35sx0fs-devshell-bashrc.drv
+ /nix/store/ppfyf9zv023an8477hcbjlj0rbyvmwq7-devshell.env.drv
+ /nix/store/8027cgy3xcinb59aaynh899q953dnzms-devshell-bin.drv
+ /nix/store/w33zl180ni880p18sls5ykih88zkmkqk-devshell.drv
+building '/nix/store/nvbfq9h68r63k5jkfnbimny3b35sx0fs-devshell-bashrc.drv'...
+building '/nix/store/ppfyf9zv023an8477hcbjlj0rbyvmwq7-devshell-env.drv'...
+created 1 symlinks in user environment
+building '/nix/store/8027cgy3xcinb59aaynh899q953dnzms-devshell-bin.drv'...
+building '/nix/store/w33zl180ni880p18sls5ykih88zkmkqk-devshell.drv'...
+warning: you did not specify '--add-root'; the result might be removed by the garbage collector
+🔨 Welcome to devshell
+
+[general commands]
+
+ menu - prints this menu
+ go - The Go Programming language
+
+[devshell]$
+
+Now the go
program is available in the environment and can be used to
+develop Go programs. This can easily be adapted to any language.
Similarly, you could also add go to the packages list, in which case it would +not appear in the menu:
+[devshell]
+packages = [
+ "go"
+]
+
+Check out the Nix package repository.
+Note that it is also possible to use specific versions for some packages - e.g. for NodeJS, search the repo & use like this:
+[[commands]]
+package = "nodejs-17_x" # https://search.nixos.org/packages?type=packages&query=nodejs
+name = "node"
+help = "NodeJS"
+
+Or another example:
+[devshell]
+packages = [
+ "python27", # 2.7
+ "python311", # 3.11
+]
+
+Many projects need background services to be running during development or to +run tests (e.g. a database, caching server, webserver, ...). This is supported +in devshell through the concept of service groups.
+A service group defines a collection of long-running processes that can be +started and stopped.
+An example service group could be configured like this:
+[serviceGroups.database]
+description = "Runs a database in the backgroup"
+[serviceGroups.database.services.postgres]
+command = "postgres"
+[serviceGroups.database.services.memcached]
+command = "memcached"
+
+This will add two commands to the devshell: database:start
and
+database:stop
. database:start
starts the defined services in the database
+group in the foreground and shows their output. database:stop
can be executed
+in a different shell to stop the processes (or press Ctrl-C in the main shell).
devshell is extensible in many different ways. In the next chapters we will +discuss the various ways in which it can be adapted to your project's needs.
+ +STATUS: unstable
+It should not take more than 10 minutes from the time you clone a repo and can +start contributing.
+Unfortunately, an unbounded amount of time is usually spent installing build +dependencies on the system. If you are lucky, it's a pure $LANG project and +all it takes is to install that language and its dedicated package manager. On +bigger projects it's quite common to need more than one language to be +installed. The side-effect of that is that it creates silos withing companies, +and less contributors in the open-source world.
+It should be possible to run a single command that loads and makes those +dependencies available to the developer.
+And it should keep the scope of these dependencies at the project level, just +like virtualenv.
+These are the goals of this project.
+ +