Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion nixos/doc/manual/from_md/release-notes/rl-2305.section.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,22 @@
In addition to numerous new and upgraded packages, this release
has the following highlights:
</para>
<itemizedlist spacing="compact">
<itemizedlist>
<listitem>
<para>
Cinnamon has been updated to 5.6, see
<link xlink:href="https://github.com/NixOS/nixpkgs/pull/201328#issue-1449910204">the
pull request</link> for what is changed.
</para>
</listitem>
<listitem>
<para>
<literal>nixos-rebuild</literal> now supports an extra
<literal>--specialisation</literal> option that can be used to
change specialisation for <literal>switch</literal> and
<literal>test</literal> commands.
</para>
</listitem>
</itemizedlist>
</section>
<section xml:id="sec-release-23.05-new-services">
Expand Down
51 changes: 51 additions & 0 deletions nixos/doc/manual/man-nixos-rebuild.xml
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,18 @@
</group> <replaceable>name</replaceable>
</arg>

<arg>
<group choice='req'>
<arg choice='plain'>
<option>--specialisation</option>
</arg>

<arg choice='plain'>
<option>-c</option>
</arg>
</group> <replaceable>name</replaceable>
</arg>

<sbr />

<arg>
Expand Down Expand Up @@ -204,6 +216,20 @@
<command>nixos-rebuild switch</command> or <command>nixos-rebuild
boot</command> remain available in the GRUB menu.
</para>
<para>
Note that if you are using specializations, running just
<command>nixos-rebuild switch</command> will switch you back to the
unspecialized, base system - in that case, you might want to use this
instead:
<screen>
<prompt>$ </prompt>nixos-rebuild switch --specialisation your-specialisation-name
</screen>
This command will build all specialisations and make them bootable just
like regular <command>nixos-rebuild switch</command> does - the only
thing different is that it will switch to given specialisation instead
of the base system; it can be also used to switch from the base system
into a specialised one, or to switch between specialisations.
</para>
</listitem>
</varlistentry>

Expand Down Expand Up @@ -233,6 +259,16 @@
configuration resulting from the last call to <command>nixos-rebuild
switch</command> or <command>nixos-rebuild boot</command>).
</para>
<para>
Note that if you are using specialisations, running just
<command>nixos-rebuild test</command> will activate the unspecialised,
base system - in that case, you might want to use this instead:
<screen>
<prompt>$ </prompt>nixos-rebuild test --specialisation your-specialisation-name
</screen>
This command can be also used to switch from the base system into a
specialised one, or to switch between specialisations.
</para>
</listitem>
</varlistentry>

Expand Down Expand Up @@ -499,6 +535,21 @@
</listitem>
</varlistentry>

<varlistentry>
<term>
<option>--specialisation</option>
</term>
<term>
<option>-c</option>
</term>
<listitem>
<para>
Activates given specialisation; when not specified, switching and testing
will activate the base, unspecialised system.
</para>
</listitem>
</varlistentry>

<varlistentry>
<term>
<option>--build-host</option>
Expand Down
2 changes: 2 additions & 0 deletions nixos/doc/manual/release-notes/rl-2305.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ In addition to numerous new and upgraded packages, this release has the followin

- Cinnamon has been updated to 5.6, see [the pull request](https://github.com/NixOS/nixpkgs/pull/201328#issue-1449910204) for what is changed.

- `nixos-rebuild` now supports an extra `--specialisation` option that can be used to change specialisation for `switch` and `test` commands.

## New Services {#sec-release-23.05-new-services}

<!-- To avoid merge conflicts, consider adding your item at an arbitrary place in the list instead. -->
Expand Down
2 changes: 1 addition & 1 deletion nixos/tests/all-tests.nix
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,6 @@ in {
netdata = handleTest ./netdata.nix {};
networking.networkd = handleTest ./networking.nix { networkd = true; };
networking.scripted = handleTest ./networking.nix { networkd = false; };
specialisation = handleTest ./specialisation.nix {};
netbox = handleTest ./web-apps/netbox.nix {};
# TODO: put in networking.nix after the test becomes more complete
networkingProxy = handleTest ./networking-proxy.nix {};
Expand Down Expand Up @@ -464,6 +463,7 @@ in {
nix-serve-ssh = handleTest ./nix-serve-ssh.nix {};
nixops = handleTest ./nixops/default.nix {};
nixos-generate-config = handleTest ./nixos-generate-config.nix {};
nixos-rebuild-specialisations = handleTest ./nixos-rebuild-specialisations.nix {};
nixpkgs = pkgs.callPackage ../modules/misc/nixpkgs/test.nix { inherit evalMinimalConfig; };
node-red = handleTest ./node-red.nix {};
nomad = handleTest ./nomad.nix {};
Expand Down
131 changes: 131 additions & 0 deletions nixos/tests/nixos-rebuild-specialisations.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
import ./make-test-python.nix ({ pkgs, ... }: {
name = "nixos-rebuild-specialisations";

nodes = {
machine = { lib, pkgs, ... }: {
imports = [
../modules/profiles/installation-device.nix
../modules/profiles/base.nix
];

nix.settings = {
substituters = lib.mkForce [ ];
hashed-mirrors = null;
connect-timeout = 1;
};

system.extraDependencies = with pkgs; [
curl
desktop-file-utils
docbook5
docbook_xsl_ns
grub2
kmod.dev
libarchive
libarchive.dev
libxml2.bin
libxslt.bin
python3Minimal
shared-mime-info
stdenv
sudo
xorg.lndir
];

virtualisation = {
cores = 2;
memorySize = 2048;
};
};
};

testScript =
let
configFile = pkgs.writeText "configuration.nix" ''
{ lib, pkgs, ... }: {
imports = [
./hardware-configuration.nix
<nixpkgs/nixos/modules/testing/test-instrumentation.nix>
];

boot.loader.grub = {
enable = true;
device = "/dev/vda";
forceInstall = true;
};

documentation.enable = false;

environment.systemPackages = [
(pkgs.writeShellScriptBin "parent" "")
];

specialisation.foo = {
inheritParentConfig = true;

configuration = { ... }: {
environment.systemPackages = [
(pkgs.writeShellScriptBin "foo" "")
];
};
};

specialisation.bar = {
inheritParentConfig = true;

configuration = { ... }: {
environment.systemPackages = [
(pkgs.writeShellScriptBin "bar" "")
];
};
};
}
'';

in
''
machine.start()
machine.succeed("udevadm settle")
machine.wait_for_unit("multi-user.target")

machine.succeed("nixos-generate-config")
machine.copy_from_host(
"${configFile}",
"/etc/nixos/configuration.nix",
)

with subtest("Switch to the base system"):
machine.succeed("nixos-rebuild switch")
machine.succeed("parent")
machine.fail("foo")
machine.fail("bar")

with subtest("Switch from base system into a specialization"):
machine.succeed("nixos-rebuild switch --specialisation foo")
machine.succeed("parent")
machine.succeed("foo")
machine.fail("bar")

with subtest("Switch from specialization into another specialization"):
machine.succeed("nixos-rebuild switch -c bar")
machine.succeed("parent")
machine.fail("foo")
machine.succeed("bar")

with subtest("Switch from specialization into the base system"):
machine.succeed("nixos-rebuild switch")
machine.succeed("parent")
machine.fail("foo")
machine.fail("bar")

with subtest("Switch into specialization using `nixos-rebuild test`"):
machine.succeed("nixos-rebuild test --specialisation foo")
machine.succeed("parent")
machine.succeed("foo")
machine.fail("bar")

with subtest("Make sure nonsense command combinations are forbidden"):
machine.fail("nixos-rebuild boot --specialisation foo")
machine.fail("nixos-rebuild boot -c foo")
'';
})
43 changes: 0 additions & 43 deletions nixos/tests/specialisation.nix

This file was deleted.

3 changes: 2 additions & 1 deletion pkgs/os-specific/linux/nixos-rebuild/default.nix
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ substituteAll {

# run some a simple installer tests to make sure nixos-rebuild still works for them
passthru.tests = {
simple-installer-test = nixosTests.installer.simple;
simple-installer = nixosTests.installer.simple;
specialisations = nixosTests.nixos-rebuild-specialisations;
};

meta = {
Expand Down
26 changes: 25 additions & 1 deletion pkgs/os-specific/linux/nixos-rebuild/nixos-rebuild.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ rollback=
upgrade=
upgrade_all=
profile=/nix/var/nix/profiles/system
specialisation=
buildHost=
targetHost=
remoteSudo=
Expand Down Expand Up @@ -107,6 +108,14 @@ while [ "$#" -gt 0 ]; do
fi
shift 1
;;
--specialisation|-c)
if [ -z "$1" ]; then
log "$0: ‘--specialisation’ requires an argument"
exit 1
fi
specialisation="$1"
shift 1
;;
--build-host|h)
buildHost="$1"
shift 1
Expand Down Expand Up @@ -365,6 +374,10 @@ if [[ -n $flake ]]; then
fi
fi

if [[ ! -z "$specialisation" && ! "$action" = switch && ! "$action" = test ]]; then
log "error: ‘--specialisation’ can only be used with ‘switch’ and ‘test’"
exit 1
fi

tmpDir=$(mktemp -t -d nixos-rebuild.XXXXXX)

Expand Down Expand Up @@ -559,7 +572,18 @@ fi
# If we're not just building, then make the new configuration the boot
# default and/or activate it now.
if [[ "$action" = switch || "$action" = boot || "$action" = test || "$action" = dry-activate ]]; then
if ! targetHostCmd "$pathToConfig/bin/switch-to-configuration" "$action"; then
if [[ -z "$specialisation" ]]; then
cmd="$pathToConfig/bin/switch-to-configuration"
else
cmd="$pathToConfig/specialisation/$specialisation/bin/switch-to-configuration"

if [[ ! -f "$cmd" ]]; then
log "error: specialisation not found: $specialisation"
exit 1
fi
fi

if ! targetHostCmd "$cmd" "$action"; then
log "warning: error(s) occurred while switching to the new configuration"
exit 1
fi
Expand Down