gitlab.tests: Test backup and restore
Test the automatic backup and restore functionality by backing up the instance after running the initial tests, stopping GitLab and removing all state, running the restore rake task, then running the tests again, but without pushing data.
This commit is contained in:
parent
3fb04ca505
commit
35582c5af7
|
@ -34,6 +34,8 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
|
||||||
enableImap = true;
|
enableImap = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
systemd.services.gitlab-backup.environment.BACKUP = "dump";
|
||||||
|
|
||||||
services.gitlab = {
|
services.gitlab = {
|
||||||
enable = true;
|
enable = true;
|
||||||
databasePasswordFile = pkgs.writeText "dbPassword" "xo0daiF4";
|
databasePasswordFile = pkgs.writeText "dbPassword" "xo0daiF4";
|
||||||
|
@ -64,7 +66,7 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
testScript =
|
testScript = { nodes, ... }:
|
||||||
let
|
let
|
||||||
auth = pkgs.writeText "auth.json" (builtins.toJSON {
|
auth = pkgs.writeText "auth.json" (builtins.toJSON {
|
||||||
grant_type = "password";
|
grant_type = "password";
|
||||||
|
@ -83,19 +85,22 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
|
||||||
content = "some content";
|
content = "some content";
|
||||||
commit_message = "create a new file";
|
commit_message = "create a new file";
|
||||||
});
|
});
|
||||||
in
|
|
||||||
''
|
|
||||||
gitlab.start()
|
|
||||||
|
|
||||||
|
# Wait for all GitLab services to be fully started.
|
||||||
|
waitForServices = ''
|
||||||
gitlab.wait_for_unit("gitaly.service")
|
gitlab.wait_for_unit("gitaly.service")
|
||||||
gitlab.wait_for_unit("gitlab-workhorse.service")
|
gitlab.wait_for_unit("gitlab-workhorse.service")
|
||||||
gitlab.wait_for_unit("gitlab-pages.service")
|
gitlab.wait_for_unit("gitlab-pages.service")
|
||||||
gitlab.wait_for_unit("gitlab-mailroom.service")
|
gitlab.wait_for_unit("gitlab-mailroom.service")
|
||||||
gitlab.wait_for_unit("gitlab.service")
|
gitlab.wait_for_unit("gitlab.service")
|
||||||
gitlab.wait_for_unit("gitlab-sidekiq.service")
|
gitlab.wait_for_unit("gitlab-sidekiq.service")
|
||||||
gitlab.wait_for_file("/var/gitlab/state/tmp/sockets/gitlab.socket")
|
gitlab.wait_for_file("${nodes.gitlab.config.services.gitlab.statePath}/tmp/sockets/gitlab.socket")
|
||||||
gitlab.wait_until_succeeds("curl -sSf http://gitlab/users/sign_in")
|
gitlab.wait_until_succeeds("curl -sSf http://gitlab/users/sign_in")
|
||||||
|
'';
|
||||||
|
|
||||||
|
# The actual test of GitLab. Only push data to GitLab if
|
||||||
|
# `doSetup` is is true.
|
||||||
|
test = doSetup: ''
|
||||||
gitlab.succeed(
|
gitlab.succeed(
|
||||||
"curl -isSf http://gitlab | grep -i location | grep -q http://gitlab/users/sign_in"
|
"curl -isSf http://gitlab | grep -i location | grep -q http://gitlab/users/sign_in"
|
||||||
)
|
)
|
||||||
|
@ -105,12 +110,14 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
|
||||||
gitlab.succeed(
|
gitlab.succeed(
|
||||||
"echo \"Authorization: Bearer \$(curl -X POST -H 'Content-Type: application/json' -d @${auth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers"
|
"echo \"Authorization: Bearer \$(curl -X POST -H 'Content-Type: application/json' -d @${auth} http://gitlab/oauth/token | ${pkgs.jq}/bin/jq -r '.access_token')\" >/tmp/headers"
|
||||||
)
|
)
|
||||||
|
'' + optionalString doSetup ''
|
||||||
gitlab.succeed(
|
gitlab.succeed(
|
||||||
"curl -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${createProject} http://gitlab/api/v4/projects"
|
"curl -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${createProject} http://gitlab/api/v4/projects"
|
||||||
)
|
)
|
||||||
gitlab.succeed(
|
gitlab.succeed(
|
||||||
"curl -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${putFile} http://gitlab/api/v4/projects/1/repository/files/some-file.txt"
|
"curl -X POST -H 'Content-Type: application/json' -H @/tmp/headers -d @${putFile} http://gitlab/api/v4/projects/1/repository/files/some-file.txt"
|
||||||
)
|
)
|
||||||
|
'' + ''
|
||||||
gitlab.succeed(
|
gitlab.succeed(
|
||||||
"curl -H @/tmp/headers http://gitlab/api/v4/projects/1/repository/archive.tar.gz > /tmp/archive.tar.gz"
|
"curl -H @/tmp/headers http://gitlab/api/v4/projects/1/repository/archive.tar.gz > /tmp/archive.tar.gz"
|
||||||
)
|
)
|
||||||
|
@ -120,4 +127,28 @@ import ./make-test-python.nix ({ pkgs, lib, ...} : with lib; {
|
||||||
gitlab.succeed("test -s /tmp/archive.tar.gz")
|
gitlab.succeed("test -s /tmp/archive.tar.gz")
|
||||||
gitlab.succeed("test -s /tmp/archive.tar.bz2")
|
gitlab.succeed("test -s /tmp/archive.tar.bz2")
|
||||||
'';
|
'';
|
||||||
|
|
||||||
|
in ''
|
||||||
|
gitlab.start()
|
||||||
|
''
|
||||||
|
+ waitForServices
|
||||||
|
+ test true
|
||||||
|
+ ''
|
||||||
|
gitlab.systemctl("start gitlab-backup.service")
|
||||||
|
gitlab.wait_for_unit("gitlab-backup.service")
|
||||||
|
gitlab.wait_for_file("${nodes.gitlab.config.services.gitlab.statePath}/backup/dump_gitlab_backup.tar")
|
||||||
|
gitlab.systemctl("stop postgresql.service gitlab.target")
|
||||||
|
gitlab.succeed(
|
||||||
|
"find ${nodes.gitlab.config.services.gitlab.statePath} -mindepth 1 -maxdepth 1 -not -name backup -execdir rm -r {} +"
|
||||||
|
)
|
||||||
|
gitlab.succeed("systemd-tmpfiles --create")
|
||||||
|
gitlab.succeed("rm -rf ${nodes.gitlab.config.services.postgresql.dataDir}")
|
||||||
|
gitlab.systemctl("start gitlab-config.service gitlab-postgresql.service")
|
||||||
|
gitlab.succeed(
|
||||||
|
"sudo -u gitlab -H gitlab-rake gitlab:backup:restore RAILS_ENV=production BACKUP=dump force=yes"
|
||||||
|
)
|
||||||
|
gitlab.systemctl("start gitlab.target")
|
||||||
|
''
|
||||||
|
+ waitForServices
|
||||||
|
+ test false;
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue