aboutsummaryrefslogtreecommitdiff
path: root/guix/forge/forge.scm
diff options
context:
space:
mode:
Diffstat (limited to 'guix/forge/forge.scm')
-rw-r--r--guix/forge/forge.scm57
1 files changed, 55 insertions, 2 deletions
diff --git a/guix/forge/forge.scm b/guix/forge/forge.scm
index 624fa31..cfe8337 100644
--- a/guix/forge/forge.scm
+++ b/guix/forge/forge.scm
@@ -1,5 +1,5 @@
;;; guix-forge --- Guix software forge meta-service
-;;; Copyright © 2021–2024 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2021–2025 Arun Isaac <arunisaac@systemreboot.net>
;;;
;;; This file is part of guix-forge.
;;;
@@ -29,6 +29,7 @@
#:use-module ((gnu packages version-control) #:select (git-minimal))
#:use-module (gnu services)
#:use-module (gnu services mcron)
+ #:use-module (gnu services web)
#:use-module (guix channels)
#:use-module (guix deprecation)
#:use-module (guix gexp)
@@ -39,12 +40,14 @@
#:use-module (guix store)
#:use-module ((forge guile-git) #:select (guile-git))
#:use-module (forge laminar)
+ #:use-module (forge nginx)
#:use-module (forge tissue)
#:use-module (forge utils)
#:use-module (forge webhook)
#:export (forge-service-type
forge-configuration
forge-configuration?
+ forge-configuration-web-domain
forge-configuration-projects
forge-project
forge-project?
@@ -53,9 +56,12 @@
forge-project-user
forge-project-repository
forge-project-repository-branch
+ forge-project-web-domain
forge-project-website-directory
+ forge-project-tissue?
forge-project-ci-jobs
forge-project-ci-jobs-trigger
+ forge-project-parallel-ci-job-runs
derivation-job-gexp
variable-specification
variable-specification?
@@ -77,8 +83,12 @@
(default "main"))
(description forge-project-description
(default #f))
+ (web-domain forge-project-web-domain
+ (default #f))
(website-directory forge-project-website-directory
(default #f))
+ (tissue? forge-project-tissue?
+ (default #f))
(ci-jobs forge-project-ci-jobs
(default '()) (thunked))
(ci-jobs-trigger forge-project-ci-jobs-trigger ; one of 'post-receive-hook, 'cron, 'webhook
@@ -95,6 +105,8 @@
(define-record-type* <forge-configuration>
forge-configuration make-forge-configuration
forge-configuration?
+ (web-domain forge-configuration-web-domain
+ (default #f))
(projects forge-configuration-projects
(default '())))
@@ -437,8 +449,45 @@ that were built."
(package-channels pkg))))))))
inferior))))))))
+(define (forge-nginx-server-blocks config)
+ "Return list of @code{<nginx-server-configuration>} extensions for
+forge configuration @var{config}."
+ ;; Configure nginx server blocks for projects that have a web domain
+ ;; and a website directory, but do not have tissue enabled.
+ (filter-map (match-record-lambda <forge-project>
+ (web-domain website-directory tissue?)
+ (and web-domain
+ website-directory
+ (not tissue?)
+ (nginx-server-configuration
+ (server-name (list web-domain))
+ (root website-directory))))
+ (forge-configuration-projects config)))
+
+(define (forge-tissue-hosts config)
+ "Return list of @code{<tissue-host>} objects for forge configuration
+@var{config}."
+ (match-record config <forge-configuration>
+ (web-domain projects)
+ (if web-domain
+ (list (tissue-host
+ (name web-domain)
+ (projects
+ (filter-map (lambda (project)
+ (and (forge-project-tissue? project)
+ (tissue-project
+ (name (forge-project-name project))
+ ;; The laminar user must own the
+ ;; host state so that it can run
+ ;; tissue pull.
+ (user "laminar")
+ (upstream-repository
+ (forge-project-repository project)))))
+ projects))))
+ (list))))
+
(define (forge-ci-jobs config)
- "Return list of CI jobs for forge configuraion @var{config}. Each
+ "Return list of CI jobs for forge configuration @var{config}. Each
value of the returned list is a @code{<forge-laminar-job>} object."
(append-map (lambda (project)
;; Add project context to CI jobs.
@@ -526,6 +575,10 @@ value is a list of @code{<webhook-hook>} objects."
(description "Run guix-forge.")
(extensions (list (service-extension activation-service-type
forge-activation)
+ (service-extension forge-nginx-service-type
+ forge-nginx-server-blocks)
+ (service-extension tissue-service-type
+ forge-tissue-hosts)
(service-extension forge-laminar-service-type
forge-ci-jobs+contexts+groups)
;; TODO: Run CI job only if there are new commits