web-dev-qa-db-fra.com

Créer un référentiel AWS ECR s'il n'existe pas

Comment puis-je créer un référentiel AWS ECR s'il n'existe pas déjà?

23
Ysak

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}
23
James Soubry

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:

https://aws.Amazon.com/blogs/devops/how-to-create-an-AMI-builder-with-aws-codebuild-and-hashicorp-packer/

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.

4
Ryan J. McDonough

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
2
Akif

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)
}
2
Aleks Sidorenko

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

0
Acumenus