guix.scm 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914
  1. ;;; GNU Guix --- Functional package management for GNU
  2. ;;; Copyright © 2019, 2020, 2021, 2022 Christopher Baines <mail@cbaines.net>
  3. ;;;
  4. ;;; This file is part of GNU Guix.
  5. ;;;
  6. ;;; GNU Guix is free software; you can redistribute it and/or modify
  7. ;;; it under the terms of the GNU General Public License as published by
  8. ;;; the Free Software Foundation, either version 3 of the License, or
  9. ;;; (at your option) any later version.
  10. ;;;
  11. ;;; GNU Guix is distributed in the hope that it will be useful,
  12. ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. ;;; GNU General Public License for more details.
  15. ;;;
  16. ;;; You should have received a copy of the GNU General Public License
  17. ;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
  18. (define-module (gnu services guix)
  19. #:use-module (srfi srfi-1)
  20. #:use-module (ice-9 match)
  21. #:use-module (guix gexp)
  22. #:use-module (guix records)
  23. #:use-module (guix packages)
  24. #:use-module ((gnu packages base)
  25. #:select (glibc-utf8-locales))
  26. #:use-module (gnu packages admin)
  27. #:use-module (gnu packages databases)
  28. #:use-module (gnu packages web)
  29. #:use-module (gnu packages guile)
  30. #:use-module (gnu packages guile-xyz)
  31. #:use-module (gnu packages package-management)
  32. #:use-module (gnu services)
  33. #:use-module (gnu services base)
  34. #:use-module (gnu services admin)
  35. #:use-module (gnu services shepherd)
  36. #:use-module (gnu services getmail)
  37. #:use-module (gnu system shadow)
  38. #:export (guix-build-coordinator-configuration
  39. guix-build-coordinator-configuration?
  40. guix-build-coordinator-configuration-package
  41. guix-build-coordinator-configuration-user
  42. guix-build-coordinator-configuration-group
  43. guix-build-coordinator-configuration-datastore-uri-string
  44. guix-build-coordinator-configuration-agent-communication-uri-string
  45. guix-build-coordinator-configuration-client-communication-uri-string
  46. guix-build-coordinator-configuration-allocation-strategy
  47. guix-build-coordinator-configuration-hooks
  48. guix-build-coordinator-configuration-parallel-hooks
  49. guix-build-coordinator-configuration-guile
  50. guix-build-coordinator-service-type
  51. guix-build-coordinator-agent-configuration
  52. guix-build-coordinator-agent-configuration?
  53. guix-build-coordinator-agent-configuration-package
  54. guix-build-coordinator-agent-configuration-user
  55. guix-build-coordinator-agent-configuration-coordinator
  56. guix-build-coordinator-agent-configuration-authentication
  57. guix-build-coordinator-agent-configuration-systems
  58. guix-build-coordinator-agent-configuration-max-parallel-builds
  59. guix-build-coordinator-agent-configuration-max-1min-load-average
  60. guix-build-coordinator-agent-configuration-derivation-substitute-urls
  61. guix-build-coordinator-agent-configuration-non-derivation-substitute-urls
  62. guix-build-coordinator-agent-password-auth
  63. guix-build-coordinator-agent-password-auth?
  64. guix-build-coordinator-agent-password-auth-uuid
  65. guix-build-coordinator-agent-password-auth-password
  66. guix-build-coordinator-agent-password-file-auth
  67. guix-build-coordinator-agent-password-file-auth?
  68. guix-build-coordinator-agent-password-file-auth-uuid
  69. guix-build-coordinator-agent-password-file-auth-password-file
  70. guix-build-coordinator-agent-dynamic-auth
  71. guix-build-coordinator-agent-dynamic-auth?
  72. guix-build-coordinator-agent-dynamic-auth-agent-name
  73. guix-build-coordinator-agent-dynamic-auth-token
  74. guix-build-coordinator-agent-dynamic-auth-with-file
  75. guix-build-coordinator-agent-dynamic-auth-with-file?
  76. guix-build-coordinator-agent-dynamic-auth-with-file-agent-name
  77. guix-build-coordinator-agent-dynamic-auth-with-file-token-file
  78. guix-build-coordinator-agent-service-type
  79. guix-build-coordinator-queue-builds-configuration
  80. guix-build-coordinator-queue-builds-configuration?
  81. guix-build-coordinator-queue-builds-configuration-package
  82. guix-build-coordinator-queue-builds-configuration-user
  83. guix-build-coordinator-queue-builds-coordinator
  84. guix-build-coordinator-queue-builds-configuration-systems
  85. guix-build-coordinator-queue-builds-configuration-system-and-targets
  86. guix-build-coordinator-queue-builds-configuration-guix-data-service
  87. guix-build-coordinator-queue-builds-configuration-guix-data-service-build-server-id
  88. guix-build-coordinator-queue-builds-configuration-processed-commits-file
  89. guix-build-coordinator-queue-builds-service-type
  90. <guix-data-service-configuration>
  91. guix-data-service-configuration
  92. guix-data-service-configuration?
  93. guix-data-service-package
  94. guix-data-service-user
  95. guix-data-service-group
  96. guix-data-service-port
  97. guix-data-service-host
  98. guix-data-service-getmail-idle-mailboxes
  99. guix-data-service-commits-getmail-retriever-configuration
  100. guix-data-service-type
  101. nar-herder-service-type
  102. nar-herder-configuration
  103. nar-herder-configuration?
  104. nar-herder-configuration-package
  105. nar-herder-configuration-user
  106. nar-herder-configuration-group
  107. nar-herder-configuration-mirror
  108. nar-herder-configuration-database
  109. nar-herder-configuration-database-dump
  110. nar-herder-configuration-host
  111. nar-herder-configuration-port
  112. nar-herder-configuration-storage
  113. nar-herder-configuration-storage-limit
  114. nar-herder-configuration-storage-nar-removal-criteria
  115. nar-herder-configuration-log-level))
  116. ;;;; Commentary:
  117. ;;;
  118. ;;; Services specifically related to GNU Guix.
  119. ;;;
  120. ;;;; Code:
  121. (define-record-type* <guix-build-coordinator-configuration>
  122. guix-build-coordinator-configuration make-guix-build-coordinator-configuration
  123. guix-build-coordinator-configuration?
  124. (package guix-build-coordinator-configuration-package
  125. (default guix-build-coordinator))
  126. (user guix-build-coordinator-configuration-user
  127. (default "guix-build-coordinator"))
  128. (group guix-build-coordinator-configuration-group
  129. (default "guix-build-coordinator"))
  130. (database-uri-string
  131. guix-build-coordinator-configuration-datastore-uri-string
  132. (default "sqlite:///var/lib/guix-build-coordinator/guix_build_coordinator.db"))
  133. (agent-communication-uri-string
  134. guix-build-coordinator-configuration-agent-communication-uri-string
  135. (default "http://0.0.0.0:8745"))
  136. (client-communication-uri-string
  137. guix-build-coordinator-configuration-client-communication-uri-string
  138. (default "http://127.0.0.1:8746"))
  139. (allocation-strategy
  140. guix-build-coordinator-configuration-allocation-strategy
  141. (default #~basic-build-allocation-strategy))
  142. (hooks guix-build-coordinator-configuration-hooks
  143. (default '()))
  144. (parallel-hooks guix-build-coordinator-configuration-parallel-hooks
  145. (default '()))
  146. (guile guix-build-coordinator-configuration-guile
  147. (default guile-3.0-latest)))
  148. (define-record-type* <guix-build-coordinator-agent-configuration>
  149. guix-build-coordinator-agent-configuration
  150. make-guix-build-coordinator-agent-configuration
  151. guix-build-coordinator-agent-configuration?
  152. (package guix-build-coordinator-agent-configuration-package
  153. (default guix-build-coordinator/agent-only))
  154. (user guix-build-coordinator-agent-configuration-user
  155. (default "guix-build-coordinator-agent"))
  156. (coordinator guix-build-coordinator-agent-configuration-coordinator
  157. (default "http://localhost:8745"))
  158. (authentication guix-build-coordinator-agent-configuration-authentication)
  159. (systems guix-build-coordinator-agent-configuration-systems
  160. (default #f))
  161. (max-parallel-builds
  162. guix-build-coordinator-agent-configuration-max-parallel-builds
  163. (default 1))
  164. (max-1min-load-average
  165. guix-build-coordinator-agent-configuration-max-1min-load-average
  166. (default #f))
  167. (derivation-substitute-urls
  168. guix-build-coordinator-agent-configuration-derivation-substitute-urls
  169. (default #f))
  170. (non-derivation-substitute-urls
  171. guix-build-coordinator-agent-configuration-non-derivation-substitute-urls
  172. (default #f)))
  173. (define-record-type* <guix-build-coordinator-agent-password-auth>
  174. guix-build-coordinator-agent-password-auth
  175. make-guix-build-coordinator-agent-password-auth
  176. guix-build-coordinator-agent-password-auth?
  177. (uuid guix-build-coordinator-agent-password-auth-uuid)
  178. (password guix-build-coordinator-agent-password-auth-password))
  179. (define-record-type* <guix-build-coordinator-agent-password-file-auth>
  180. guix-build-coordinator-agent-password-file-auth
  181. make-guix-build-coordinator-agent-password-file-auth
  182. guix-build-coordinator-agent-password-file-auth?
  183. (uuid guix-build-coordinator-agent-password-file-auth-uuid)
  184. (password-file
  185. guix-build-coordinator-agent-password-file-auth-password-file))
  186. (define-record-type* <guix-build-coordinator-agent-dynamic-auth>
  187. guix-build-coordinator-agent-dynamic-auth
  188. make-guix-build-coordinator-agent-dynamic-auth
  189. guix-build-coordinator-agent-dynamic-auth?
  190. (agent-name guix-build-coordinator-agent-dynamic-auth-agent-name)
  191. (token guix-build-coordinator-agent-dynamic-auth-token))
  192. (define-record-type* <guix-build-coordinator-agent-dynamic-auth-with-file>
  193. guix-build-coordinator-agent-dynamic-auth-with-file
  194. make-guix-build-coordinator-agent-dynamic-auth-with-file
  195. guix-build-coordinator-agent-dynamic-auth-with-file?
  196. (agent-name guix-build-coordinator-agent-dynamic-auth-with-file-agent-name)
  197. (token-file guix-build-coordinator-agent-dynamic-auth-with-file-token-file))
  198. (define-record-type* <guix-build-coordinator-queue-builds-configuration>
  199. guix-build-coordinator-queue-builds-configuration
  200. make-guix-build-coordinator-queue-builds-configuration
  201. guix-build-coordinator-queue-builds-configuration?
  202. (package guix-build-coordinator-queue-builds-configuration-package
  203. (default guix-build-coordinator))
  204. (user guix-build-coordinator-queue-builds-configuration-user
  205. (default "guix-build-coordinator-queue-builds"))
  206. (coordinator guix-build-coordinator-queue-builds-coordinator
  207. (default "http://localhost:8746"))
  208. (systems guix-build-coordinator-queue-builds-configuration-systems
  209. (default #f))
  210. (systems-and-targets
  211. guix-build-coordinator-queue-builds-configuration-system-and-targets
  212. (default #f))
  213. (guix-data-service
  214. guix-build-coordinator-queue-builds-configuration-guix-data-service
  215. (default "https://data.guix.gnu.org"))
  216. (guix-data-service-build-server-id
  217. guix-build-coordinator-queue-builds-configuration-guix-data-service-build-server-id
  218. (default #f))
  219. (processed-commits-file
  220. guix-build-coordinator-queue-builds-configuration-processed-commits-file
  221. (default "/var/cache/guix-build-coordinator-queue-builds/processed-commits")))
  222. (define* (make-guix-build-coordinator-start-script database-uri-string
  223. allocation-strategy
  224. pid-file
  225. guix-build-coordinator-package
  226. #:key
  227. agent-communication-uri-string
  228. client-communication-uri-string
  229. (hooks '())
  230. (parallel-hooks '())
  231. (guile guile-3.0))
  232. (program-file
  233. "start-guix-build-coordinator"
  234. (with-extensions (cons guix-build-coordinator-package
  235. ;; This is a poorly constructed Guile load path,
  236. ;; since it contains things that aren't Guile
  237. ;; libraries, but it means that the Guile libraries
  238. ;; needed for the Guix Build Coordinator don't need
  239. ;; to be individually specified here.
  240. (append
  241. (map second (package-inputs
  242. guix-build-coordinator-package))
  243. (map second (package-propagated-inputs
  244. guix-build-coordinator-package))))
  245. #~(begin
  246. (use-modules (srfi srfi-1)
  247. (ice-9 match)
  248. (web uri)
  249. (prometheus)
  250. (guix-build-coordinator hooks)
  251. (guix-build-coordinator datastore)
  252. (guix-build-coordinator build-allocator)
  253. (guix-build-coordinator coordinator))
  254. (setvbuf (current-output-port) 'line)
  255. (setvbuf (current-error-port) 'line)
  256. (simple-format #t "starting the guix-build-coordinator:\n ~A\n"
  257. (current-filename))
  258. (let* ((metrics-registry (make-metrics-registry
  259. #:namespace
  260. "guixbuildcoordinator"))
  261. (datastore (database-uri->datastore
  262. #$database-uri-string
  263. #:metrics-registry metrics-registry))
  264. (hooks
  265. (list #$@(map (match-lambda
  266. ((name . hook-gexp)
  267. #~(cons '#$name #$hook-gexp)))
  268. hooks)))
  269. (hooks-with-defaults
  270. `(,@hooks
  271. ,@(remove (match-lambda
  272. ((name . _) (assq-ref hooks name)))
  273. %default-hooks)))
  274. (build-coordinator (make-build-coordinator
  275. #:datastore datastore
  276. #:hooks hooks-with-defaults
  277. #:metrics-registry metrics-registry
  278. #:allocation-strategy #$allocation-strategy)))
  279. (run-coordinator-service
  280. build-coordinator
  281. #:update-datastore? #t
  282. #:pid-file #$pid-file
  283. #:agent-communication-uri (string->uri
  284. #$agent-communication-uri-string)
  285. #:client-communication-uri (string->uri
  286. #$client-communication-uri-string)
  287. #:parallel-hooks (list #$@(map (match-lambda
  288. ((name . val)
  289. #~(cons '#$name #$val)))
  290. parallel-hooks))))))
  291. #:guile guile))
  292. (define (guix-build-coordinator-shepherd-services config)
  293. (match-record config <guix-build-coordinator-configuration>
  294. (package user group database-uri-string
  295. agent-communication-uri-string
  296. client-communication-uri-string
  297. allocation-strategy
  298. hooks
  299. parallel-hooks
  300. guile)
  301. (list
  302. (shepherd-service
  303. (documentation "Guix Build Coordinator")
  304. (provision '(guix-build-coordinator))
  305. (requirement '(networking))
  306. (start #~(make-forkexec-constructor
  307. (list #$(make-guix-build-coordinator-start-script
  308. database-uri-string
  309. allocation-strategy
  310. "/var/run/guix-build-coordinator/pid"
  311. package
  312. #:agent-communication-uri-string
  313. agent-communication-uri-string
  314. #:client-communication-uri-string
  315. client-communication-uri-string
  316. #:hooks hooks
  317. #:parallel-hooks parallel-hooks
  318. #:guile guile))
  319. #:user #$user
  320. #:group #$group
  321. #:pid-file "/var/run/guix-build-coordinator/pid"
  322. ;; Allow time for migrations to run
  323. #:pid-file-timeout 60
  324. #:environment-variables
  325. `(,(string-append
  326. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  327. "LC_ALL=en_US.utf8"
  328. "PATH=/run/current-system/profile/bin") ; for hooks
  329. #:log-file "/var/log/guix-build-coordinator/coordinator.log"))
  330. (stop #~(make-kill-destructor))))))
  331. (define (guix-build-coordinator-activation config)
  332. #~(begin
  333. (use-modules (guix build utils))
  334. (define %user
  335. (getpw #$(guix-build-coordinator-configuration-user
  336. config)))
  337. (chmod "/var/lib/guix-build-coordinator" #o755)
  338. (mkdir-p "/var/log/guix-build-coordinator")
  339. ;; Allow writing the PID file
  340. (mkdir-p "/var/run/guix-build-coordinator")
  341. (chown "/var/run/guix-build-coordinator"
  342. (passwd:uid %user)
  343. (passwd:gid %user))))
  344. (define (guix-build-coordinator-account config)
  345. (match-record config <guix-build-coordinator-configuration>
  346. (user group)
  347. (list (user-group
  348. (name group)
  349. (system? #t))
  350. (user-account
  351. (name user)
  352. (group group)
  353. (system? #t)
  354. (comment "Guix Build Coordinator user")
  355. (home-directory "/var/lib/guix-build-coordinator")
  356. (shell (file-append shadow "/sbin/nologin"))))))
  357. (define guix-build-coordinator-service-type
  358. (service-type
  359. (name 'guix-build-coordinator)
  360. (extensions
  361. (list
  362. (service-extension shepherd-root-service-type
  363. guix-build-coordinator-shepherd-services)
  364. (service-extension activation-service-type
  365. guix-build-coordinator-activation)
  366. (service-extension account-service-type
  367. guix-build-coordinator-account)))
  368. (default-value
  369. (guix-build-coordinator-configuration))
  370. (description
  371. "Run an instance of the Guix Build Coordinator.")))
  372. (define (guix-build-coordinator-agent-shepherd-services config)
  373. (match-record config <guix-build-coordinator-agent-configuration>
  374. (package user coordinator authentication max-parallel-builds
  375. max-1min-load-average
  376. derivation-substitute-urls non-derivation-substitute-urls
  377. systems)
  378. (list
  379. (shepherd-service
  380. (documentation "Guix Build Coordinator Agent")
  381. (provision '(guix-build-coordinator-agent))
  382. (requirement '(networking))
  383. (start #~(make-forkexec-constructor
  384. (list #$(file-append package "/bin/guix-build-coordinator-agent")
  385. #$(string-append "--coordinator=" coordinator)
  386. #$@(match authentication
  387. (($ <guix-build-coordinator-agent-password-auth>
  388. uuid password)
  389. #~(#$(string-append "--uuid=" uuid)
  390. #$(string-append "--password=" password)))
  391. (($ <guix-build-coordinator-agent-password-file-auth>
  392. uuid password-file)
  393. #~(#$(string-append "--uuid=" uuid)
  394. #$(string-append "--password-file="
  395. password-file)))
  396. (($ <guix-build-coordinator-agent-dynamic-auth>
  397. agent-name token)
  398. #~(#$(string-append "--name=" agent-name)
  399. #$(string-append "--dynamic-auth-token=" token)))
  400. (($
  401. <guix-build-coordinator-agent-dynamic-auth-with-file>
  402. agent-name token-file)
  403. #~(#$(string-append "--name=" agent-name)
  404. #$(string-append "--dynamic-auth-token-file="
  405. token-file))))
  406. #$(simple-format #f "--max-parallel-builds=~A"
  407. max-parallel-builds)
  408. #$@(if max-1min-load-average
  409. #~(#$(simple-format #f "--max-1min-load-average=~A"
  410. max-1min-load-average))
  411. #~())
  412. #$@(if derivation-substitute-urls
  413. #~(#$(string-append
  414. "--derivation-substitute-urls="
  415. (string-join derivation-substitute-urls " ")))
  416. #~())
  417. #$@(if non-derivation-substitute-urls
  418. #~(#$(string-append
  419. "--non-derivation-substitute-urls="
  420. (string-join non-derivation-substitute-urls " ")))
  421. #~())
  422. #$@(map (lambda (system)
  423. (string-append "--system=" system))
  424. (or systems '())))
  425. #:user #$user
  426. #:environment-variables
  427. `(,(string-append
  428. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  429. ;; XDG_CACHE_HOME is used by Guix when caching narinfo files
  430. "XDG_CACHE_HOME=/var/cache/guix-build-coordinator-agent"
  431. "LC_ALL=en_US.utf8")
  432. #:log-file "/var/log/guix-build-coordinator/agent.log"))
  433. (stop #~(make-kill-destructor))))))
  434. (define (guix-build-coordinator-agent-activation config)
  435. #~(begin
  436. (use-modules (guix build utils))
  437. (define %user
  438. (getpw #$(guix-build-coordinator-agent-configuration-user
  439. config)))
  440. (mkdir-p "/var/log/guix-build-coordinator")
  441. ;; Create a cache directory for storing narinfo files if downloaded
  442. (mkdir-p "/var/cache/guix-build-coordinator-agent")
  443. (chown "/var/cache/guix-build-coordinator-agent"
  444. (passwd:uid %user)
  445. (passwd:gid %user))))
  446. (define (guix-build-coordinator-agent-account config)
  447. (list (user-account
  448. (name (guix-build-coordinator-agent-configuration-user config))
  449. (group "nogroup")
  450. (system? #t)
  451. (comment "Guix Build Coordinator agent user")
  452. (home-directory "/var/empty")
  453. (shell (file-append shadow "/sbin/nologin")))))
  454. (define guix-build-coordinator-agent-service-type
  455. (service-type
  456. (name 'guix-build-coordinator-agent)
  457. (extensions
  458. (list
  459. (service-extension shepherd-root-service-type
  460. guix-build-coordinator-agent-shepherd-services)
  461. (service-extension activation-service-type
  462. guix-build-coordinator-agent-activation)
  463. (service-extension account-service-type
  464. guix-build-coordinator-agent-account)))
  465. (description
  466. "Run a Guix Build Coordinator agent.")))
  467. (define (guix-build-coordinator-queue-builds-shepherd-services config)
  468. (match-record config <guix-build-coordinator-queue-builds-configuration>
  469. (package user coordinator systems systems-and-targets
  470. guix-data-service
  471. guix-data-service-build-server-id
  472. processed-commits-file)
  473. (list
  474. (shepherd-service
  475. (documentation "Guix Build Coordinator queue builds from Guix Data Service")
  476. (provision '(guix-build-coordinator-queue-builds))
  477. (requirement '(networking))
  478. (start
  479. #~(make-forkexec-constructor
  480. (list
  481. #$(file-append
  482. package
  483. "/bin/guix-build-coordinator-queue-builds-from-guix-data-service")
  484. #$(string-append "--coordinator=" coordinator)
  485. #$@(map (lambda (system)
  486. (string-append "--system=" system))
  487. (or systems '()))
  488. #$@(map (match-lambda
  489. ((system . target)
  490. (string-append "--system-and-target=" system "=" target)))
  491. (or systems-and-targets '()))
  492. #$@(if guix-data-service
  493. #~(#$(string-append "--guix-data-service=" guix-data-service))
  494. #~())
  495. #$@(if guix-data-service-build-server-id
  496. #~(#$(simple-format
  497. #f
  498. "--guix-data-service-build-server-id=~A"
  499. guix-data-service-build-server-id))
  500. #~())
  501. #$@(if processed-commits-file
  502. #~(#$(string-append "--processed-commits-file="
  503. processed-commits-file))
  504. #~()))
  505. #:user #$user
  506. #:environment-variables
  507. `(,(string-append
  508. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  509. "LC_ALL=en_US.utf8")
  510. #:log-file "/var/log/guix-build-coordinator/queue-builds.log"))
  511. (stop #~(make-kill-destructor))))))
  512. (define (guix-build-coordinator-queue-builds-activation config)
  513. #~(begin
  514. (use-modules (guix build utils))
  515. (define %user
  516. (getpw #$(guix-build-coordinator-queue-builds-configuration-user
  517. config)))
  518. (mkdir-p "/var/log/guix-build-coordinator")
  519. ;; Allow writing the processed commits file
  520. (mkdir-p "/var/cache/guix-build-coordinator-queue-builds")
  521. (chown "/var/cache/guix-build-coordinator-queue-builds"
  522. (passwd:uid %user)
  523. (passwd:gid %user))))
  524. (define (guix-build-coordinator-queue-builds-account config)
  525. (list (user-account
  526. (name (guix-build-coordinator-queue-builds-configuration-user config))
  527. (group "nogroup")
  528. (system? #t)
  529. (comment "Guix Build Coordinator queue-builds user")
  530. (home-directory "/var/empty")
  531. (shell (file-append shadow "/sbin/nologin")))))
  532. (define guix-build-coordinator-queue-builds-service-type
  533. (service-type
  534. (name 'guix-build-coordinator-queue-builds)
  535. (extensions
  536. (list
  537. (service-extension shepherd-root-service-type
  538. guix-build-coordinator-queue-builds-shepherd-services)
  539. (service-extension activation-service-type
  540. guix-build-coordinator-queue-builds-activation)
  541. (service-extension account-service-type
  542. guix-build-coordinator-queue-builds-account)))
  543. (description
  544. "Run the guix-build-coordinator-queue-builds-from-guix-data-service
  545. script.
  546. This is a script to assist in having the Guix Build Coordinator build
  547. derivations stored in an instance of the Guix Data Service.")))
  548. ;;;
  549. ;;; Guix Data Service
  550. ;;;
  551. (define-record-type* <guix-data-service-configuration>
  552. guix-data-service-configuration make-guix-data-service-configuration
  553. guix-data-service-configuration?
  554. (package guix-data-service-package
  555. (default guix-data-service))
  556. (user guix-data-service-configuration-user
  557. (default "guix-data-service"))
  558. (group guix-data-service-configuration-group
  559. (default "guix-data-service"))
  560. (port guix-data-service-port
  561. (default 8765))
  562. (host guix-data-service-host
  563. (default "127.0.0.1"))
  564. (getmail-idle-mailboxes
  565. guix-data-service-getmail-idle-mailboxes
  566. (default #f))
  567. (commits-getmail-retriever-configuration
  568. guix-data-service-commits-getmail-retriever-configuration
  569. (default #f))
  570. (extra-options guix-data-service-extra-options
  571. (default '()))
  572. (extra-process-jobs-options
  573. guix-data-service-extra-process-jobs-options
  574. (default '())))
  575. (define (guix-data-service-profile-packages config)
  576. "Return the guix-data-service package, this will populate the
  577. ca-certificates.crt file in the system profile."
  578. (list
  579. (guix-data-service-package config)))
  580. (define (guix-data-service-shepherd-services config)
  581. (match-record config <guix-data-service-configuration>
  582. (package user group port host extra-options extra-process-jobs-options)
  583. (list
  584. (shepherd-service
  585. (documentation "Guix Data Service web server")
  586. (provision '(guix-data-service))
  587. (requirement '(postgres networking))
  588. (start #~(make-forkexec-constructor
  589. (list #$(file-append package
  590. "/bin/guix-data-service")
  591. "--pid-file=/var/run/guix-data-service/pid"
  592. #$(string-append "--port=" (number->string port))
  593. #$(string-append "--host=" host)
  594. ;; Perform any database migrations when the
  595. ;; service is started
  596. "--update-database"
  597. #$@extra-options)
  598. #:user #$user
  599. #:group #$group
  600. #:pid-file "/var/run/guix-data-service/pid"
  601. #:environment-variables
  602. `(,(string-append
  603. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  604. "LC_ALL=en_US.UTF-8")
  605. #:log-file "/var/log/guix-data-service/web.log"))
  606. (stop #~(make-kill-destructor)))
  607. (shepherd-service
  608. (documentation "Guix Data Service process jobs")
  609. (provision '(guix-data-service-process-jobs))
  610. (requirement '(postgres
  611. networking
  612. ;; Require guix-data-service, as that the database
  613. ;; migrations are handled through this service
  614. guix-data-service))
  615. (start #~(make-forkexec-constructor
  616. (list
  617. #$(file-append package
  618. "/bin/guix-data-service-process-jobs")
  619. #$@extra-process-jobs-options)
  620. #:user #$user
  621. #:group #$group
  622. #:environment-variables
  623. `("HOME=/var/lib/guix-data-service"
  624. "GIT_SSL_CAINFO=/etc/ssl/certs/ca-certificates.crt"
  625. ,(string-append
  626. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  627. "LC_ALL=en_US.UTF-8")
  628. #:log-file "/var/log/guix-data-service/process-jobs.log"))
  629. (stop #~(make-kill-destructor))))))
  630. (define (guix-data-service-activation config)
  631. #~(begin
  632. (use-modules (guix build utils))
  633. (define %user (getpw "guix-data-service"))
  634. (chmod "/var/lib/guix-data-service" #o755)
  635. (mkdir-p "/var/log/guix-data-service")
  636. ;; Allow writing the PID file
  637. (mkdir-p "/var/run/guix-data-service")
  638. (chown "/var/run/guix-data-service"
  639. (passwd:uid %user)
  640. (passwd:gid %user))))
  641. (define (guix-data-service-account config)
  642. (match-record config <guix-data-service-configuration>
  643. (user group)
  644. (list (user-group
  645. (name group)
  646. (system? #t))
  647. (user-account
  648. (name user)
  649. (group group)
  650. (system? #t)
  651. (comment "Guix Data Service user")
  652. (home-directory "/var/lib/guix-data-service")
  653. (shell (file-append shadow "/sbin/nologin"))))))
  654. (define (guix-data-service-getmail-configuration config)
  655. (match config
  656. (($ <guix-data-service-configuration> package user group
  657. port host
  658. #f #f)
  659. '())
  660. (($ <guix-data-service-configuration> package user group
  661. port host
  662. getmail-idle-mailboxes
  663. commits-getmail-retriever-configuration)
  664. (list
  665. (getmail-configuration
  666. (name 'guix-data-service)
  667. (user user)
  668. (group group)
  669. (directory "/var/lib/getmail/guix-data-service")
  670. (rcfile
  671. (getmail-configuration-file
  672. (retriever commits-getmail-retriever-configuration)
  673. (destination
  674. (getmail-destination-configuration
  675. (type "MDA_external")
  676. (path (file-append
  677. package
  678. "/bin/guix-data-service-process-branch-updated-email"))))
  679. (options
  680. (getmail-options-configuration
  681. (read-all #f)
  682. (delivered-to #f)
  683. (received #f)))))
  684. (idle getmail-idle-mailboxes))))))
  685. (define guix-data-service-type
  686. (service-type
  687. (name 'guix-data-service)
  688. (extensions
  689. (list
  690. (service-extension profile-service-type
  691. guix-data-service-profile-packages)
  692. (service-extension shepherd-root-service-type
  693. guix-data-service-shepherd-services)
  694. (service-extension activation-service-type
  695. guix-data-service-activation)
  696. (service-extension account-service-type
  697. guix-data-service-account)
  698. (service-extension getmail-service-type
  699. guix-data-service-getmail-configuration)))
  700. (default-value
  701. (guix-data-service-configuration))
  702. (description
  703. "Run an instance of the Guix Data Service.")))
  704. ;;;
  705. ;;; Nar Herder
  706. ;;;
  707. (define-record-type* <nar-herder-configuration>
  708. nar-herder-configuration make-nar-herder-configuration
  709. nar-herder-configuration?
  710. (package nar-herder-configuration-package
  711. (default nar-herder))
  712. (user nar-herder-configuration-user
  713. (default "nar-herder"))
  714. (group nar-herder-configuration-group
  715. (default "nar-herder"))
  716. (mirror nar-herder-configuration-mirror
  717. (default #f))
  718. (database nar-herder-configuration-database
  719. (default "/var/lib/nar-herder/nar_herder.db"))
  720. (database-dump nar-herder-configuration-database-dump
  721. (default "/var/lib/nar-herder/nar_herder_dump.db"))
  722. (host nar-herder-configuration-host
  723. (default "127.0.0.1"))
  724. (port nar-herder-configuration-port
  725. (default 8734))
  726. (storage nar-herder-configuration-storage
  727. (default #f))
  728. (storage-limit nar-herder-configuration-storage-limit
  729. (default "none"))
  730. (storage-nar-removal-criteria
  731. nar-herder-configuration-storage-nar-removal-criteria
  732. (default '()))
  733. (ttl nar-herder-configuration-ttl
  734. (default #f))
  735. (negative-ttl nar-herder-configuration-negative-ttl
  736. (default #f))
  737. (log-level nar-herder-configuration-log-level
  738. (default 'DEBUG)))
  739. (define (nar-herder-shepherd-services config)
  740. (match-record config <nar-herder-configuration>
  741. (package user group
  742. mirror
  743. database database-dump
  744. host port
  745. storage storage-limit storage-nar-removal-criteria
  746. ttl negative-ttl log-level)
  747. (unless (or mirror storage)
  748. (error "nar-herder: mirror or storage must be set"))
  749. (list
  750. (shepherd-service
  751. (documentation "Nar Herder")
  752. (provision '(nar-herder))
  753. (requirement '(networking))
  754. (start #~(make-forkexec-constructor
  755. (list #$(file-append package
  756. "/bin/nar-herder")
  757. "run-server"
  758. "--pid-file=/var/run/nar-herder/pid"
  759. #$(string-append "--port=" (number->string port))
  760. #$(string-append "--host=" host)
  761. #$@(if mirror
  762. (list (string-append "--mirror=" mirror))
  763. '())
  764. #$(string-append "--database=" database)
  765. #$(string-append "--database-dump=" database-dump)
  766. #$@(if storage
  767. (list (string-append "--storage=" storage))
  768. '())
  769. #$(string-append "--storage-limit="
  770. (if (number? storage-limit)
  771. (number->string storage-limit)
  772. storage-limit))
  773. #$@(map (lambda (criteria)
  774. (string-append
  775. "--storage-nar-removal-criteria="
  776. (match criteria
  777. ((k . v) (simple-format #f "~A=~A" k v))
  778. (str str))))
  779. storage-nar-removal-criteria)
  780. #$@(if ttl
  781. (list (string-append "--ttl=" ttl))
  782. '())
  783. #$@(if negative-ttl
  784. (list (string-append "--negative-ttl=" negative-ttl))
  785. '())
  786. #$@(if log-level
  787. (list (simple-format #f "--log-level=~A" log-level))
  788. '()))
  789. #:user #$user
  790. #:group #$group
  791. #:pid-file "/var/run/nar-herder/pid"
  792. #:environment-variables
  793. `(,(string-append
  794. "GUIX_LOCPATH=" #$glibc-utf8-locales "/lib/locale")
  795. "LC_ALL=en_US.utf8")
  796. #:log-file "/var/log/nar-herder/server.log"))
  797. (stop #~(make-kill-destructor))))))
  798. (define (nar-herder-activation config)
  799. #~(begin
  800. (use-modules (guix build utils))
  801. (define %user
  802. (getpw #$(nar-herder-configuration-user
  803. config)))
  804. (chmod "/var/lib/nar-herder" #o755)
  805. (mkdir-p "/var/log/nar-herder")
  806. ;; Allow writing the PID file
  807. (mkdir-p "/var/run/nar-herder")
  808. (chown "/var/run/nar-herder"
  809. (passwd:uid %user)
  810. (passwd:gid %user))))
  811. (define (nar-herder-account config)
  812. (match-record config <nar-herder-configuration>
  813. (user group)
  814. (list (user-group
  815. (name group)
  816. (system? #t))
  817. (user-account
  818. (name user)
  819. (group group)
  820. (system? #t)
  821. (comment "Nar Herder user")
  822. (home-directory "/var/lib/nar-herder")
  823. (shell (file-append shadow "/sbin/nologin"))))))
  824. (define nar-herder-service-type
  825. (service-type
  826. (name 'nar-herder)
  827. (extensions
  828. (list
  829. (service-extension shepherd-root-service-type
  830. nar-herder-shepherd-services)
  831. (service-extension activation-service-type
  832. nar-herder-activation)
  833. (service-extension account-service-type
  834. nar-herder-account)))
  835. (description
  836. "Run a Nar Herder server.")))