Comment se déployer avec Gitlab-Ci vers EC2 en utilisant AWS CodeDeploy / CodePipeline/S3

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

je suis capable de construire complètement et tester mon application avec Gitlab-CI.

Comment puis-je effectuer un déploiement de Gitlab-CI à Amazon EC2 en utilisant CodeDeploy et CodePipeline?

Réponse à suivre comme un Guide pour ce faire.

17
demandé sur autronix 2016-07-30 11:10:00

1 réponses

j'ai créé un ensemble de fichiers d'exemple pour aller avec le Guide fourni ci-dessous. Ces fichiers sont disponibles à l'adresse suivante:https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/

Portée

ce guide suppose que

  • Gitlab projet hébergé sur L'EE - peut travailler sur des instances privées D'EC / EE (non testé)
  • Gitlab que le versioning GIT repository
  • Gitlab-CI comme le Moteur D'Intégration Continue
  • compte SSFE existant
  • AWS EC2 comme système cible de production ou de stadification pour le déploiement
  • AWS EC2 Instance exécutant Amazon Linux AMI
  • AWS S3 comme l'installation de stockage pour les fichiers de déploiement
  • AWS CodeDeploy comme moteur de déploiement pour le projet
  • AWS CodePipeline que le Pipeline de déploiement

La condition .gitlab-ci.yml échantillon est basé sur un Projet Java / Scala + Gradle. Le script est fourni comme exemple générique et devra être adapté à vos besoins spécifiques lors de la mise en œuvre de la livraison continue par cette méthode.

le guide supposera que l'utilisateur possède des connaissances de base sur les services de SSFE et sur la façon d'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 y ait probablement un équivalent CLI pour les tâches effectuées ici, ces questions ne seront pas traitées dans le guide.

Motivation

la motivation pour créer ces scripts et le guide de déploiement est venue du manque de disponibilité d'un tutoriel approprié montrant comment mettre en œuvre la livraison continue en utilisant Gitlab et AWS EC2. Gitlab a lancé son moteur de CI disponible gratuitement en partenariat avec Digital Ocean, qui permet aux dépôts utilisateurs de bénéficier gratuitement d'un CI de bonne qualité.

un des principaux avantages de L'utilisation de Gitlab est qu'ils fournissent des conteneurs d'intégration continue intégrés pour courir à travers les différentes étapes et valider une construction. Malheureusement, Gitblab nor AWS fournit une intégration qui permettrait D'effectuer une livraison continue après les constructions de passage.

This Guide and Scripts (https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/) fournir une version simplifiée des étapes que j'ai entreprises afin d'avoir un CI et un CD réussis en utilisant Gitlab et AWS EC2 qui peuvent aider n'importe qui d'autre à commencer ce type de mise en œuvre.

mise en place de L'environnement sur AWS

AWS IAM User

L'exigence initiale sera de mettre en place un IAM utilisateur:

https://console.aws.amazon.com/iam/home?#users

  1. Créer un utilisateur
  2. joindre les permissions suivantes:

    • CodePipelineFullAccess
    • AmazonEC2FullAccess
    • AmazonS3FullAccess
    • AWSCodeDeployFullAccess
    • Politique En Ligne: { "Version": "2012-10-17", "Déclaration": [ { "Effet": "Autoriser", "Action": [ "mise à l'échelle automatique:", "codedeploy:", "ec2:", "elasticloadbalancing:", "iam:Addroletoinccepprofile", "iam:Créateinstanceprofile", "iam:CreateRole", "iam:DeleteInstanceProfile", "iam:DeleteRole", "iam:DeleteRolePolicy", "iam:Gettinstanceprofile", "iam:GetRole", "iam:GetRolePolicy", "iam: Listenstancepourrole", "iam:ListRolePolicies", "iam:ListRoles", "iam:PassRole", "iam:PutRolePolicy", "iam:RemoveRoleFromInstanceProfile", "s3:" ], "Ressources": "" } ] }
  3. Générer des informations d'identification de sécurité

Remarque:: Les politiques énumérées ci-dessus sont d'une portée très large. Vous pouvez adapter à vos besoins par la création de politiques qui limitent l'accès à certaines ressources.

Remarque:: Veuillez conserver ces informations dans un endroit sûr. Vous en aurez besoin dans une étape ultérieure.

AWS EC2 instance & Rôle

rôle D'Instance pour CodeDeploy

https://console.aws.amazon.com/iam/home?region=us-east-1#roles

créer un nouveau rôle qui sera assigné à votre Instance EC2 afin d'accéder à S3,

  1. définissez le nom selon vos conventions de nommage (c.-à-d. MyDeploymentAppRole)
  2. Sélectionner Amazon EC2 afin de permettre aux instances EC2 d'exécuter d'autres services AWS
  3. joindre ce qui suit: politique:
    • AmazonEC2FullAccess
    • AmazonS3FullAccess
    • AmazonCodeDeployRole

Remarque:: Les politiques énumérées ci-dessus sont d'une portée très large. Vous pouvez adapter à vos besoins par la création de politiques qui limitent l'accès à certaines ressources.

Lancement Exemple

https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#

Cliquez sur Launch Instance et suivez ces étapes:

  • Sélectionner Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type
  • sélectionnez le type d'instance requis (t2.micro par défaut)
  • Sélectionner IAM RoleMyDeploymentAppRole (basé sur le nom créé dans le précédent section)
  • Choisir L'Entreposage Approprié
  • marquez votre instance d'un nom approprié (c.-à-d. MyApp-Production-Instance)
    • ajouter des balises supplémentaires requis
  • configurer le groupe de sécurité au besoin
  • Examen et de Lancer votre exemple

Vous être doté de la possibilité de générer ou d'utiliser des clés SSH. Veuillez choisir la méthode appropriée.

mise en place de l'instance de l'environnement

Install CodeDeploy Agent

connectez-vous à votre nouvelle instance EC2 et suivez les instructions:

CodeDeploy chemins importants:

  • CodeDeploy Déploiement répertoire de base: /opt/codedeploy-agent/deployment-root/
  • fichier journal CodeDeploy:/var/log/aws/codedeploy-agent/codedeploy-agent.log

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

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

AWS S3 repository

https://console.aws.amazon.com/s3/home?region=us-east-1

Dans cette étape, vous aurez besoin de créer un compartiment S3 qui organisera vos fichiers de déploiement.

il suffit de suivre ces étapes:

  1. Choisir Create Bucket
    • choisir un nom de seau (c.-à-d. my-app-codepipeline-deployment)
    • sélectionner une région
  2. dans la console pour votre seau sélectionnez Properties
    • étendre le Versioning menu
    • choisir Enable Versioning

AWS CodeDeploy

https://console.aws.amazon.com/codedeploy/home?region=us-east-1#/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 suivre ces les étapes:

  1. Sélectionner Create New Application
  2. choisir un nom D'Application (c.-à-d. MyApp-Production)
  3. choisir un nom de groupe de déploiement (c.-à-d. MyApp-Production-Fleet)
  4. Sélectionner les Instances EC2 qui seront touchés par ce déploiement - Search by Tags
    • Key Sélectionner Name
    • Value Sélectionner MyApp-Production-Instance
  5. Service Role, Sélectionnez MyDeploymentAppRole
  6. Cliquez sur Create Application

Remarque:: Vous pouvez assigner le déploiement des Balise qui s'applique aux instances souhaitées ciblées pour le déploiement. Par souci de simplicité, seule la balise Name a été utilisée pour choisir l'instance précédemment définie.

AWS CodePipeline

https://console.aws.amazon.com/codepipeline/home?region=us-east-1#/dashboard

la prochaine étape consiste à créer la CodePipeline, qui est chargé de réaliser la connexion entre le godet S3 et le procédé CodeDeploy.

pour créer une CodePipeline, suivez les étapes suivantes:

  1. Cliquez sur Create Pipeline
  2. Nommez votre pipeline (c.-à-d. MyAppDeploymentPipeline )
  3. mettez le Source ProviderAmazon S3
    • set Amazon S3 location à l'adresse de votre seau et la cible du fichier de déploiement (ie. s3://my-app-codepipeline-deployment/myapp.zip )
  4. Set Build ProviderNone - Ceci est déjà traité par Gitlab-CI comme nous le verrons plus tard
  5. Set Deployment ProviderAWS CodeDeploy
    • set Application Name le nom de votre CodeDeploy Application (ie. MyApp-Production)
    • set Deployment Group au nom de votre groupe de déploiement CodeDeploy (c.-à-d. MyApp-Production-Fleet )
  6. créer ou choisir un rôle de service de Pipeline
  7. examiner et cliquer sur Create Pipeline

mise en place de l'environnement sur Gitlab

maintenant que L'environnement AWS a été préparé pour recevoir le déploiement de l'application, nous pouvons procéder à la mise en place de L'environnement et des paramètres CI pour s'assurer que le code est construit et déployé sur une Instance EC2 en utilisant S3, CodeDeploy et la CodePipeline.

Variables Gitlab

pour le déploiement de travailler, nous avons besoin de définir quelques variables d'environnement dans le projet de référentiel.

dans votre projet Gitlab, naviguez vers le Variables zone pour votre projet et définissez les variables suivantes:

  • AWS_DEFAULT_REGION = > votre région SSFE
  • AWS_SECRET_ACCESS_KEY = > votre justificatif D'utilisateur SSFE clé secrète (obtenue lorsque vous avez généré les justificatifs d'identité pour l'utilisateur)
  • AWS_ACCESS_KEY_ID = > votre ID de clé de justificatif D'utilisateur SSFE (obtenu lorsque vous avez généré les justificatifs d'identité de l'utilisateur)
  • AWS_S3_LOCATION => l'emplacement de votre déploiement fichier zip (ie. 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 permettre au déploiement d'effectuer les tâches suivantes:

  • Démarrer l'application et créer un fichier PID
  • vérifier l'état de la demande à travers le fichier PID
  • Arrêt de l'application

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

Création d' gitlab-ci.yml

gitlab-ci.yml file est chargé d'effectuer les tâches D'Intégration Continue associées à une propagation donnée. Il agit comme un groupe simplifié de scripts shell qui sont 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 de référence, reportez-vous à deux liens:

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

pour les besoins du déploiement, nous ne couvrirons que le dernier morceau 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'ensemble du travail associé au déploiement à la suite des étapes précédentes, s'il y a lieu, de L'IC.

La partie pertinente associée avec le déploiement est ceci:

# 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 des paquets python: pip. pip est nécessaire pour installer AWS CLI, ce 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 fermer 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.

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

Création d'appspec.yml

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.

reportez-vous à la spécification de L'AppSpec CodeDeploy pour plus d'informations sur la façon de construire l' appspec.yml fichier: http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html

Générer le Déploiement ZipFile

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

Le fichier zip doit contenir:

  • Zip à la racine
    • appspec.yml = > déploiement CodeDeploy instructions
    • scripts de phase de déploiement
    • pourvu que les échantillons soient placés dans le scripts répertoire dans le fichier zip, nécessiterait la présence my_app.sh script à ajouter à la racine de votre répertoire de l'application (c'est à dire. my_app répertoire dans le zip)
    • code de distribution - dans notre exemple, il serait sous le my_app répertoire

des outils tels que Gradle et Maven sont capables de générer distribution fichiers zip avec certaines modifications au processus de génération de 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éploiement de votre application à l'EC2

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

gitlab-ci.yml. L'exemple fourni avec ce guide lancera un déploiement pour toute référence correspondant au regex suivant:/^v\d+\.\d+\.\d+-.*$/.

Dans ce cas, en appuyant sur une Balise v1.0.0-My-App-Alpha-Release via git sur votre Gitlab distante initierait le processus de déploiement. Vous pouvez modifier ces règles selon les exigences de votre projet.

gitlab-ci.yml exemple serait d'effectuer les tâches suivantes lors de la détection de la Balise v1.0.0-My-App-Alpha-Release:

  • travail - compiler le sources
  • travail de test - exécuter les tests unitaires
  • deploy-emploi - compiler les sources, générer la distribution zip, téléchargement zip pour 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 le changement dans la révision du fichier zip S3
  • CodePipeline valide le fichier
  • CodePipeline envoie un signal que le faisceau pour CodeDeploy est prêt
  • CodeDeploy exécute les étapes de déploiement
    • Démarrer - initialisation du déploiement
    • application Stop-exécute le script défini pour hook
    • DownloadBundle-obtient le fichier bundle du dépôt S3 par le biais de la CodePipeline
    • BeforeInstall-exécute le script défini pour hook
    • Install-copie le contenu à l'emplacement de déploiement tel que défini par le appspec.yml
    • AfterInstall-exécute le script défini pour hook
    • ApplicationStart-exécute le script défini pour hook
    • ValidateService-exécute le script défini pour hook
    • End - signale le CodePipeline que le déploiement a complété avec succès

déploiement Réussi captures d'écran:

Gitlab Deploy Job

CodePipeline Deploy

CodeDeploy hook script log

Références

78
répondu autronix 2017-07-31 11:33:57