Własne kopie repozytoriów kanałów Guix
ŹRÓDŁO Ustaliłem, że potrzebuję zainstalować na moim serwerze publiczne kopie repozytoriów kanałów Guix używanych w moich systemach.
ŹRÓDŁO Kanały Guix są zbudowane na bazie repozytoriów Git o rozproszonej architekturze, którą zamierzam wykorzystać do tego celu. W tej architekturze każdy użytkownik może jednocześnie pełnić role klienta i serwera. Typowa instalacja Guix wykorzystuje scentralizowany model pracy, odnosząc się do kanonicznego repozytorium projektu Guix. Git pozwala na ustawienie wielu repozytoriów zdalnych, co pozwala wprowadzić model pracy kierownika integracji wystarczający do osiągnięcia mojego celu. Istnieje również jeszcze bardziej złożony model dyktatora i poruczników, który nie ma zastosowania w mojej sytuacji.
ŹRÓDŁO Do udostępniania repozytoriów Git na moim serwerze używam serwera Gitolite.
ŹRÓDŁO Kluczowym spostrzeżeniem w modelu pracy kierownika integracji jest fakt, że publiczne kopie repozytoriów nie odnoszą się do kanonicznych repozytoriów. Znaczy to, że publiczna kopia repozytorium jest końcowym ogniwem modelu pracy. Kopiowane repozytorium serwowane przez Gitolite jest więc całkowicie typowe i z perspektywy serwera nie posiada repozytoriów zdalnych. Administrator danej publicznej kopii repozytorium lokalnie wybiera wersję do aktualizacji i wypycha ją na swój serwer. Ważne jest, żeby pamiętać o ustawieniu dodatkowego repozytorium zdalnego wskazującego repozytorium kanoniczne w lokalnej kopii roboczej.
ŹRÓDŁO
Administracja serwerem Gitolite polega na wprowadzaniu zmian w specjalnym repozytorium gitolite-admin
.
Przed rozpoczęciem pracy należy upewnić się, że istnieje lokalna kopia tego repozytorium.
git clone git@host:gitolite-admin
ŹRÓDŁO
Aby poprawnie wprowadzić istniejące repozytorium do Gitolite należy wykonać szereg czynności sprawdzających i przygotowujących.
Dopiero po ich wykonaniu można odpowiednio zaktualizować plik conf/gitolite.conf
w repozytorium gitolite-admin
.
ŹRÓDŁO Z perspektywy pliku konfiguracyjnego Gitolite wprowadzenie kopii repozytoriów jest dopisaniem nowych repozytoriów. Cały poprzedni proces przygotowawczy służy temu, że Gitolite prawidłowo wykryje istniejące repozytorium i je zaakceptuje jako nowe.
Dla prostoty wszystkie polecenia oprócz kilku ostatnich są wykonywane na maszynie serwującej Gitolite.
Przygotowanie repozytorium administracyjnego
$ git clone git@localhost:gitolite-admin
fatal: docelowa ścieżka „gitolite-admin” już istnieje i nie jest pustym katalogiem.
$ cd gitolite-admin
$ git pull
Enter passphrase for key '/home/marek/.ssh/id_rsa':
remote: Wymienianie obiektów: 19, gotowe.
remote: Zliczanie obiektów: 100% (19/19), gotowe.
remote: Kompresowanie obiektów: 100% (12/12), gotowe.
remote: Total 16 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
Rozpakowywanie obiektów: 100% (16/16), 3.94 KiB | 672.00 KiB/s, gotowe.
Z ssh://marekpasnikowski.pl:23/gitolite-admin
f898a3c..ee6d439 master -> origin/master
Aktualizowanie f898a3c..ee6d439
Fast-forward
conf/gitolite.conf | 22 +---------------------
1 file changed, 1 insertion(+), 21 deletions(-)
Repozytorium administracyjne Gitolite było już sklonowane. Przechodzę więc do niego i upewniam się, że jest aktualne.
Sklonowanie repozytoriów
$ git clone --bare https://codeberg.org/guix/guix.git
Klonowanie do suchego repozytorium „guix.git”...
remote: Enumerating objects: 897617, done.
remote: Counting objects: 100% (192551/192551), done.
remote: Compressing objects: 100% (8892/8892), done.
remote: Total 897617 (delta 191448), reused 184204 (delta 183659), pack-reused 705066 (from 1)
Pobieranie obiektów: 100% (897617/897617), 318.01 MiB | 7.11 MiB/s, gotowe.
Rozwiązywanie delt: 100% (718947/718947), gotowe.
$ git clone --bare https://gitlab.com/nonguix/nonguix.git
Klonowanie do suchego repozytorium „nonguix.git”...
remote: Enumerating objects: 11424, done.
remote: Counting objects: 100% (232/232), done.
remote: Compressing objects: 100% (65/65), done.
remote: Total 11424 (delta 165), reused 232 (delta 165), pack-reused 11192 (from 1)
Pobieranie obiektów: 100% (11424/11424), 2.57 MiB | 6.74 MiB/s, gotowe.
Rozwiązywanie delt: 100% (7010/7010), gotowe.
$ git clone --bare https://codeberg.org/guix/guix-rust-past-crates.git
Klonowanie do suchego repozytorium „guix-rust-past-crates.git”...
remote: Enumerating objects: 617, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 617 (delta 2), reused 0 (delta 0), pack-reused 605 (from 1)
Pobieranie obiektów: 100% (617/617), 1.86 MiB | 5.21 MiB/s, gotowe.
Rozwiązywanie delt: 100% (207/207), gotowe.
Po poprawnym sklonowaniu kopiowanych repozytoriów można przejść do sekwencji sprawdzeń.
Sprawdzenie haku update
w kopiowanych repozytoriach
$ cat guix.git/hooks/update
cat: guix.git/hooks/update: Nie ma takiego pliku ani katalogu
$ cat nonguix.git/hooks/update
cat: nonguix.git/hooks/update: Nie ma takiego pliku ani katalogu
$ cat guix-rust-past-crates.git/hooks/update
cat: guix-rust-past-crates.git/hooks/update: Nie ma takiego pliku ani katalogu
Żadne kopiowane repozytorium nie posiada haka update
.
Nie trzeba więc wykonywać żadnej dodatkowej pracy adaptacyjnej.
Sprawdzenie obecności pliku git-daemon-export-ok
$ cat guix.git/git-daemon-export-ok
cat: guix.git/git-daemon-export-ok: Nie ma takiego pliku ani katalogu
$ cat nonguix.git/git-daemon-export-ok
cat: nonguix.git/git-daemon-export-ok: Nie ma takiego pliku ani katalogu
$ cat guix-rust-past-crates.git/git-daemon-export-ok
cat: guix-rust-past-crates.git/git-daemon-export-ok: Nie ma takiego pliku ani katalogu
Żadne kopiowane repozytorium nie posiada pliku git-daemon-export-ok
.
Nie trzeba więc wykonywać żadnej dodatkowej pracy adaptacyjnej.
Sprawdzenie wersji Gitolite
$ guix package -A gitolite
gitolite 3.6.13 out gnu/packages/version-control.scm:2459:2
Zainstalowany serwer Gitolite jest w wersji wyższej niż 3.6.10
.
Nie trzeba więc wykonywać żadnej dodatkowej pracy adaptacyjnej.
Wprowadzenie kopiowanych repozytoriów do Gitolite
$ sudo su - git
Hasło:
$ cd /home/marek/Szablony/
$ cp -r guix.git guix-rust-past-crates.git nonguix.git ~/repositories
$ gitolite compile
$ gitolite setup --hooks-only
$ gitolite trigger POST_COMPILE
$ exit
$ cd gitolite-admin
$ $EDITOR conf/gitolite.conf
@kopie = guix
@kopie = guix-rust-past-crates
@kopie = nonguix
repo @kopie
RW+ = gitolite-admin
R = @all
$ git commit -am 'dodaje guix, guix-rust-past-crates, nonguix'
[master 4fc6ba1] dodaje guix, guix-rust-past-crates, nonguix
1 file changed, 12 insertions(+)
$ git push
Enter passphrase for key '/home/marek/.ssh/id_rsa':
Wymienianie obiektów: 7, gotowe.
Zliczanie obiektów: 100% (7/7), gotowe.
Kompresja delt z użyciem do 32 wątków
Kompresowanie obiektów: 100% (3/3), gotowe.
Zapisywanie obiektów: 100% (4/4), 1.15 KiB | 1.15 MiB/s, gotowe.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
To ssh://marekpasnikowski.pl:23/gitolite-admin.git
ee6d439..4fc6ba1 master -> master
I na oddzielnym komputerze, dla sprawdzenia:
$ git clone ssh://git@marekpasnikowski.pl:23/guix
Klonowanie do „guix”...
Enter passphrase for key '/home/marek/.ssh/id_rsa':
remote: Wymienianie obiektów: 897617, gotowe.
remote: Zliczanie obiektów: 100% (897617/897617), gotowe.
remote: Kompresowanie obiektów: 100% (178186/178186), gotowe.
remote: Total 897617 (delta 718947), reused 897617 (delta 718947), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (897617/897617), 318.02 MiB | 31.52 MiB/s, gotowe.
Rozwiązywanie delt: 100% (718947/718947), gotowe.
$ git clone ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates
Klonowanie do „guix-rust-past-crates”...
Enter passphrase for key '/home/marek/.ssh/id_rsa':
remote: Wymienianie obiektów: 617, gotowe.
remote: Zliczanie obiektów: 100% (617/617), gotowe.
remote: Kompresowanie obiektów: 100% (216/216), gotowe.
remote: Total 617 (delta 207), reused 617 (delta 207), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (617/617), 1.86 MiB | 31.72 MiB/s, gotowe.
Rozwiązywanie delt: 100% (207/207), gotowe.
$ git clone ssh://git@marekpasnikowski.pl:23/nonguix
Klonowanie do „nonguix”...
Enter passphrase for key '/home/marek/.ssh/id_rsa':
remote: Wymienianie obiektów: 11424, gotowe.
remote: Zliczanie obiektów: 100% (11424/11424), gotowe.
remote: Kompresowanie obiektów: 100% (4362/4362), gotowe.
remote: Total 11424 (delta 7010), reused 11424 (delta 7010), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (11424/11424), 2.57 MiB | 32.12 MiB/s, gotowe.
Rozwiązywanie delt: 100% (7010/7010), gotowe.
Tak wygląda prawidłowy proces.
Po drodze problemem była specyfika systemu Guix, przez co polecenie gitolite
musiałem wywołać bezpośrednio z odpowiedniego katalogu w /gnu/store
.
Trzeba też zwrócić uwagę na prawidłowe wywołanie git clone ssh://USER@...
, aby uniknąć błędu braku uprawnień.
DO ZROBIENIA Jest jeszcze jedna rzecz, którą mogę zrobić, aby móc przeglądać zawartość właśnie skopiowanych repozytoriów w przeglądarce internetowej. Ponieważ wyłączyłem automatyczne udostępnianie wszystkich repozytoriów w CGit, powinienem aktywować te nowo dodane repozytoria w konfiguracji tego programu.