Gitlab ist eine kostenlose Open-Source-Methode, um private .git
-Repositorys zu hosten, scheint aber nicht mit GoLang zu funktionieren. Beim Erstellen eines Projekts wird eine URL des Formulars generiert:
[email protected]:private-developers/project.git
woher:
1.2.3.4
ist die IP-Adresse des Gitlab-Serversprivate-developers
ist eine Benutzergruppe, die Zugriff auf das private Repo hatGolang 1.2.1 scheint diese Syntax nicht zu verstehen.
go get [email protected]:private-developers/project.git
ergebnisse in:
package [email protected]/project.git: unrecognized import path "[email protected]/project.git"
Gibt es eine Möglichkeit, dies zum Laufen zu bringen?
Dieses Problem wurde in Gitlab 8 behoben. * Es ist jedoch immer noch nicht intuitiv. Die schwierigste Herausforderung ist in der Tat go get
und die folgenden Schritte ermöglichen es Ihnen, diese zu überwinden:
Erstellen Sie ein SSH-Schlüsselpaar. Achten Sie darauf, ein vorhandenes Paar, das standardmäßig in ~/.ssh/
gespeichert ist, nicht zu überschreiben.
ssh-keygen -t rsa -b 4096
Erstellen Sie eine neue Secret Variable in Ihrem Gitlab-Projekt. Verwenden Sie SSH_PRIVATE_KEY
als Key und den Inhalt Ihres private Keys als Value .
Ändern Sie Ihren .gitlab-ci.yml
mit einem before_script
.
before_script:
# install ssh-agent if not already installed
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
# add the SSH key stored in SSH_PRIVATE_KEY
- ssh-add <(echo "$SSH_PRIVATE_KEY")
# for Docker builds disable Host key checking
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
Fügen Sie den Schlüssel public aus dem in Schritt 1 erstellten Schlüsselpaar als Bereitstellungsschlüssel in dem Projekt hinzu, das Sie für go get
benötigen.
Führen Sie diesen Befehl aus:
git config --global url."[email protected]:".insteadOf "https://1.2.3.4/"
Angenommen, Sie verfügen über die richtigen Berechtigungen für git clone
des Repositorys, wodurch go get
für all repos auf dem Server 1.2.3.4
funktioniert.
Ich habe dies mit der Go-Version 1.6.2, 1.8 und 1.9.1 getestet.
Wenn go get
das Repo nicht abrufen kann, können Sie den ursprünglichen Klon immer direkt mit git ausführen:
git clone [email protected]:private-developers/project.git $GOPATH/src/gitlab/private-developers/project
Die Tools funktionieren dann normal. Erwarten Sie go get -u
, für das das Flag -f
erforderlich ist, da git remote nicht mit dem kanonischen Importpfad übereinstimmt.
Gitlab unterstützt go get
nativ.
go get
gibt eine http-Anforderung an die von Ihnen angegebene URL aus und sucht nach Meta-Tags, die auf den genauen Quellcodeverwaltungspfad verweisen.
Für meine Gitlab-Installation ist dies mygitlabdomain.com/myProject/myRepo
. Für Sie gehe ich davon aus, dass dies 1.2.3.4/private-developers/project
wäre.
Leider scheint es nur den http scm-Pfad zu geben, nicht den ssh-Pfad, also musste ich meine Anmeldeinformationen eingeben, um zu klonen. Nach dem Klonen können Sie leicht mit der Fernbedienung in Ihrem lokalen Repository arbeiten, wenn Sie die ssh-URL aktualisieren möchten.
Sie können die URL testen, indem Sie http://1.2.3.4:private-developers/project?go-get=1
drücken und die Quelle anzeigen und nach dem Meta-Tag suchen.
Für das Protokoll funktioniert dies auch außerhalb von go mit gitlab 7.3.2 und kann, wie JimB festgestellt hat, als Workaround verwendet werden. Ich finde, dass ich nach Benutzername/Passwort gefragt werde, obwohl ein SSH-Schlüssel bei gitlab registriert ist:
git clone http://1.2.3.4/private-developers/project.git
Alternativ kann ich das SSH-Äquivalent verwenden, das, da ich einen bei Gitlab registrierten SSH-Schlüssel habe, die Aufforderungen vermeidet:
git clone [email protected]:private-developers/project.git
Funktioniert derzeit nicht mit go. Ein Update kann in 7.9 sein, aber ich hatte noch keine Gelegenheit, es zu testen: kommender Bugfix
Für HTTPS Private Gitlab Repo ist @Rick Smith genug. Hier ist eine Entschädigung für HTTP-Repo, führen Sie zuerst den Befehl:
git config --global url."[email protected]:".insteadOf "http://mygitlab.com/"
dann benutze unten go get
Befehl, um das Golang-Projekt zu erhalten:
go get -v -insecure mygitlab.com/user/repo
Sie können Ihre Git-Anmeldeinformationen einrichten und Go verwendet diese:
git config credential.helper store
echo https://your-github-username:[email protected] >> ~/.git-credentials
Ab dep Version 5.2 unterstützt dep
private Repositorys für private Gitlab-Repositorys.
In der Datei .netrc können Sie Ihren Gitlab-Benutzernamen und das Zugriffstoken für den Zugriff auf private Repositorys angeben.
.netrc
-Datei in Ihrem $ HOME-Verzeichnis$ touch $HOME/.netrc
.netrc
mit Ihren Gitlab-Zugangsdatenmachine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>
... (more private repositories if needed)
dep
aus, um private Pakete aufzulösen. In diesem Fall,$ dep ensure -v