Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gitolite: wrap gitolite-shell #75005

Merged
merged 1 commit into from Dec 8, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions nixos/tests/all-tests.nix
Expand Up @@ -93,6 +93,7 @@ in
gitea = handleTest ./gitea.nix {};
gitlab = handleTest ./gitlab.nix {};
gitolite = handleTest ./gitolite.nix {};
gitolite-fcgiwrap = handleTest ./gitolite-fcgiwrap.nix {};
glusterfs = handleTest ./glusterfs.nix {};
gnome3-xorg = handleTest ./gnome3-xorg.nix {};
gnome3 = handleTest ./gnome3.nix {};
Expand Down
93 changes: 93 additions & 0 deletions nixos/tests/gitolite-fcgiwrap.nix
@@ -0,0 +1,93 @@
import ./make-test-python.nix (
{ pkgs, ... }:

let
user = "gitolite-admin";
password = "some_password";

# not used but needed to setup gitolite
adminPublicKey = ''
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO7urFhAA90BTpGuEHeWWTY3W/g9PBxXNxfWhfbrm4Le root@client
'';
in
{
name = "gitolite-fcgiwrap";

meta = with pkgs.stdenv.lib.maintainers; {
maintainers = [ bbigras ];
};

nodes = {

server =
{ ... }:
{
networking.firewall.allowedTCPPorts = [ 80 ];

services.fcgiwrap.enable = true;
services.gitolite = {
enable = true;
adminPubkey = adminPublicKey;
};

services.nginx = {
enable = true;
recommendedProxySettings = true;
virtualHosts."server".locations."/git".extraConfig = ''
# turn off gzip as git objects are already well compressed
gzip off;

# use file based basic authentication
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

btw those comments were copy/pasted from some gist. I hope it's still fine.

auth_basic "Git Repository Authentication";
auth_basic_user_file /etc/gitolite/htpasswd;

# common FastCGI parameters are required
include ${pkgs.nginx}/conf/fastcgi_params;

# strip the CGI program prefix
fastcgi_split_path_info ^(/git)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;

# pass authenticated user login(mandatory) to Gitolite
fastcgi_param REMOTE_USER $remote_user;

# pass git repository root directory and hosting user directory
# these env variables can be set in a wrapper script
fastcgi_param GIT_HTTP_EXPORT_ALL "";
fastcgi_param GIT_PROJECT_ROOT /var/lib/gitolite/repositories;
fastcgi_param GITOLITE_HTTP_HOME /var/lib/gitolite;
fastcgi_param SCRIPT_FILENAME ${pkgs.gitolite}/bin/gitolite-shell;

# use Unix domain socket or inet socket
fastcgi_pass unix:/run/fcgiwrap.sock;
'';
};

# WARNING: DON'T DO THIS IN PRODUCTION!
# This puts unhashed secrets directly into the Nix store for ease of testing.
environment.etc."gitolite/htpasswd".source = pkgs.runCommand "htpasswd" {} ''
${pkgs.apacheHttpd}/bin/htpasswd -bc "$out" ${user} ${password}
'';
};

client =
{ pkgs, ... }:
{
environment.systemPackages = [ pkgs.git ];
};
};

testScript = ''
start_all()

server.wait_for_unit("gitolite-init.service")
server.wait_for_unit("nginx.service")
server.wait_for_file("/run/fcgiwrap.sock")

client.wait_for_unit("multi-user.target")
client.succeed(
"git clone http://${user}:${password}@server/git/gitolite-admin.git"
)
'';
}
)
11 changes: 9 additions & 2 deletions pkgs/applications/version-management/gitolite/default.nix
@@ -1,4 +1,4 @@
{ stdenv, fetchFromGitHub, git, nettools, perl }:
{ stdenv, fetchFromGitHub, git, lib, makeWrapper, nettools, perl }:

stdenv.mkDerivation rec {
pname = "gitolite";
Expand All @@ -11,7 +11,9 @@ stdenv.mkDerivation rec {
sha256 = "1rkj7gknwjlc5ij9w39zf5mr647bm45la57yjczydmvrb8c56yrh";
};

buildInputs = [ git nettools perl ];
buildInputs = [ nettools perl ];
nativeBuildInputs = [ makeWrapper ];
propagatedBuildInputs = [ git ];

dontBuild = true;

Expand All @@ -25,6 +27,11 @@ stdenv.mkDerivation rec {
--replace hostname "${nettools}/bin/hostname"
'';

postFixup = ''
wrapProgram $out/bin/gitolite-shell \
--prefix PATH : "${git}/bin"
'';

installPhase = ''
mkdir -p $out/bin
perl ./install -to $out/bin
Expand Down