web-dev-qa-db-fra.com

Comment déployer avec Gitlab-Ci sur EC2 à l'aide d'AWS CodeDeploy / CodePipeline / S3

J'ai travaillé sur un projet SlackBot basé sur Scala en utilisant Gradle et j'ai cherché des moyens de tirer parti de Gitlab-CI dans le but de déployer sur AWS EC2.

Je suis en mesure de créer et de tester entièrement mon application avec Gitlab-CI.

Comment puis-je effectuer un déploiement de Gitlab-CI vers Amazon EC2 à l'aide de CodeDeploy et CodePipeline?

Réponse à suivre comme guide pour ce faire.

30
autronix

J'ai créé un ensemble d'exemples de fichiers pour accompagner le guide fourni ci-dessous. Ces fichiers sont disponibles sur le lien suivant: https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/

Portée

Ce guide suppose ce qui suit

  • Projet hébergé par Gitlab EE - peut fonctionner sur des instances CE/EE privées (non testé)
  • Gitlab comme référentiel de version GIT
  • Gitlab-CI comme moteur d'intégration continue
  • Compte AWS existant
  • AWS EC2 comme système de production ou de transfert cible pour le déploiement
  • Instance AWS EC2 exécutant Amazon Linux AMI
  • AWS S3 comme installation de stockage pour les fichiers de déploiement
  • AWS CodeDeploy en tant que moteur de déploiement pour le projet
  • AWS CodePipeline comme pipeline pour le déploiement

L'exemple .gitlab-ci.yml Fourni est basé sur un projet Java/Scala + Gradle. Le script est fourni à titre d'exemple générique et devra être adapté à vos besoins spécifiques lors de la mise en œuvre de la livraison continue via cette méthode.

Le guide suppose que l'utilisateur possède des connaissances de base sur les services AWS et comment effectuer les tâches nécessaires.

Remarque : le guide fourni dans cet exemple utilise la console AWS pour effectuer des tâches. Bien qu'il existe probablement un équivalent CLI pour les tâches effectuées ici, celles-ci ne seront pas traitées dans le guide.

Motivation

La motivation pour la création de ces scripts et du guide de déploiement est venue du manque de disponibilité d'un didacticiel approprié montrant comment implémenter la livraison continue à l'aide de Gitlab et AWS EC2. Gitlab a présenté son moteur CI disponible gratuitement en s'associant à Digital Ocean, qui permet aux référentiels utilisateurs de bénéficier gratuitement de CI de bonne qualité.

L'un des principaux avantages de l'utilisation de Gitlab est qu'il fournit des conteneurs d'intégration continue intégrés pour exécuter les différentes étapes et valider une génération. Malheureusement, Gitblab ni AWS ne fournissent une intégration qui permettrait d'effectuer la livraison continue après les builds en cours.

Ce guide et ces scripts ( https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/ ) fournissent une version simplifiée des étapes que j'ai entreprises afin d'avoir un CI et CD réussis utilisant Gitlab et AWS EC2 qui peuvent aider n'importe qui d'autre à démarrer avec ce type d'implémentation.

Configuration de l'environnement sur AWS

La première étape pour garantir la réussite du processus de livraison continue consiste à configurer les objets nécessaires sur AWS afin de permettre au processus de déploiement de réussir.

Utilisateur AWS IAM

La condition initiale sera de configurer un utilisateur IAM:

https://console.aws.Amazon.com/iam/home#users

  1. Créer un utilisateur
  2. Attachez les autorisations suivantes:

    • CodePipelineFullAccess
    • AmazonEC2FullAccess
    • AmazonS3FullAccess
    • AWSCodeDeployFullAccess
    • Politique en ligne:

        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "elasticloadbalancing:*",
                "iam:AddRoleToInstanceProfile",
                "iam:CreateInstanceProfile",
                "iam:CreateRole",
                "iam:DeleteInstanceProfile",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:GetInstanceProfile",
                "iam:GetRole",
                "iam:GetRolePolicy",
                "iam:ListInstanceProfilesForRole",
                "iam:ListRolePolicies",
                "iam:ListRoles",
                "iam:PassRole",
                "iam:PutRolePolicy",
                "iam:RemoveRoleFromInstanceProfile",
                "s3:*"
              ],
              "Resource": "*"
            }
          ]
        }
      
  3. Générer des informations d'identification de sécurité

Remarque : Les stratégies répertoriées ci-dessus ont une portée très large. Vous pouvez vous adapter à vos besoins en créant des stratégies personnalisées qui limitent l'accès uniquement à certaines ressources.

Remarque : veuillez conserver ces informations d'identification dans un endroit sûr. Vous en aurez besoin ultérieurement.

Instance et rôle AWS EC2

Rôle d'instance pour CodeDeploy

https://console.aws.Amazon.com/iam/home#roles

Créez un nouveau rôle qui sera assigné à votre instance EC2 afin d'accéder à S3,

  1. Définissez le nom en fonction de vos conventions de dénomination (par exemple. MyDeploymentAppRole)
  2. Sélectionnez Amazon EC2 Afin de permettre aux instances EC2 d'exécuter d'autres services AWS
  3. Attachez les politiques suivantes:
    • AmazonEC2FullAccess
    • AmazonS3FullAccess
    • AmazonCodeDeployRole

Remarque : Les stratégies répertoriées ci-dessus ont une portée très large. Vous pouvez vous adapter à vos besoins en créant des stratégies personnalisées qui limitent l'accès uniquement à certaines ressources.

Lancer l'instance

https://console.aws.Amazon.com/ec2/v2/home

Cliquez sur Launch Instance Et suivez ces étapes:

  • Sélectionnez Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type
  • Sélectionnez le type d'instance requis (t2.micro par défaut)
    • Prochain
  • Sélectionnez IAM Role Pour être MyDeploymentAppRole (basé sur le nom créé dans la section précédente)
    • Prochain
  • Sélectionnez un stockage approprié
    • Prochain
  • Marquez votre instance avec un nom approprié (par exemple, MyApp-Production-Instance)
    • ajouter des balises supplémentaires au besoin
    • Prochain
  • Configurez le groupe de sécurité selon vos besoins
    • Prochain
  • Vérifiez et lancez votre instance

Vous aurez la possibilité de générer ou d'utiliser des clés SSH. Veuillez sélectionner la méthode appropriée applicable.

Configuration de l'environnement d'instance

Installer l'agent CodeDeploy

Connectez-vous à votre instance EC2 nouvellement créée et suivez les instructions:

CodeDeploy chemins importants:

  • Répertoire de base du déploiement de CodeDeploy: /opt/codedeploy-agent/deployment-root/
  • Fichier journal CodeDeploy: /var/log/aws/codedeploy-agent/codedeploy-agent.log

Astuce : exécutez tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log Pour suivre le déploiement en temps réel.

Installez les prérequis de votre projet Si votre projet a des prérequis à exécuter, assurez-vous de les installer avant d'exécuter le déploiement, sinon votre script de démarrage peut échouer.

Référentiel AWS S3

https://console.aws.Amazon.com/s3/home

Dans cette étape, vous devrez créer un compartiment S3 qui contiendra vos fichiers de déploiement.

Suivez simplement ces étapes:

  1. Choisissez Create Bucket
    • Sélectionnez un nom de compartiment (c.-à-d. my-app-codepipeline-deployment)
    • Sélectionnez une région
  2. Dans la console de votre compartiment, sélectionnez Properties
    • Développez le menu Versioning
    • choisissez Enable Versioning

AWS CodeDeploy

https://console.aws.Amazon.com/codedeploy/home#/applications

Maintenant que les éléments de base sont définis, nous sommes prêts à créer l'application de déploiement dans CodeDeploy

Pour créer une application de déploiement CodeDeploy, procédez comme suit:

  1. Sélectionnez Create New Application
  2. Choisissez un nom d'application (c.-à-d. MyApp-Production)
  3. Choisissez un nom de groupe de déploiement (c'est-à-dire MyApp-Production-Fleet)
  4. Sélectionnez les instances EC2 qui seront affectées par ce déploiement - Search by Tags
    • Sous Key Sélectionnez Name
    • Sous Value Sélectionnez MyApp-Production-Instance
  5. Sous Service Role, Sélectionnez MyDeploymentAppRole
  6. Cliquez sur Create Application

Remarque : Vous pouvez attribuer le déploiement à n'importe quelle balise pertinente qui s'applique aux instances souhaitées ciblées pour le déploiement. Par souci de simplicité, seule la balise de nom a été utilisée pour choisir l'instance précédemment définie.

AWS CodePipeline

https://console.aws.Amazon.com/codepipeline/home#/dashboard

L'étape suivante consiste à procéder à la création du CodePipeline, qui est chargé d'effectuer la connexion entre le compartiment S3 et le processus CodeDeploy.

Pour créer un CodePipeline, procédez comme suit:

  1. Cliquez sur Create Pipeline
  2. Nommez votre pipeline (c.-à-d. MyAppDeploymentPipeline)
    • Prochain
  3. Réglez Source Provider Sur Amazon S3
    • définissez Amazon S3 location sur l'adresse de votre compartiment et du fichier de déploiement cible (c.-à-d. s3://my-app-codepipeline-deployment/myapp.Zip)
    • Prochain
  4. Réglez Build Provider Sur None - Ceci est déjà géré par Gitlab-CI comme il sera traité plus tard
    • Prochain
  5. Réglez Deployment Provider Sur AWS CodeDeploy
    • définissez Application Name sur le nom de votre application CodeDeploy (c.-à-d. MyApp-Production)
    • définissez Deployment Group sur le nom de votre groupe de déploiement CodeDeploy (c'est-à-dire MyApp-Production-Fleet)
    • Prochain
  6. Créer ou choisir un rôle de service de pipeline
    • Prochain
  7. Vérifiez et cliquez sur Create Pipeline

Configuration de l'environnement sur Gitlab

Maintenant que l'environnement AWS a été préparé pour recevoir le déploiement d'application, nous pouvons procéder à la configuration de l'environnement CI et des paramètres pour garantir que le code est créé et déployé sur une instance EC2 à l'aide de S3, CodeDeploy et CodePipeline.

Variables Gitlab

Pour que le déploiement fonctionne, nous devrons définir quelques variables d'environnement dans le référentiel du projet.

Dans votre projet Gitlab, accédez à la zone Variables de votre projet et définissez les variables suivantes:

  • AWS_DEFAULT_REGION => Votre région AWS
  • AWS_SECRET_ACCESS_KEY => Votre clé secrète d'informations d'identification utilisateur AWS (obtenue lorsque vous avez généré les informations d'identification pour l'utilisateur)
  • AWS_ACCESS_KEY_ID => Votre ID de clé d'identification d'utilisateur AWS (obtenu lorsque vous avez généré les informations d'identification pour l'utilisateur)
  • AWS_S3_LOCATION => L'emplacement de votre fichier Zip de déploiement (c.-à-d. s3://my-app-codepipeline-deployment/my_app.Zip)

Ces variables seront accessibles par les scripts exécutés par les conteneurs Gitlab-CI.

Script de démarrage

Un script de démarrage simple a été fourni ( https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/blob/master/deploy/extras/my_app.sh ) pour autoriser la déploiement pour effectuer les tâches suivantes:

  • Démarrez l'application et créez un fichier PID
  • Vérifier l'état de l'application via le fichier PID
  • Arrêtez l'application

Vous pouvez trouver ce script sous deploy/extras/my_app.sh

Création de gitlab-ci.yml

Le fichier gitlab-ci.yml Est en charge d'effectuer les tâches d'intégration continue associées à un commit donné. Il agit comme un groupe simplifié de scripts Shell organisés en étapes qui correspondent aux différentes phases de vos étapes d'intégration continue.

Pour plus d'informations sur les détails et la référence, veuillez vous référer aux deux liens suivants:

Vous pouvez valider la syntaxe de votre fichier gitlab-ci.yml À tout moment avec l'outil suivant: https://gitlab.com/ci/lint

Aux fins du déploiement, nous ne couvrirons que la dernière partie de l'échantillon fourni avec ce guide:

deploy-job:
  # Script to run for deploying application to AWS
  script:
    - apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default
    - pip install -U pip  # pip update
    - pip install awscli  # AWS CLI installation
    - $G build -x test -x distTar # # Build the project with Gradle
    - $G distZip  # creates distribution Zip for deployment
    - aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick up
  # requires previous CI stages to succeed in order to execute
  when: on_success
  stage: deploy
  environment: production
  cache:
    key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME"
    untracked: true
    paths:
        - build/
  # Applies only to tags matching the regex: ie: v1.0.0-My-App-Release
  only:
    - /^v\d+\.\d+\.\d+-.*$/
  except:
    - branches
    - triggers

Cette partie représente l'intégralité du travail associé au déploiement suivant la précédente, le cas échéant, C.I. étapes.

La partie pertinente associée au déploiement est la suivante:

# Script to run for deploying application to AWS
script:
  - apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default
  - pip install -U pip  # pip update
  - pip install awscli  # AWS CLI installation
  - $G build -x test -x distTar # # Build the project with Gradle
  - $G distZip  # creates distribution Zip for deployment
  - aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick up

La première étape consiste à installer le système de gestion de package python: pip. pip est requis pour installer l'AWS CLI, qui est nécessaire pour télécharger le fichier de déploiement sur AWS S3

Dans cet exemple, nous utilisons Gradle (défini par la variable d'environnement $G); Gradle fournit un module pour compresser automatiquement les fichiers de déploiement. Selon le type de projet que vous déployez, cette méthode sera différente pour générer le fichier Zip de distribution my_app.Zip.

La commande aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION Télécharge le fichier Zip de distribution à l'emplacement Amazon S3 que nous avons défini précédemment. Ce fichier est ensuite automatiquement détecté par CodePipeline, traité et envoyé à CodeDeploy. Enfin, CodeDeploy effectue les tâches nécessaires via l'agent CodeDeploy comme spécifié par le fichier appspec.yml.

Création de appspec.yml

Le appspec.yml Définit le comportement à suivre par CodeDeploy une fois qu'un fichier de déploiement a été reçu.

Un exemple de fichier a été fourni avec ce guide ainsi que des exemples de scripts à exécuter pendant les différentes phases du déploiement.

Veuillez vous référer aux spécifications de CodeDeploy AppSpec pour plus d'informations sur la façon de créer le fichier appspec.yml: http://docs.aws.Amazon.com/codedeploy/latest/userguide/app-spec -ref.html

Génération du fichier Zip de déploiement

Pour que CodeDeploy fonctionne correctement, vous devez créer un fichier Zip correctement généré de votre application.

Le fichier Zip doit contenir:

  • Racine Zip
    • appspec.yml => Instructions de déploiement de CodeDeploy
    • scripts de phase de déploiement
    • à condition que les échantillons soient placés dans le répertoire scripts du fichier Zip, il faudrait ajouter le script de présence my_app.sh à la racine du répertoire de votre application (c'est-à-dire le répertoire my_app dans le Zip)
    • code de distribution - dans notre exemple, il se trouverait dans le répertoire my_app

Des outils tels que Gradle et Maven sont capables de générer des fichiers Zip de distribution avec certaines modifications du processus de génération Zip. Si vous n'utilisez pas un tel outil, vous devrez peut-être demander à Gitlab-CI de générer ce fichier Zip d'une manière différente; cette méthode sort du cadre de ce guide.

Déployer votre application sur EC2

La dernière étape de ce guide consiste à effectuer un déploiement réussi.

Les étapes de l'intégration continue sont définies par les règles définies dans le gitlab-ci.yml. L'exemple fourni avec ce guide lancera un déploiement pour toute référence correspondant à l'expression régulière suivante: /^v\d+\.\d+\.\d+-.*$/.

Dans ce cas, pousser un Tag v1.0.0-My-App-Alpha-Release Via git sur votre Gitlab distant lancerait le processus de déploiement. Vous pouvez ajuster ces règles en fonction des exigences de votre projet.

L'exemple gitlab-ci.yml Fourni effectuerait les tâches suivantes lors de la détection de la balise v1.0.0-My-App-Alpha-Release:

  • build job - compiler les sources
  • tâche de test - exécuter les tests unitaires
  • deploy-job - compiler les sources, générer la distribution Zip, télécharger Zip sur Amazon S3

Une fois que la distribution Zip a été téléchargée sur Amazon S3, les étapes suivantes se produisent:

  • CodePipeline détecte la modification de la révision du fichier Zip S3
  • CodePipeline valide le fichier
  • CodePipeline envoie un signal indiquant que le bundle pour CodeDeploy est prêt
  • CodeDeploy exécute les étapes de déploiement
    • Démarrer - initialisation du déploiement
    • Arrêt de l'application - Exécute le script défini pour le hook
    • DownloadBundle - Obtient le fichier de l'ensemble du référentiel S3 via le CodePipeline
    • BeforeInstall - Exécute un script défini pour le hook
    • Installer - Copie le contenu à l'emplacement de déploiement tel que défini par la section files de appspec.yml
    • AfterInstall - Exécute le script défini pour le hook
    • ApplicationStart - Exécute un script défini pour le hook
    • ValidateService - Exécute un script défini pour le hook
    • Fin - Signale au CodePipeline que le déploiement s'est terminé avec succès

Captures d'écran de déploiement réussies:

Gitlab Deploy Job

CodePipeline Deploy

CodeDeploy hook script log

Les références

116
autronix