Compare commits

...

34 Commits

Author SHA1 Message Date
73ea859441 check space 2020-05-13 14:09:20 +02:00
bc19d99f45 improve CI 2020-05-12 12:57:56 +02:00
ebed63b0a2 Allow installation path to redirect 2020-03-11 19:29:13 +01:00
5c21a08208 README: bump actions 2020-03-01 11:47:40 +01:00
9affe1ce81 Merge pull request #27 from cachix/revert-26-sandbox
Revert "Enable sandbox on darwin"
2020-02-26 19:23:19 +03:00
ef735e86b9 Revert "Enable sandbox on darwin" 2020-02-26 17:17:21 +01:00
4856b67e4a Merge pull request #26 from cachix/sandbox
Enable sandbox on darwin
2020-02-26 17:12:40 +03:00
6e3de2b50b Enable sandbox on darwin 2020-02-26 14:53:51 +01:00
d8ecc134bc Merge pull request #25 from cachix/rewrite-bash
rewrite to bash
2020-02-26 16:44:17 +03:00
dba72516a1 rewrite to bash 2020-02-26 14:23:08 +01:00
df989ac1d6 Merge pull request #24 from cachix/macos-spotlight
macos: disable spotlight
2020-02-26 13:43:37 +03:00
a5f8eada85 macos: disable spotlight 2020-02-26 11:21:33 +01:00
f57eb6b95e Merge pull request #23 from cachix/macos
MacOS fixes
2020-02-26 13:06:39 +03:00
033d472283 darwin: reliably wait for daemon connection 2020-02-24 13:20:47 +01:00
39c9ce7c86 macos: fix two issues 2020-02-24 10:09:32 +01:00
8b315ca141 bump 2019-11-20 15:39:17 +01:00
cd5893b2c6 Merge pull request #14 from cachix/multi-user-fixes
Multi user fixes
2019-11-19 17:47:10 +01:00
c9b9c77f3b wait for nix-daemon socket 2019-11-19 14:08:06 +01:00
16107722cd re-setup nix.conf after installation 2019-11-19 12:48:58 +01:00
9420096b1d allow binary caches for runner user 2019-11-19 12:48:58 +01:00
15adaed2d7 expose nix executables also for runner user 2019-11-19 12:48:58 +01:00
addc7fa7a2 Merge pull request #12 from cachix/sandbox
Turn on daemon (multi-user) mode
2019-11-19 11:29:33 +01:00
b8c38b583f Turn on daemon (multi-user) mode 2019-11-19 11:22:13 +01:00
d1407282e6 Merge pull request #9 from cachix/catalina
Catalina
2019-11-13 16:52:08 +01:00
9130accbad try out catalina fix 2019-11-13 16:47:37 +01:00
9c08345130 add shell.nix for easier development 2019-11-07 10:19:07 +01:00
4ad20b153f Fix Catalina 2019-11-07 10:18:56 +01:00
65ed8d8b59 README: bump 2019-10-03 17:40:55 +02:00
e3eb20c3db README: hint to action options 2019-10-03 17:27:13 +02:00
2b219c86f3 Merge pull request #8 from cachix/5-max-jobs
fix #5: set max-jobs = auto
2019-10-03 17:26:22 +02:00
ba979b5e7d fix #5: set max-jobs = auto 2019-10-03 17:23:24 +02:00
67bd092214 bump 2019-10-02 17:38:16 +02:00
f104d5a8aa Merge pull request #4 from cachix/fix-build-check
test that build produces no diff
2019-10-02 16:49:24 +02:00
d266f22fdb test that build produces no diff 2019-10-02 16:39:06 +02:00
8 changed files with 199 additions and 88 deletions

View File

@ -4,15 +4,7 @@ on:
push: push:
jobs: jobs:
tests: tests:
strategy: runs-on: ubuntu-latest
matrix:
os: [ubuntu-18.04, macos]
runs-on: ${{ matrix.os }}
steps: steps:
- uses: actions/checkout@v1 - run: sudo du -sh /var/*
- run: yarn install --frozen-lockfile - run: sudo du -sh /usr/*
- run: yarn build
- run: yarn test
- name: Install Nix
uses: ./
- run: nix-build test.nix

View File

@ -17,11 +17,14 @@ jobs:
tests: tests:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v1 - uses: actions/checkout@v2
- uses: cachix/install-nix-action@v1 - uses: cachix/install-nix-action@v7
- run: nix-build - run: nix-build
``` ```
See [action.yml](action.yml) for all options.
See also [cachix-action](https://github.com/cachix/cachix-action) for See also [cachix-action](https://github.com/cachix/cachix-action) for
simple binary cache setup to speed up your builds and share binaries simple binary cache setup to speed up your builds and share binaries
with developers. with developers.

102
lib/create-darwin-volume.sh Executable file
View File

@ -0,0 +1,102 @@
#!/usr/bin/env bash
set -e
root_disks() {
diskutil list -plist /
}
apfs_volumes_for() {
disk=$1
diskutil apfs list -plist "$disk"
}
disk_identifier() {
xpath "/plist/dict/key[text()='WholeDisks']/following-sibling::array[1]/string/text()" 2>/dev/null
}
volume_get() {
key=$1 i=$2
xpath "/plist/dict/array/dict/key[text()='Volumes']/following-sibling::array/dict[$i]/key[text()='$key']/following-sibling::string[1]/text()" 2> /dev/null
}
find_nix_volume() {
disk=$1
i=1
volumes=$(apfs_volumes_for "$disk")
while true; do
name=$(echo "$volumes" | volume_get "Name" "$i")
if [ -z "$name" ]; then
break
fi
case "$name" in
[Nn]ix*)
echo "$name"
break
;;
esac
i=$((i+1))
done
}
test_fstab() {
grep -q "/nix" /etc/fstab 2>/dev/null
}
test_synthetic_conf() {
grep -q "^nix" /etc/synthetic.conf 2>/dev/null
}
test_nix() {
test -d "/nix"
}
main() {
(
echo ""
echo " ------------------------------------------------------------------ "
echo " | This installer will create a volume for the nix store and |"
echo " | configure it to mount at /nix. Follow these steps to uninstall. |"
echo " ------------------------------------------------------------------ "
echo ""
echo " 1. Remove the entry from fstab using 'sudo vifs'"
echo " 2. Destroy the data volume using 'diskutil apfs deleteVolume'"
echo " 3. Delete /etc/synthetic.conf"
echo ""
) >&2
if [ -L "/nix" ]; then
echo "error: /nix is a symlink, please remove it or edit synthetic.conf (requires reboot)" >&2
echo " /nix -> $(readlink "/nix")" >&2
exit 2
fi
if ! test_synthetic_conf; then
echo "Configuring /etc/synthetic.conf..." >&2
echo nix | sudo tee /etc/synthetic.conf
/System/Library/Filesystems/apfs.fs/Contents/Resources/apfs.util -B
fi
if ! test_nix; then
echo "Creating mountpoint for /nix..." >&2
sudo mkdir /nix
fi
disk=$(root_disks | disk_identifier)
volume=$(find_nix_volume "$disk")
if [ -z "$volume" ]; then
echo "Creating a Nix Store volume..." >&2
sudo diskutil apfs addVolume "$disk" APFS 'Nix Store' -mountpoint /nix
volume="Nix Store"
else
echo "Using existing '$volume' volume" >&2
fi
if ! test_fstab; then
echo "Configuring /etc/fstab..." >&2
label=$(echo "$volume" | sed 's/ /\\040/g')
printf "\$a\nLABEL=%s /nix apfs rw\n.\nwq\n" "$label" | EDITOR=ed sudo vifs
sudo defaults write /Library/Preferences/SystemConfiguration/autodiskmount AutomountDisksWithoutUserLogin -bool true
fi
}
main "$@"

48
lib/install-nix.sh Executable file
View File

@ -0,0 +1,48 @@
#!/usr/bin/env bash
set -euo pipefail
export here=$(dirname "${BASH_SOURCE[0]}")
nixConf() {
sudo mkdir -p /etc/nix
# Workaround a segfault: https://github.com/NixOS/nix/issues/2733
sudo sh -c 'echo http2 = false >> /etc/nix/nix.conf'
# Set jobs to number of cores
sudo sh -c 'echo max-jobs = auto >> /etc/nix/nix.conf'
# Allow binary caches for runner user
sudo sh -c 'echo trusted-users = root runner >> /etc/nix/nix.conf'
}
if [[ $OSTYPE =~ darwin ]]; then
# Catalina workaround https://github.com/NixOS/nix/issues/2925
$here/create-darwin-volume.sh
# Disable spotlight indexing of /nix to speed up performance
sudo mdutil -i off /nix
fi
nixConf
# Needed due to multi-user being too defensive
export ALLOW_PREEXISTING_INSTALLATION=1
sh <(curl -L https://nixos.org/nix/install) --daemon
# write nix.conf again as installation overwrites it
nixConf
# macOS needs certificates hints
if [[ $OSTYPE =~ darwin ]]; then
cert_file=/nix/var/nix/profiles/default/etc/ssl/certs/ca-bundle.crt
echo "::set-env name=NIX_SSL_CERT_FILE::$cert_file"
export NIX_SSL_CERT_FILE=$cert_file
sudo launchctl setenv NIX_SSL_CERT_FILE "$cert_file"
fi
# Reload the daemon to pick up changes
sudo pkill -HUP nix-daemon
# Set paths
echo "::add-path::/nix/var/nix/profiles/per-user/runner/profile/bin"
echo "::add-path::/nix/var/nix/profiles/default/bin"
echo "::set-env name=NIX_PATH::/nix/var/nix/profiles/per-user/root/channels"

View File

@ -8,43 +8,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
step((generator = generator.apply(thisArg, _arguments || [])).next()); step((generator = generator.apply(thisArg, _arguments || [])).next());
}); });
}; };
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
result["default"] = mod;
return result;
};
Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "__esModule", { value: true });
const core = __importStar(require("@actions/core")); const child_process_1 = require("child_process");
const exec = __importStar(require("@actions/exec")); const process_1 = require("process");
const tc = __importStar(require("@actions/tool-cache")); const net_1 = require("net");
const os_1 = require("os"); function awaitSocket() {
const fs_1 = require("fs");
function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { const daemonSocket = net_1.createConnection({ path: '/nix/var/nix/daemon-socket/socket' });
const home = os_1.homedir(); daemonSocket.on('error', () => __awaiter(this, void 0, void 0, function* () {
const { username } = os_1.userInfo(); console.log('Waiting for daemon socket to be available, reconnecting...');
const PATH = process.env.PATH; yield new Promise(resolve => setTimeout(resolve, 500));
const CERTS_PATH = home + '/.nix-profile/etc/ssl/certs/ca-bundle.crt'; yield awaitSocket();
// Workaround a segfault: https://github.com/NixOS/nix/issues/2733 }));
yield exec.exec("sudo", ["mkdir", "-p", "/etc/nix"]); daemonSocket.on('connect', () => {
yield exec.exec("sudo", ["echo", "http2 = false", ">>", "/etc/nix/nix.conf"]); process_1.exit(0);
// TODO: retry due to all the things that go wrong });
const nixInstall = yield tc.downloadTool('https://nixos.org/nix/install');
yield exec.exec("sh", [nixInstall]);
core.exportVariable('PATH', `${PATH}:${home}/.nix-profile/bin`);
core.exportVariable('NIX_PATH', `/nix/var/nix/profiles/per-user/${username}/channels`);
// macOS needs certificates hints
if (fs_1.existsSync(CERTS_PATH)) {
core.exportVariable('NIX_SSL_CERT_FILE', CERTS_PATH);
}
}
catch (error) {
core.setFailed(`Action failed with error: ${error}`);
throw (error);
}
}); });
} }
run(); child_process_1.execFileSync(`${__dirname}/install-nix.sh`, { stdio: 'inherit' });
// nc doesn't work correctly on macOS :(
awaitSocket();

View File

@ -1,8 +0,0 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
function extrasperse(elem, array) {
const init = [];
return array.reduce((r, a) => r.concat(elem, a), init);
}
exports.extrasperse = extrasperse;
;

8
shell.nix Normal file
View File

@ -0,0 +1,8 @@
{ pkgs ? import <nixpkgs> {}
}:
pkgs.mkShell {
name = "install-nix-action-shell";
buildInputs = [ pkgs.yarn ];
}

View File

@ -1,34 +1,20 @@
import * as core from '@actions/core'; import { execFileSync } from 'child_process';
import * as exec from '@actions/exec'; import { exit } from 'process';
import * as tc from '@actions/tool-cache'; import { createConnection } from 'net';
import {homedir, userInfo} from 'os';
import {existsSync} from 'fs';
async function run() { async function awaitSocket() {
try { const daemonSocket = createConnection({ path: '/nix/var/nix/daemon-socket/socket' });
const home = homedir(); daemonSocket.on('error', async () => {
const {username} = userInfo(); console.log('Waiting for daemon socket to be available, reconnecting...');
const PATH = process.env.PATH; await new Promise(resolve => setTimeout(resolve, 500));
const CERTS_PATH = home + '/.nix-profile/etc/ssl/certs/ca-bundle.crt'; await awaitSocket();
});
// Workaround a segfault: https://github.com/NixOS/nix/issues/2733 daemonSocket.on('connect', () => {
await exec.exec("sudo", ["mkdir", "-p", "/etc/nix"]); exit(0);
await exec.exec("sudo", ["echo", "http2 = false", ">>", "/etc/nix/nix.conf"]); });
// TODO: retry due to all the things that go wrong
const nixInstall = await tc.downloadTool('https://nixos.org/nix/install');
await exec.exec("sh", [nixInstall]);
core.exportVariable('PATH', `${PATH}:${home}/.nix-profile/bin`)
core.exportVariable('NIX_PATH', `/nix/var/nix/profiles/per-user/${username}/channels`)
// macOS needs certificates hints
if (existsSync(CERTS_PATH)) {
core.exportVariable('NIX_SSL_CERT_FILE', CERTS_PATH);
}
} catch (error) {
core.setFailed(`Action failed with error: ${error}`);
throw(error);
}
} }
run(); execFileSync(`${__dirname}/install-nix.sh`, { stdio: 'inherit' });
// nc doesn't work correctly on macOS :(
awaitSocket();