web-dev-qa-db-de.com

Wie benutze ich GoLang mit einem privaten Gitlab Repo

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-Servers
  • private-developers ist eine Benutzergruppe, die Zugriff auf das private Repo hat

Golang 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?

26
James Fremen

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:

  1. 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
    
  2. 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 .

  3. Ä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'
    
  4. 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.

10
daplho

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.

27
Rick Smith

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.

7
JimB

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.

2
captncraig

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

1
James Fremen

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
0
Feiyu Zhou

Sie können Ihre Git-Anmeldeinformationen einrichten und Go verwendet diese:

  1. generieren Sie ein eindeutiges Passwort auf Ihrem Github (irgendwo in den Einstellungen).
  2. git config credential.helper store
  3. echo https://your-github-username:[email protected] >> ~/.git-credentials
  4. profitieren.
0
OneOfOne

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.

  1. Erstellen .netrc-Datei in Ihrem $ HOME-Verzeichnis
$ touch $HOME/.netrc
  1. Bearbeite dein .netrc mit Ihren Gitlab-Zugangsdaten
machine gitlab.<private>.com
login <gitlab-username>
password <gitlab-access-token>

... (more private repositories if needed)
  1. Führen Sie in Ihrem Go-Repository den Befehl dep aus, um private Pakete aufzulösen. In diesem Fall,
$ dep ensure -v
0
Wesgur