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.
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
- Créer un utilisateur
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": "" } ] }
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,
- définissez le nom selon vos conventions de nommage (c.-à-d.
MyDeploymentAppRole
) - Sélectionner
Amazon EC2
afin de permettre aux instances EC2 d'exécuter d'autres services AWS - 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 Role
MyDeploymentAppRole
(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:
- Choisir
Create Bucket
- choisir un nom de seau (c.-à-d.
my-app-codepipeline-deployment
) - sélectionner une région
- choisir un nom de seau (c.-à-d.
- dans la console pour votre seau sélectionnez
Properties
- étendre le
Versioning
menu - choisir
Enable Versioning
- étendre le
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:
- Sélectionner
Create New Application
- choisir un nom D'Application (c.-à-d.
MyApp-Production
) - choisir un nom de groupe de déploiement (c.-à-d.
MyApp-Production-Fleet
) - Sélectionner les Instances EC2 qui seront touchés par ce déploiement -
Search by Tags
Key
SélectionnerName
Value
SélectionnerMyApp-Production-Instance
Service Role
, SélectionnezMyDeploymentAppRole
- 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:
- Cliquez sur
Create Pipeline
- Nommez votre pipeline (c.-à-d.
MyAppDeploymentPipeline
) - mettez le
Source Provider
Amazon 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
)
- set
- Set
Build Provider
None
- Ceci est déjà traité par Gitlab-CI comme nous le verrons plus tard - Set
Deployment Provider
AWS 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
)
- set
- créer ou choisir un rôle de service de Pipeline
- 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 SSFEAWS_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ésencemy_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:
Références
- Gitlab-CI Démarrage rapide: http://docs.gitlab.com/ce/ci/quick_start/README.html
- Gitlab-CI .gitlab-ci.yml: http://docs.gitlab.com/ce/ci/yaml/README.html
- SSFE Codépipéline Procédure pas à pas: http://docs.aws.amazon.com/codepipeline/latest/userguide/getting-started-w.html
- Installer ou de Réinstaller le AWS CodeDeploy de l'Agent: http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html
- AWS CLI prise en main - Env: http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment
- Référence AppSpec: http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html