So richten Sie die Bereitstellung von Webanwendungen unter Go for Gitlab auf VDS ein


Vorwort


Dieser Artikel ist das Ergebnis einer einwöchigen Suche nach sehr fragmentierten Informationen zum Konfigurieren der Webdienstbereitstellung unter Go. Nicht auf Heroku, nicht auf Docker, nicht auf Digital Ocean, sondern nur auf altmodischem VDS mit CentOS 7x64. Aus irgendeinem Grund verfügt das Netzwerk nicht über diese Informationen, und die meisten Tutorials beginnen mit dem Einrichten des Builds und enden mit dem Start von Tests.

Ich werde Sie sofort warnen, dass ich zum ersten Mal den CI / CD-Prozess eingerichtet habe. Dies ist also ein Artikel von Anfänger zu Anfänger.

Sicherlich kann hier viel korrigiert werden, daher werde ich Kommentare mit Freude in den Kommentaren akzeptieren und versuchen, die Änderungen so schnell wie möglich zu aktualisieren. Es ist auch möglich, dass ein solcher Artikel bereits existiert, und ich benutze die Suchmaschine einfach schrecklich. Dann geben Sie bitte einen Link dazu, und in diesem Fall werde ich den Artikel löschen und Asche auf meinen Kopf streuen.

Ausgangsdaten


  • VDS-Server
  • Betriebssystem: CentOS 7x64
  • Gehen Sie Projekt mit der folgenden Struktur:

src/ public/ index.html main.go 

Server-Setup: Erstellen Sie einen Dienst


Erstellen Sie zunächst einen Service für unsere Anwendung. In CentOS 7 ist dies ziemlich einfach. Sie müssen ein solches Skript in eine Datei namens serviceName.service schreiben:

 [Unit] #   Description=Service Description After=network.target [Service] Type=simple #  ,       User=username #    ExecStart=/username/service/binaryFile Restart=on-abort [Install] WantedBy=multi-user.target 

Das Skript selbst muss im Ordner etc / systemd / system / abgelegt werden

SSH-Setup


Führen Sie auf dem Server den folgenden Befehl aus:

 ssh-keygen -f /etc/ssh/hmp.key 

Auf Anfrage
Passphrase eingeben (leer für keine Passphrase)
Geben Sie kein Passwort ein, drücken Sie einfach die Eingabetaste.

Im Ordner / etc / ssh / werden zwei Dateien generiert:

  1. hmp.key - privater Schlüssel
  2. hmp.key.pub - öffentlicher Schlüssel

Wir brauchen einen privaten Schlüssel. Zeigen Sie den Inhalt mit dem folgenden Befehl an:

 cat /etc/ssh/hmp.key 

Es wird ungefähr so ​​aussehen:

 -----BEGIN RSA PRIVATE KEY----- {    } -----END RSA PRIVATE KEY----- 

Alle vollständig in Ihre Zwischenablage kopieren

ACHTUNG! - nicht nur der Schlüssel selbst, sondern auch
----- RSA PRIVATE KEY BEGINNEN ----- und ----- END RSA PRIVATE KEY -----

Gitlab-Setup


Geben Sie zunächst die für das Depot wichtigen Daten ein (Benutzername, Passwort usw.).
Auch wenn Ihr Repository öffentlich ist, bleiben sie geschlossen.

Gehen Sie in Gitlab im Repository zu Einstellungen -> CI / CD -> Variablen. Dort erstellen wir folgende Variablen:

  • SSH_PRIVATE_KEY - Fügen Sie hier den im vorherigen Absatz kopierten Wert ein
  • USER_PASS - Benutzerkennwort, über das die Anwendung gestartet wird
  • USER - Benutzername, von dem aus die Anwendung gestartet wird
  • HOST - die Adresse Ihres VDS
  • TARGET_DIR_ON_HOST - Der Zielordner, in dem sich Ihr Dienst in meinem Beispiel befindet, ist / username / service /
  • SERVICE_NAME - Dienstname
  • GROUP_NAME ist Ihr Gitlab-Benutzername
  • REPOSITORY_NAME - der Name Ihres Repositorys

Fügen Sie die Datei .gitlab-ci.yml mit dem folgenden Inhalt zum Repository hinzu:

 image: golang:latest before_script: #     sshpass - apt-get update -qq && apt-get install -y -qq sshpass #  ,    .   govendor,      - go get github.com/gorilla/mux - go get github.com/gorilla/websocket #  SSH - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )' - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null - mkdir -p ~/.ssh - chmod 700 ~/.ssh - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config #     - mkdir -p /go/src/gitlab.com/$GROUP_NAME #     - git clone git@gitlab.com:$GROUP_NAME/$REPOSITORY_NAME.git /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME #      - mkdir -p $CI_PROJECT_DIR/build/ #        (, HTML- ..)  . #       src/public - cp -r $CI_PROJECT_DIR/src/public $CI_PROJECT_DIR/build stages: - build - deploy compile: stage: build script: #     Go  - cd /go/src/gitlab.com/$GROUP_NAME/$REPOSITORY_NAME/src #    . ,        build       main - go build -race -ldflags "-extldflags '-static'" -o $CI_PROJECT_DIR/build/main artifacts: paths: - $CI_PROJECT_DIR/build/main deploy: stage: deploy script: #      ()      public - cd $CI_PROJECT_DIR/build #   sshpass      VDS - sshpass -V - export SSHPASS=$USER_PASS #   - sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl stop $SERVICE_NAME #    - sshpass -e scp -o stricthostkeychecking=no -r . $USER@$HOST:$TARGET_DIR_ON_HOST #   - sshpass -e ssh -o stricthostkeychecking=no $USER@$HOST systemctl restart $SERVICE_NAME 

Nach dem Optimieren schieben wir dieses Skript in das Repository und haben eine vorgefertigte Assembly und Bereitstellung. Das ist alles!

Hoffe der Artikel war hilfreich. Bei Fragen und Kommentaren stehe ich Ihnen gerne in den Kommentaren zur Verfügung!

Source: https://habr.com/ru/post/de421087/


All Articles