GitHub Action для пуша в Yandex Cloud Container Registry

Nikolay Matrosov
3 min readMay 28, 2021

Вы можете собрать 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

Вот ссылка на полный репозиторий с полным примером.

--

--