about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--doc/forge.skb4
-rw-r--r--guix/forge/forge.scm21
2 files changed, 24 insertions, 1 deletions
diff --git a/doc/forge.skb b/doc/forge.skb
index 4f861dd..4134e70 100644
--- a/doc/forge.skb
+++ b/doc/forge.skb
@@ -1,5 +1,5 @@
 ;;; guix-forge --- Guix software forge meta-service
-;;; Copyright © 2022–2024 Arun Isaac <arunisaac@systemreboot.net>
+;;; Copyright © 2022–2025 Arun Isaac <arunisaac@systemreboot.net>
 ;;; Copyright © 2024 Frederick M. Muriithi <fredmanglis@protonmail.com>
 ;;;
 ;;; This file is part of guix-forge.
@@ -533,6 +533,8 @@ disregarded if the repository is remote.])
 the ,(file "description") file in the repository and will appear in
 the cgit web interface. This field is disregarded if the repository is
 remote.])
+       (record-field "web-domain"
+         [Domain name to serve project website on])
        (record-field "website-directory"
          [Path to the document root of the project website. The
 ownership of its parent directory is granted to the ,(code "laminar")
diff --git a/guix/forge/forge.scm b/guix/forge/forge.scm
index 866b132..abd8a26 100644
--- a/guix/forge/forge.scm
+++ b/guix/forge/forge.scm
@@ -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,6 +40,7 @@
   #: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)
@@ -53,6 +55,7 @@
             forge-project-user
             forge-project-repository
             forge-project-repository-branch
+            forge-project-web-domain
             forge-project-website-directory
             forge-project-ci-jobs
             forge-project-ci-jobs-trigger
@@ -78,6 +81,8 @@
                      (default "main"))
   (description forge-project-description
                (default #f))
+  (web-domain forge-project-web-domain
+              (default #f))
   (website-directory forge-project-website-directory
                      (default #f))
   (ci-jobs forge-project-ci-jobs
@@ -438,6 +443,20 @@ 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.
+  (filter-map (match-record-lambda <forge-project>
+                  (web-domain website-directory tissue?)
+                (and web-domain
+                     website-directory
+                     (nginx-server-configuration
+                      (server-name (list web-domain))
+                      (root website-directory))))
+              (forge-configuration-projects config)))
+
 (define (forge-ci-jobs config)
   "Return list of CI jobs for forge configuration @var{config}. Each
 value of the returned list is a @code{<forge-laminar-job>} object."
@@ -527,6 +546,8 @@ 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 forge-laminar-service-type
                                         forge-ci-jobs+contexts+groups)
                      ;; TODO: Run CI job only if there are new commits