GitHub Action для пуша в Yandex Cloud Container Registry
Вы можете собрать docker-образ в GitHub Action, а эта инструкция расскажет как удобно его доставить до registry в Yandex.Cloud.
Для этого нам понадобится следующий action — https://github.com/yc-actions/yc-cr-login
Использовать его достаточно просто. Нужно лишь в workflow. Если в вашем репозитории еще нет ни одного воркфлоу, первый можно добавить прямо в UI GitHub. Для этого перейдите на таб Actions и создайте новый workflow.
Workflow описывается в формате yaml. Нам стоит обратить на следующие части.
on
В этой секции описываются условия запуска воркфлоу.
Варианты: release
, push
, pull_request
или workflow_dispatch
, который позволяет запускать workflow по кнопке, что очень удобно для дебага.
# Controls when the action will run.
on:
release:
types: [created]
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
jobs.build.steps
Именно в эту секцию нам нужно добавить шаги из action’а упомянутого выше.
# Steps represent a sequence of tasks
# that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE,
# so your job can access it
- uses: actions/checkout@v2
# Runs a single command using the runners shell
- name: Yandex Cloud CR "Login" Action for GitHub Actions
uses: yc-actions/yc-cr-login@v0.1-alpha
with:
yc-sa-json-credentials: ${{ secrets.YC_SA_JSON_CREDENTIALS }}
- name: Build, tag, and push image to Yandex Cloud Container Registry
env:
CR_REGISTRY: crp00000000000000000
CR_REPO: yc-cr-github-action
IMAGE_TAG: ${{ github.sha }}
run: |
docker build -t cr.yandex/$CR_REGISTRY/$CR_REPO:$IMAGE_TAG .
docker push cr.yandex/$CR_REGISTRY/$CR_REPO:$IMAGE_TAG
Внимание, стоит обратить на то, что yc-actions/yc-cr-login
должен быть вызван с параметром yc-sa-json-credentials
в который мы передадим параметры необходимые для аутентификации в container registry в Yandex.Cloud. На момент написания поста, action поддерживает только один способ аутентификации — через авторизованных ключей сервисных аккаунтов. Это наиболее гибкий и безопасный способ, так как позволяет гранулярно настроить пермишены и в любой момент отозвать этот ключ, если на это появятся основания.
И так нам, как сказано в документции, создать ключ от имени выбранного сервисного аккаунта и сохранить его в JSON формате.
yc iam key create --service-account-name $SA -o key.json
Теперь мы можем сохранить этот ключ в секретах репозитория на GitHub. Перейдите в настройки, на вкладку Secrets и нажмите кнопку New repository secret
. Удобно будет назвать наш секрет YC_SA_JSON_CREDENTIALS
, т.к. это имя использованно в примере выше. Но в принципе имя может быть любым.
Настройка секретов репозитория.
Теперь этот секрет будет доступен workflow в момент выполнения.
Теперь подробно разберем шаг Build, tag, and push image to Yandex Cloud Container Registry
.
В нём описаны три переменных.
CR_REGISTRY: crp00000000000000000
— здесь необходимо указать id вашего registry.
CR_REPO: yc-cr-github-action
— название репозитория, может быть любым.
IMAGE_TAG: ${{ github.sha }}
— в эту переменную мы запишем хэш коммита из которого мы будем собирать докер образ. Это удобно по многим параметрам. Во-первых, мы всегода будем знать какой код попал в образ. Во-вторых, если перетирать один и тот же тэг могут появиться непредвиденные побочные эффкты.
Отлично. Теперь мы можем запустить workflow и убедиться, что он работает.
Docker-образ запушен в Yandex.Cloud CR
Вот ссылка на полный репозиторий с полным примером.