Задача: создать AWS ECR репозиторий для образов проекта, и добавить джобу в Jenkins, которая будет собирать образы, и загружать их в этот репозиторий.
Продолжение – в посте Jenkins: деплой Docker Compose из Ansible и ECR авторизация.
Содержание
AWS ECR
Переходим в ECR, жмём Get Started, выбираем имя нового репозитория:
Оставляем по умолчанию Mutable, т.е. можно будет залить образ с тем же тегом, если он уже есть в репозитории.
Репозиторий готов:
IAM
Переходим в IAM, создаём пользователя:
Подключаем ему политику AmazonEC2ContainerRegistryFullAccess
:
Сохраняем его ключи доступа:
Настраиваем профиль в AWS CLI:
[simterm]
$ aws configure --profile bttrm-backend-ecr AWS Access Key ID [None]: AKI***6EZ AWS Secret Access Key [None]: PpN***GNr Default region name [None]: us-east-2 Default output format [None]: json
[/simterm]
Получаем токен доступа:
[simterm]
$ aws --profile bttrm-backend-ecr ecr get-login --no-include-email --region us-east-2 docker login -u AWS -p eyJ***M30= https://534***385.dkr.ecr.us-east-2.amazonaws.com
[/simterm]
Логинимся:
[simterm]
$ docker login -u AWS -p eyJ***M30= https://534***385.dkr.ecr.us-east-2.amazonaws.com WARNING! Using --password via the CLI is insecure. Use --password-stdin. WARNING! Your password will be stored unencrypted in /home/setevoy/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded
[/simterm]
Находим любой имеющийся локально образ:
[simterm]
$ docker images | grep nginx nginx alpine 031c45582fce 5 months ago 16.1MB nginx latest 06144b287844 12 months ago 109MB
[/simterm]
Тегаем его с новым именем и именем репозитория:
[simterm]
$ docker tag nginx:latest 534***385.dkr.ecr.us-east-2.amazonaws.com/test:latest
[/simterm]
Пушим в репозиторий:
[simterm]
$ docker push 534***385.dkr.ecr.us-east-2.amazonaws.com/test:latest The push refers to repository [534***385.dkr.ecr.us-east-2.amazonaws.com/test] 579c75bb43c0: Pushed 67d3ae5dfa34: Pushed 8b15606a9e3e: Pushed latest: digest: sha256:c0b69559d28fb325a64c6c8f47d14c26b95aa047312b29c699da10380e90b4d7 size: 948
[/simterm]
Окей, тут всё работает.
Jenkins
Следующим шагом – надо добавить джобу в Jenkins, которая будет по вебхуку собирать образ, тегать его, и пушить в репозиторий.
Amazon ECR authentication
Для авторизации в ECR потребуется выполнить aws ecr get-login для получения токена, который потом используется для docker login.
Что бы не выполнять aws ecr get-login – используем плагин Amazon ECR. устанавливаем его:
Добавляем данные доступа к новому репозиторию – переходим в Credentials – Add credentials, тип AWS Credentials:
Build && push job
Создаём новую Pipeline-джобу:
И скрипт:
node { def app stage('Clone repository') { git branch: "master", url: "[email protected]:example-dev/go-queue-consumer.git", credentialsId: "jenkins-example-github" } stage('Build image') { sh "docker build --build-arg APP_NAME=receipts -t 534***385.dkr.ecr.us-east-2.amazonaws.com/bttrm-receipt-consumer:latest -f docker/prod/Dockerfile ." } stage('Push image') { docker.withRegistry('https://534***385.dkr.ecr.us-east-2.amazonaws.com', 'ecr:us-east-2:bttrm-backend-ecr') { sh "docker push 534***385.dkr.ecr.us-east-2.amazonaws.com/bttrm-receipt-consumer:latest" } } }
В ‘ecr:us-east-2:bttrm-backend-ecr‘ задаём получение токена ECR в регионе us-east-2, используя ACCESS и SECRET ключи, добавленные в Credentials.
Запускаем билд:
Готово.