diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix index ad344dfbc11..6b41c7c7c0e 100644 --- a/nixos/modules/misc/ids.nix +++ b/nixos/modules/misc/ids.nix @@ -117,6 +117,7 @@ couchdb = 106; searx = 107; kippo = 108; + jenkins = 109; # When adding a uid, make sure it doesn't match an existing gid. @@ -212,6 +213,7 @@ couchdb = 106; searx = 107; kippo = 108; + jenkins = 109; # When adding a gid, make sure it doesn't match an existing uid. diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix index 8a7d32adf34..f3d6bdb297d 100644 --- a/nixos/modules/module-list.nix +++ b/nixos/modules/module-list.nix @@ -81,6 +81,8 @@ ./services/backup/rsnapshot.nix ./services/backup/sitecopy-backup.nix ./services/backup/tarsnap.nix + ./services/continuous-integration/jenkins/default.nix + ./services/continuous-integration/jenkins/user.nix ./services/databases/4store-endpoint.nix ./services/databases/4store.nix ./services/databases/couchdb.nix diff --git a/nixos/modules/services/continuous-integration/jenkins/default.nix b/nixos/modules/services/continuous-integration/jenkins/default.nix new file mode 100644 index 00000000000..330dbab14e7 --- /dev/null +++ b/nixos/modules/services/continuous-integration/jenkins/default.nix @@ -0,0 +1,97 @@ +{ config, pkgs, ... }: +with pkgs.lib; +let + cfg = config.services.jenkins; + userCfg = config.users.jenkins; +in { + options = { + services.jenkins = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable the jenkins continuous integration server. + ''; + }; + + user = mkOption { + default = "jenkins"; + type = with types; string; + description = '' + User the jenkins server should execute under. Defaults to the "jenkins" user. + ''; + }; + + home = mkOption { + default = userCfg.home; + type = with types; string; + description = '' + The path to use as JENKINS_HOME. Defaults to the home of the "jenkins" user. + ''; + }; + + port = mkOption { + default = 8080; + type = types.uniq types.int; + description = '' + Specifies port number on which the jenkins HTTP interface listens. The default is 8080 + ''; + }; + + packages = mkOption { + default = [ pkgs.stdenv pkgs.git pkgs.jdk pkgs.openssh pkgs.nix ]; + type = types.listOf types.package; + description = '' + Packages to add to PATH for the jenkins process. + ''; + }; + + environment = mkOption { + default = { NIX_REMOTE = "daemon"; }; + type = with types; attrsOf string; + description = '' + Additional environment variables to be passed to the jenkins process. + The environment will always include JENKINS_HOME. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + users.jenkins.enable = true; + + systemd.services.jenkins = { + description = "jenkins continuous integration server"; + after = [ "network.target" ]; + wantedBy = [ "multi-user.target" ]; + + environment = { + JENKINS_HOME = cfg.home; + } // cfg.environment; + + path = cfg.packages; + + script = '' + ${pkgs.jdk}/bin/java -jar ${pkgs.jenkins} --httpPort=${toString cfg.port} + ''; + + postStart = '' + until ${pkgs.curl}/bin/curl -L localhost:${toString cfg.port} ; do + sleep 10 + done + while true ; do + index=`${pkgs.curl}/bin/curl -L localhost:${toString cfg.port}` + if [[ !("$index" =~ 'Please wait while Jenkins is restarting' || + "$index" =~ 'Please wait while Jenkins is getting ready to work') ]]; then + exit 0 + fi + sleep 30 + done + ''; + + serviceConfig = { + User = cfg.user; + }; + }; + }; +} diff --git a/nixos/modules/services/continuous-integration/jenkins/user.nix b/nixos/modules/services/continuous-integration/jenkins/user.nix new file mode 100644 index 00000000000..cb4d9a60a4a --- /dev/null +++ b/nixos/modules/services/continuous-integration/jenkins/user.nix @@ -0,0 +1,61 @@ +{ config, pkgs, ... }: +with pkgs.lib; +let + cfg = config.users.jenkins; +in { + options = { + users.jenkins = { + enable = mkOption { + type = types.bool; + default = false; + description = '' + Whether to enable the jenkins user. By default enabling a jenkins service enables the + jenkins user. The "user" config property of the service can be used to select a different + user. + ''; + }; + + extraGroups = mkOption { + default = []; + type = with types; listOf string; + description = '' + Extra groups of the "jenkins" user. + ''; + }; + + group = mkOption { + default = "jenkins"; + description = '' + Default group of "jenkins" user. + ''; + }; + + home = mkOption { + default = "/var/lib/jenkins"; + type = types.string; + description = '' + Home of the "jenkins" user and JENKINS_HOME. + ''; + }; + }; + }; + + config = mkIf cfg.enable { + users.extraGroups = optional (cfg.group == "jenkins") { + name = "jenkins"; + gid = config.ids.gids.jenkins; + }; + + users.extraUsers = { + jenkins = { + description = "jenkins user"; + createHome = true; + home = cfg.home; + group = cfg.group; + extraGroups = cfg.extraGroups; + useDefaultShell = true; + uid = config.ids.uids.jenkins; + }; + }; + }; +} diff --git a/nixos/tests/default.nix b/nixos/tests/default.nix index b37a0d5fa0c..5b68862a2cd 100644 --- a/nixos/tests/default.nix +++ b/nixos/tests/default.nix @@ -14,6 +14,7 @@ with import ../lib/testing.nix { inherit system minimal; }; efi-installer = makeTests (import ./efi-installer.nix); gnome3 = makeTest (import ./gnome3.nix); ipv6 = makeTest (import ./ipv6.nix); + jenkins = makeTest (import ./jenkins.nix); kde4 = makeTest (import ./kde4.nix); #kexec = makeTest (import ./kexec.nix); login = makeTest (import ./login.nix {}); diff --git a/nixos/tests/jenkins.nix b/nixos/tests/jenkins.nix new file mode 100644 index 00000000000..b05a9d3eaf9 --- /dev/null +++ b/nixos/tests/jenkins.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: +{ + nodes = { + master = { pkgs, config, ... }: { + services.jenkins.enable = true; + }; + }; + + testScript = '' + startAll; + + $master->waitForUnit("jenkins"); + ''; +} diff --git a/pkgs/development/tools/continuous-integration/jenkins/default.nix b/pkgs/development/tools/continuous-integration/jenkins/default.nix new file mode 100644 index 00000000000..565693ddd79 --- /dev/null +++ b/pkgs/development/tools/continuous-integration/jenkins/default.nix @@ -0,0 +1,18 @@ +{ stdenv, fetchurl }: + +stdenv.mkDerivation rec { + name = "jenkins"; + version = "1.550"; + + src = fetchurl { + url = "http://mirrors.jenkins-ci.org/war/${version}/jenkins.war"; + sha256 = "1ziimbfs9kylga0xmxlfsfcc7qsirs5bnx00pa99m2l5sz2ki793"; + }; + meta = { + description = "An extendable open source continuous integration server."; + homepage = http://jenkins-ci.org; + maintainers = [ stdenv.lib.maintainers.coconnor ]; + }; + + buildCommand = "ln -s $src $out"; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 4603179fafc..4bb7acfba1f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -3686,6 +3686,8 @@ let jikespg = callPackage ../development/tools/parsing/jikespg { }; + jenkins = callPackage ../development/tools/continuous-integration/jenkins { }; + lcov = callPackage ../development/tools/analysis/lcov { }; leiningen = callPackage ../development/tools/build-managers/leiningen { };