139 lines
4.9 KiB
XML
139 lines
4.9 KiB
XML
|
<refentry>
|
||
|
<refnamediv>
|
||
|
<refname>nix-push</refname>
|
||
|
<refpurpose>push store paths onto a network cache</refpurpose>
|
||
|
</refnamediv>
|
||
|
|
||
|
<refsynopsisdiv>
|
||
|
<cmdsynopsis>
|
||
|
<command>nix-push</command>
|
||
|
<arg choice='plain'><replaceable>archives-put-url</replaceable></arg>
|
||
|
<arg choice='plain'><replaceable>archives-get-url</replaceable></arg>
|
||
|
<arg choice='plain'><replaceable>manifest-put-url</replaceable></arg>
|
||
|
<arg choice='plain' rep='repeat'><replaceable>paths</replaceable></arg>
|
||
|
</cmdsynopsis>
|
||
|
</refsynopsisdiv>
|
||
|
|
||
|
<refsection>
|
||
|
<title>Description</title>
|
||
|
|
||
|
<para>
|
||
|
The command <command>nix-push</command> builds a set of store
|
||
|
expressions (if necessary), and then packages and uploads all
|
||
|
store paths in the resulting closures to a server. A network
|
||
|
cache thus populated can subsequently be used to speed up
|
||
|
software deployment on other machines using the
|
||
|
<command>nix-pull</command> command.
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
<command>nix-push</command> performs the following actions.
|
||
|
|
||
|
<orderedlist>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
The store expressions stored in
|
||
|
<replaceable>paths</replaceable> are realised (using
|
||
|
<literal>nix-store --realise</literal>).
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
All paths in the closure of the store expressions stored
|
||
|
in <replaceable>paths</replaceable> are determined (using
|
||
|
<literal>nix-store --query --requisites
|
||
|
--include-successors</literal>). It should be noted that
|
||
|
since the <option>--include-successors</option> flag is
|
||
|
used, if you specify a derivation store expression, you
|
||
|
get a combined source/binary distribution. If you only
|
||
|
want a binary distribution, you should specify the closure
|
||
|
store expression that result from realising these (see
|
||
|
below).
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
All store paths determined in the previous step are
|
||
|
packaged and compressed into a <command>bzip</command>ped
|
||
|
NAR archive (extension <filename>.nar.bz2</filename>).
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
A <emphasis>manifest</emphasis> is created that contains
|
||
|
information on the store paths, their eventual URLs in the
|
||
|
cache, and cryptographic hashes of the contents of the NAR
|
||
|
archives.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
Each store path is uploaded to the remote directory
|
||
|
specified by <replaceable>archives-put-url</replaceable>.
|
||
|
HTTP PUT requests are used to do this. However, before a
|
||
|
file <varname>x</varname> is uploaded to
|
||
|
<literal><replaceable>archives-put-url</replaceable>/<varname>x</varname></literal>,
|
||
|
<command>nix-push</command> first determines whether this
|
||
|
upload is unnecessary by issuing a HTTP HEAD request on
|
||
|
<literal><replaceable>archives-get-url</replaceable>/<varname>x</varname></literal>.
|
||
|
This allows a cache to be shared between many partially
|
||
|
overlapping <command>nix-push</command> invocations.
|
||
|
(We use two URLs because the upload URL typically
|
||
|
refers to a CGI script, while the download URL just refers
|
||
|
to a file system directory on the server.)
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
<listitem>
|
||
|
<para>
|
||
|
The manifest is uploaded using an HTTP PUT request to
|
||
|
<replaceable>manifest-put-url</replaceable>. The
|
||
|
corresponding URL to download the manifest can then be
|
||
|
used by <command>nix-pull</command>.
|
||
|
</para>
|
||
|
</listitem>
|
||
|
|
||
|
</orderedlist>
|
||
|
</para>
|
||
|
|
||
|
</refsection>
|
||
|
|
||
|
<refsection>
|
||
|
<title>Examples</title>
|
||
|
|
||
|
<para>
|
||
|
To upload files there typically is some CGI script on the server
|
||
|
side. This script should be be protected with a password. The
|
||
|
following example uploads the store paths resulting from
|
||
|
building the Nix expressions in <filename>foo.nix</filename>,
|
||
|
passing appropriate authentication information:
|
||
|
|
||
|
<screen>
|
||
|
$ nix-push \
|
||
|
http://foo@bar:server.domain/cgi-bin/upload.pl/cache \
|
||
|
http://server.domain/cache \
|
||
|
http://foo@bar:server.domain/cgi-bin/upload.pl/MANIFEST \
|
||
|
$(nix-instantiate foo.nix)</screen>
|
||
|
|
||
|
This will push both sources and binaries (and any build-time
|
||
|
dependencies used in the build, such as compilers).
|
||
|
</para>
|
||
|
|
||
|
<para>
|
||
|
If we just want to push binaries, not sources and build-time
|
||
|
dependencies, we can do:
|
||
|
|
||
|
<screen>
|
||
|
$ nix-push <replaceable>urls</replaceable> $(nix-instantiate $(nix-store -r foo.nix))</screen>
|
||
|
|
||
|
</para>
|
||
|
|
||
|
</refsection>
|
||
|
|
||
|
</refentry>
|