web-dev-qa-db-fra.com

AWS CodePipeline peut-il suivre plusieurs branches de fonctionnalités et exécuter des tests sur chacune?

Avec Bitbucket et Bamboo, j'ai pu demander à Bamboo de suivre chaque branche de fonctionnalité et d'exécuter des tests sur chacune de sorte que, au moment de la demande d'extraction, j'ai pu voir si la branche avait réussi ses tests unitaires.

Avec AWS CodePipeline , je ne peux pas dire si je suis capable de suivre chaque branche de fonctionnalité et de faire exécuter des tests sur elles avant de fusionner.

Est-ce possible? Si c'est le cas, veuillez me diriger vers la documentation.

21

Malheureusement, il ne semble pas possible de déclencher nativement des builds à partir de plusieurs branches dans CodePipeline. C'est un peu une surprise pour moi car tous les autres outils CI que j'ai utilisés offrent cette fonctionnalité dès la sortie de l'emballage (GitLabCI, TravisCI, CircleCI, Bitbucket Pipelines, TeamCity) ou avec un plugin testé au combat (Jenkins).

Cependant, il existe probablement plusieurs façons de contourner cette limitation pour l'instant, c'est celle que j'ai trouvée et que je peux utiliser/adapter: https://github.com/nicolai86/awesome-codepipeline-ci

J'ai exactement le même problème, j'y travaille maintenant. :)

12
matthewcummings516

Je cherchais une solution à ce problème exactement. Finalement, j'ai décidé d'avoir un CodeBuild, qui peut être déclenché à partir d'une expression régulière de branche, commencer le pipeline en poussant une archive vers une clé S3 spécifique. Dans mon cas, j'ai également demandé à CodeBuild de faire mon processus complet de génération/test, mais vous pouvez également configurer le CodeBuild pour extraire uniquement le code et appuyer sur la touche S3 qui déclenche votre CodePipeline.

Voici une partie d'un exemple de configuration CodeBuild correspondant à 2 branches: Example showing a <code>Branch filter</code> matching 2 branches

Ensuite, j'ai défini l'artefact CodeBuild pour accéder à une seule clé dans un seul compartiment.

Ensuite, j'ai configuré un CodePipeline avec une source Amazon S3 pointant vers la même clé/compartiment.

4
Brandon

Un examen plus approfondi montre qu'avec Cloudformation, vous pouvez choisir la branche qui CodePipeline suit ,

AWS CodeCommit (CodeCommit)

  • PollForSourceChanges¹ (Facultatif)
  • RepositoryName (obligatoire)
  • BranchName (obligatoire)

Vous pouvez voir un exemple de modèle complet mais l'étape CodePipeline ressemble,

Name: CheckoutSourceTemplate
ActionTypeId:
  Category: Source
  Owner: AWS
  Version: 1
  Provider: CodeCommit
Configuration:
  PollForSourceChanges: True
  RepositoryName: !GetAtt [PipelineRepo, Name]
  BranchName: master
OutputArtifacts:
  - Name: TemplateSource
RunOrder: 1

Avec CodeCommit Repo's , vous pouvez créer Triggers qui peuvent utiliser ces déclencheurs pour lancer une fonction Lambda ,

Vous pouvez configurer les fonctions Lambda en créant le déclencheur dans la console Lambda dans le cadre de la fonction. Il s'agit de la méthode la plus simple, car les déclencheurs créés dans la console Lambda incluent automatiquement les autorisations requises pour qu'AWS CodeCommit appelle la fonction Lambda. Si vous créez le déclencheur dans AWS CodeCommit, vous devez inclure une stratégie pour autoriser AWS CodeCommit à appeler la fonction. Pour plus d'informations, consultez Créer un déclencheur pour une fonction Lambda existante et Exemple 2: créer une stratégie pour l'intégration AWS Lambda .

Donc, ce qui pourrait arriver, c'est de configurer un modèle CloudFormation comme ci-dessus pour suivre la branche principale. Ensuite, déclenchez CodeCommit sur les modifications du référentiel et appelez une fonction Lambda qui utilise Boto3 pour get_pipeline pour récupérer le pipeline de branche maître.

Puis en utilisant soit update_pipeline ou create_pipeline pour ajouter une étape au pipeline de branche maître existant ou créer un tout nouveau pipeline qui suit les branches supplémentaires souhaitées.

De cette façon, le CodePipeline peut suivre les branches de fonctionnalité d'une manière utile.