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.
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/
Ce guide suppose ce qui suit
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.
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.
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.
La condition initiale sera de configurer un utilisateur IAM:
https://console.aws.Amazon.com/iam/home#users
Attachez les autorisations suivantes:
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": "*"
}
]
}
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.
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,
MyDeploymentAppRole
)Amazon EC2
Afin de permettre aux instances EC2 d'exécuter d'autres services AWSRemarque : 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.
https://console.aws.Amazon.com/ec2/v2/home
Cliquez sur Launch Instance
Et suivez ces étapes:
Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type
IAM Role
Pour être MyDeploymentAppRole
(basé sur le nom créé dans la section précédente) MyApp-Production-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.
Installer l'agent CodeDeploy
Connectez-vous à votre instance EC2 nouvellement créée et suivez les instructions:
CodeDeploy chemins importants:
/opt/codedeploy-agent/deployment-root/
/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.
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:
Create Bucket
my-app-codepipeline-deployment
)Properties
Versioning
Enable Versioning
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:
Create New Application
MyApp-Production
)MyApp-Production-Fleet
)Search by Tags
Key
Sélectionnez Name
Value
Sélectionnez MyApp-Production-Instance
Service Role
, Sélectionnez MyDeploymentAppRole
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.
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:
Create Pipeline
MyAppDeploymentPipeline
) Source Provider
Sur Amazon S3
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
)Build Provider
Sur None
- Ceci est déjà géré par Gitlab-CI comme il sera traité plus tard Deployment Provider
Sur AWS CodeDeploy
Application Name
sur le nom de votre application CodeDeploy (c.-à-d. MyApp-Production
)Deployment Group
sur le nom de votre groupe de déploiement CodeDeploy (c'est-à-dire MyApp-Production-Fleet
)Create Pipeline
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.
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 AWSAWS_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.
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:
Vous pouvez trouver ce script sous deploy/extras/my_app.sh
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
.
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
Pour que CodeDeploy fonctionne correctement, vous devez créer un fichier Zip correctement généré de votre application.
Le fichier Zip doit contenir:
appspec.yml
=> Instructions de déploiement de CodeDeployscripts
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)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.
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
:
Une fois que la distribution Zip a été téléchargée sur Amazon S3, les étapes suivantes se produisent:
files
de appspec.yml
Captures d'écran de déploiement réussies: