Comment configurer le déploiement d'une application Web sur Go pour Gitlab sur VDS


Préface


Cet article est le résultat d'une recherche d'une semaine d'informations très fragmentées sur la façon de configurer le déploiement du service Web sur Go. Ni sur Heroku, ni sur Docker, ni sur Digital Ocean, mais uniquement sur des VDS à l'ancienne avec CentOS 7x64. Pour une raison quelconque, le réseau ne dispose pas de ces informations et la plupart des didacticiels commencent par la configuration de la génération et se terminent par le lancement des tests.

Je vous préviens immédiatement que pour la première fois j'ai configuré le processus CI / CD, il s'agit donc d'un article de débutant à débutant.

Certes, beaucoup de choses peuvent être corrigées ici, donc j'accepterai volontiers tous les commentaires dans les commentaires et j'essaierai de mettre à jour les changements dès que possible. Il est également possible qu'un tel article existe déjà, et j'utilise très mal le moteur de recherche. Ensuite, veuillez lui donner un lien, et dans ce cas, je supprimerai l'article et irai saupoudrer de cendres sur ma tête.

Données source


  • Serveur VDS
  • Système d'exploitation: CentOS 7x64
  • Projet Go avec la structure suivante:

src/ public/ index.html main.go 

Configuration du serveur: créer un service


Créez d'abord un service pour notre application. Dans CentOS 7, c'est assez simple. Vous devez écrire un tel script dans un fichier appelé serviceName.service:

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

Le script lui-même doit être placé dans le dossier etc / systemd / system /

Configuration SSH


Sur le serveur, exécutez la commande:

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

Sur demande
Entrez la phrase secrète (vide pour aucune phrase secrète)
n'entrez pas de mot de passe, appuyez simplement sur Entrée.

Deux fichiers sont générés dans le dossier / etc / ssh /:

  1. hmp.key - clé privée
  2. hmp.key.pub - clé publique

Nous avons besoin d'une clé privée. Affichez son contenu à l'aide de la commande:

 cat /etc/ssh/hmp.key 

Cela ressemblera à ceci:

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

Tout copier complètement dans votre presse-papiers

ATTENTION! - non seulement la clé elle-même, mais aussi
----- COMMENCER LA CLÉ PRIVÉE RSA ----- et ----- FIN DE LA CLÉ PRIVÉE RSA -----

Configuration de Gitlab


Remplissez d'abord les données importantes pour le dépôt (nom d'utilisateur, mot de passe, etc.).
Même si votre référentiel est public, ils resteront fermés.

Dans Gitlab dans le référentiel, allez dans Paramètres -> CI / CD -> Variables. Nous y créons les variables suivantes:

  • SSH_PRIVATE_KEY - collez ici la valeur copiée dans le paragraphe précédent
  • USER_PASS - mot de passe utilisateur à partir duquel l'application sera lancée
  • UTILISATEUR - nom d'utilisateur à partir duquel l'application sera lancée
  • HOST - l'adresse de votre VDS
  • TARGET_DIR_ON_HOST - le dossier cible dans lequel votre service sera situé dans mon exemple est / username / service /
  • SERVICE_NAME - nom du service
  • GROUP_NAME est votre nom d'utilisateur Gitlab
  • REPOSITORY_NAME - le nom de votre référentiel

Ajoutez le fichier .gitlab-ci.yml au référentiel avec le contenu suivant:

 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 

Après le réglage, nous poussons ce script dans le référentiel et nous avons un assemblage et un déploiement prêts à l'emploi. C’est tout!

J'espère que l'article vous a été utile. Pour toutes questions et commentaires, je serai heureux de répondre dans les commentaires!

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


All Articles