2
votes

L'exécution de l'action AWS CodePipeline a échoué

J'essaye de raccorder mon dépôt GitHub à S3 afin que chaque fois qu'il y ait une validation, AWS CodePipeline déploiera le dossier ./ / public dans un compartiment S3 spécifié .

Jusqu'à présent dans mon pipeline, la Source fonctionne (accrochée à GitHub et récupère de nouveaux commits) mais le Deploy a échoué car: Action l'exécution a échoué BundleType doit être YAML ou JSON .

Voici comment je les configure:

CodePipeline

  • Nom de l'action: Source
  • Fournisseur d'action: GitHub
  • Référentiel: account/repo
  • Branche: maître
  • Webhooks GitHub

CodeDeploy

  • Type de calcul: AWS Lambda
  • Rôle de service: myRole
  • Paramètres de déploiement: CodeDeployDefault.LambdaAllAtOnce

Rôle IAM: myRole

  • Service AWS
  • Choisissez le service qui utilisera ce rôle: Lambda / CodeDeploy
  • Sélectionnez votre cas d'utilisation: CodeDeploy
  • Stratégies: AWSCodeDeployRole

Je comprends qu'il doit y avoir un fichier buildspec.yml dans le dossier racine. J'ai essayé d'utiliser quelques fichiers que j'ai pu trouver mais ils ne semblent pas fonctionner. Qu'est-ce que j'ai fait de mal ou comment dois-je modifier le fichier buildspec pour faire ce que je veux?

Mettre à jour

Merci à @Milan Cermak. Je comprends que je dois faire:

CodePipeline:

  • Étape 1: Source: hook avec le dépôt GitHub. Celui-ci fonctionne.
  • Étape 2: Build: utilisez CodeBuild pour récupérer uniquement le dossier souhaité en utilisant un fichier buildspec.yml dans le dossier racine du dépôt.
  • Étape 3: déploiement: utilisation
Action Provider: S3
Input Artifacts: OutputArtifacts (result of stage 2).
Bucket: the bucket that hosts the static website.

CodePipeline fonctionne. Cependant, la sortie ne contient que des fichiers (.html) et non des dossiers imbriqués dans le dossier public.

J'ai vérifié this et a figuré comment supprimer le chemin d'un dossier imbriqué avec discard-chemins : oui mais je ne parviens pas à récupérer tous les sous-dossiers dans le dossier ./ / public . Une suggestion?


0 commentaires

4 Réponses :


3
votes

CodeBuild utilise buildspec, mais CodeDeploy utilise appspec.

Existe-t-il un fichier appspec?


1 commentaires

Merci @t_yamo Non, j'ai oublié de l'inclure. Dans mon cas, à quoi cela devrait-il ressembler? J'ai vérifié ici: docs.aws.amazon.com/codedeploy/latest/userguide/... Mais il semble que même si je "déploie" le dossier de construction, je dois mettre les fichiers dans un compartiment S3. J'ai besoin de le spécifier quelque part.



2
votes

Vous ne devriez pas utiliser CodeDeploy, car il s'agit d'un service d'automatisation des déploiements d'applications, mais plutôt CodeBuild, qui exécute des commandes et prépare l'artefact de déploiement pour une utilisation ultérieure dans le pipeline.

Ces commandes sont dans le fichier buildspec.yml (généralement dans le répertoire racine du dépôt, mais il est configurable). Pour votre cas d'utilisation, ce ne sera pas trop compliqué, car vous ne compilez rien ou n'exécutez pas de tests, etc.

Essayez ceci comme point de départ:

version: 0.2

phases:
  build:
    commands:
      - ls

artifacts:
  files:
    - public/*


8 commentaires

J'ai peut-être mal compris votre réponse, mais il semble qu'il s'agisse de créer le code pour une utilisation ultérieure. Mon objectif est de pousser le dossier public qui est déjà dans le repo vers un S3.


Oui, vous avez bien compris cette partie. CodeBuild est un peu exagéré, mais comme vous voulez pousser uniquement le répertoire public vers S3, vous devez "reconditionner" l'artefact qui vient de l'étape Source (votre dépôt git) vers le Deploy étape (l'action de déploiement S3). C'est ce que fait CodeBuild ici; la section artefacts définit quels fichiers vont dans l'artefact de sortie de l'étape de construction. Une chose qui m'a manqué - comme prochaine étape dans le pipeline, vous devriez avoir le déploiement S3 (comme cela a été suggéré ici et aussi dans votre autre question SO).


Je vous remercie. Je comprends ce que vous suggérez. Je pense que je m'en approche. Ne fait toujours pas ce que j'attends. Je vais mettre à jour ma question.


Si vous voulez tout , même plonger dans les sous-répertoires de public , essayez d'utiliser public / ** / * dans le buildspec.yml. Faites-moi savoir si cela aide.


C'est le cas et j'ai essayé cela. Le problème est qu'il a jeté tous les fichiers des sous-dossiers à la racine du compartiment S3. Cela a brisé les liens vers les actifs, le CSS et autres. J'essaye de conserver l'arborescence du dossier public .


N'utilisez pas les discard-chemins: oui alors. Cela devrait garder la structure des dossiers intacte.


Désolé. Je vous ai confondu. J'essaie de pousser un dossier public imbriqué donc j'ai besoin de chemins de suppression. Sinon, il lancera simplement le dossier avec son chemin vers le bucket s3, ce qui conduit à ce que index.html reste dans un dossier imbriqué, pas à la racine du bucket.


Laissez-nous continuer cette discussion dans le chat .



0
votes

4 commentaires

J'ai lu celui-là. C'est pour Code Commit, pas directement depuis GitHub.


@Viet l'action de déploiement S3 fonctionnera avec toute action source prise en charge (y compris GitHub).


@TimB Merci. Cela déploiera tout ce qui se trouve dans mon dépôt sur le s3, pas seulement le dossier que je veux, non?


Je ne pense pas qu'il soit possible de configurer l'action de déploiement S3 pour déployer partiellement un artefact (c'est-à-dire sélectionner un dossier). Il semble que vous ayez besoin d'une étape de construction (créez au minimum un nouvel artefact à partir du dossier que vous souhaitez déployer - une étape de construction est également un bon endroit pour faire d'autres choses comme la compilation Typescript, Webpack, Hugo / Jekyll générer, etc.)



1
votes

Buildspec est pour CodeBuild comme l'a souligné t_yamo.

Vous utilisez CodeDeploy qui utilise un fichier appspec.yml, qui ressemble à ceci pour ma configuration.

#!/bin/bash
// Do something

UnzipResourceBundle.sh est juste un script bash qui peut être utilisé pour faire un certain nombre de choses.

version: 0.0
os: linux
files:
  - source: /
    destination: /path/to/destination
hooks:
  BeforeInstall:
    - location: /UnzipResourceBundle.sh
  ApplicationStart:
    - location: /RestartServer.sh
      timeout: 3600

Vous pouvez trouver un exemple du fichier AppSpec.yml dans la documentation d'Amazon ici - https : //docs.aws.amazon.com/codedeploy/latest/userguide/reference-appspec-file-example.html#appspec-file-example-lambda


0 commentaires