Comment puis-je créer un référentiel AWS ECR s'il n'existe pas déjà?
Un liner pour créer un repo s'il n'existe pas:
aws ecr describe-repositories --repository-names ${REPO_NAME} || aws ecr create-repository --repository-name ${REPO_NAME}
Vous pouvez le faire, mais vous devez d'abord vérifier si le dépôt existe. J'ai piraté ce script bash ensemble et il fait ce dont j'ai besoin:
#!/bin/bash
aws ecr describe-repositories --repository-names $1 2>&1 > /dev/null
status=$?
if [[ ! "${status}" -eq 0 ]]; then
aws ecr create-repository --repository-name $1
fi
L'argument serait un nom de référentiel. Pour que cela fonctionne dans CodeBuild, le travail aura besoin d'un rôle IAM qui lui permet de créer un dépôt ECR. Si vous avez besoin d'obtenir des informations d'identification AWS CLI dans votre travail de génération de code, consultez cet article de blog AWS:
Nous faisons exactement ce qui est décrit dans la "Créer une spécification de construction" pour utiliser JQ pour extraire les informations d'identification AWS.
AWS crée le référentiel uniquement s'il n'existe pas. Vous pouvez simplement ignorer l'erreur et l'échec avec|| true
dans le cas où le même référentiel existe:
aws ecr create-repository --repository-name <repo_name> || true
Si vous souhaitez que cela soit automatisé dans le pipeline scripté Jenkins, utilisez simplement cet extrait de code:
def ensureRegistry(accountId, region, repoName) {
Logger log = new Logger(this)
def accId = Shell.output("aws --region ${region} ecr describe-repositories --repository-names \"${repoName}\" | jq .repositories[].registryId | tr -d '\"'")
if (accId == accountId) {
log.info("Docker repository ${repoName} exists for account ${accId}")
} else {
log.info("Docker repository ${repoName} doesn't exist for account ${accId}")
Shell.status("aws --region ${region} ecr create-repository --repository-name \"${repoName}\"")
log.info("Docker repository ${repoName} was just created for account ${accId}")
}
}
Shell.groovy
est:
def output(cmd) {
sh(script: cmd, returnStdout: true)
}
def status(cmd) {
sh(script: cmd, returnStatus: true)
}
En plus de créer conditionnellement le référentiel, si vous souhaitez également extraire l'URI du référentiel, considérez cette commande bash multiligne:
REPO_URI=$(aws ecr describe-repositories --repository-names "${REPO_NAME}" --query "repositories[0].repositoryUri" --output text 2>/dev/null || \
aws ecr create-repository --repository-name "${REPO_NAME}" --query "repository.repositoryUri" --output text)
L'URI du dépôt peut être utile pour les opérations tag
et Push
.
Crédit partiel: réponse par JS