- PVSM.RU - https://www.pvsm.ru -
В мае 2019 года GitHub анонсировала [1] выход сервиса Package Registry. Вслед за этим, уже в августе, была анонсирована [2] поддержка CI/CD в Actions.
В статье я расскажу, что это за сервисы и как это можно использовать на примере небольшого пет-проекта на GitHub.
GitHub Actions это платформа которая позволяет управлять жизненным циклом ПО, исходный код которого размещен на GitHub. По факту, TravisCI, CircleCI и многие другие [3] бесплатные CI/CD платформы получили нового конкурента в лице Actions.
GitHub Package Registry является центральным репозиторием артефактов, в данный момент существует поддержка пяти различных типов артефактов.
Поддерживаемые типы артефактов в Actions
Поддержка в Actions | Аналог | Язык |
---|---|---|
NPM-пакеты | https://www.npmjs.com/ [4] | Javascript |
Docker-образы | https://hub.docker.com/ [5] | - |
Maven-артефакты | https://mvnrepository.com/ [6] | Java |
NuGet-пакеты | https://www.nuget.org/ [7] | .NET |
Ruby-гемы | https://rubygems.org/ [8] | Ruby |
Это удобная возможность иметь все артефакты в одном месте, ведь не всегда целесообразно разворачивать свой сервер Nexus или Artifactory.
GitHub все больше становится похожим на GitLab, а где-то даже уже и превзошел оппонента, например в GitLab пока еще [9] нет поддержки NuGet-пакетов и Ruby-гемов. По факту, если раньше для опенсорс проектов приходилось подключать внешние интеграции к GitHub, то сейчас все яйца в одной корзине. Тут уж пусть каждый сам решает хорошо это или плохо, но как минимум это удобно.
В данный момент оба сервиса находятся в бета-режиме, зарегистрироваться в бета-тесте можно на этих [10] страницах [11].
Миграция с других сервисов очень простая, я мигрировал несколько своих пет-проектов с TravisCI и DockerHub на Actions и Package Regisry соответственно.
Покажу как это выглядит на одном из примеров. Проект самый обычный, я писал о нем в этой [12] статье. Ничего сверхсложного, обычный LaTeX-код, с помощью которого собираются артефакты (2 PDF файла), они публикуются в релизах GitHub. Для того чтобы не скачивать кучу LaTeX-пакетов я написал Dockerfile, чтобы можно было удобно работать из-под любой ОС.
Для того чтобы начать работать с Package Registry вместо DockerHub нужно сделать всего два простых шага.
Создаем токен в настройках GitHub (у токена должны быть права на запись и чтение артефактов).
Страница создания токена
И далее можем аутентифицироваться с созданным токеном и пушить артефакты, вот так все просто:
docker login docker.pkg.github.com --username amet13
docker tag docker-latex:0.0.1 docker.pkg.github.com/amet13/master-thesis/docker-latex:0.0.1
docker push docker.pkg.github.com/amet13/master-thesis/docker-latex:0.0.1
Обратите внимание, я специально указал свой никнейм на GitHub в нижнем регистре, иначе вы получите ошибку от Docker:
Error parsing reference: "docker.pkg.github.com/Amet13/master-thesis/docker-latex:0.0.1" is not a valid repository/tag: invalid reference format: repository name must be lowercase
А вот как это выглядит в веб-интерфейсе GitHub:
Страница Package Registry для Docker-образов
Помимо инструкций по скачиванию последнего образа, доступна статистика по скачиваниям, возможность скачать отдельный Docker-слой через веб-интерфейс, доступна история загрузки образов.
С Actions немного посложнее, но тем кто когда-либо работал с любой другой CI/CD системой не составит труда разобраться. Конфигурация в Actions описывается декларативным YAML, хотя до этого использовался [13] HCL.
Немного базовых понятий (я намеренно не буду переводить определения, по-моему тут итак все ясно):
.github/workflows
Так выглядит страница со списком Job в Workflow
Ограничения и запреты:
Самая актуальная документация доступна по этой ссылке [15].
А вот так выглядят логи одной из Job
Вернемся к моему примеру, вот как [16] выглядит мой конфиг, разберем его подробнее по частям.
Указываем имя для Workflow и описываем на какой триггер он должен срабатывать (список всех триггеров описан в документации [17]):
name: master-thesis
on: [push]
На каком Virtual Environment запускаем Job:
jobs:
build:
# ubuntu-latest, ubuntu-18.04, or ubuntu-16.04
# windows-latest, windows-2019, or windows-2016
# macOS-latest or macOS-10.14
runs-on: ubuntu-latest
Первый шаг, в name:
указываем название Step'а (не обязательно), а в uses:
какой Action хотим использовать, в данном случае клонировать репозиторий:
steps:
- name: Checkout repo
uses: actions/checkout@v1
На этом шаге мы не используем Action, а только набор своих команд где логинимся в Package Registry, собираем Docker-образ и пушим его в репозиторий образов. В блоке env:
задаем переменные окружения, одну из них берем из секретов:
- name: Build docker image and push it to the registry
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
DOCKER_IMAGE_ORIGIN: "docker.pkg.github.com/amet13/master-thesis/docker-latex"
run: |
# Pull submodules
git submodule init
git submodule update --remote
# Login to GitHub Packages and build Docker image
docker login docker.pkg.github.com -u amet13 -p ${GITHUB_TOKEN}
docker pull ${DOCKER_IMAGE_ORIGIN}:latest
docker build -t ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} .
# Generate PDF artifacts
docker run --rm -i
-v ${PWD}:/master-thesis:Z ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA}
bash -c "latexmk -xelatex -synctex=1 -jobname=master-thesis main.tex"
docker run --rm -i
-v ${PWD}:/master-thesis:Z ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA}
bash -c "cd presentation/ && latexmk -xelatex -synctex=1 -jobname=presentation main.tex"
# Publish Docker image to GitHub Packages (with latest tag)
docker tag ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA} ${DOCKER_IMAGE_ORIGIN}:latest
docker push ${DOCKER_IMAGE_ORIGIN}:${GITHUB_SHA}
docker push ${DOCKER_IMAGE_ORIGIN}:latest
Уверен, что в ближайшем будущем, уже появится Action который позволит автоматически тегировать и пушить образы вместо ручного прописывания команд Docker.
Добавление секрета содержащего GitHub-токен
Следующим шагом после сборки PDF-файлов необходимо создать релиз на GitHub и включить в этот релиз собранные артефакты. Для автоматического создания релиза используем сторонний [18] Action, в котором в блоке if:
можно указать условие запуска шага — только при создании тега:
- name: Create GitHub release with artifacts
uses: softprops/action-gh-release@v1
if: startsWith(github.ref, 'refs/tags/')
with:
files: |
master-thesis.pdf
presentation/presentation.pdf
name: "Build ${GITHUB_SHA}"
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
Несмотря на бета-статус, оба сервиса работают хорошо, уверен что допилят много вещей.
В некоторых моментах бывает неудобно, глобальных переменных нет, но это обходится костылями [19].
Мне понравился подход GitHub к отказу от HCL в пользу YAML. Также понравилась поддержка многих типов хостов, вполне щадящие лимиты (пока что), посмотрим как оно будет дальше. В целом, для несложных пайплайнов в публичных репозиториях на GitHub, такая связка подойдет очень хорошо.
Что думаете по поводу этих сервисов? Кто уже мигрировал, с какими трудностями столкнулся, если не собираетесь мигрировать, то почему?
Автор: Амет Умеров
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/github/330968
Ссылки в тексте:
[1] анонсировала: https://github.blog/2019-05-10-introducing-github-package-registry/
[2] анонсирована: https://github.blog/2019-08-08-github-actions-now-supports-ci-cd/
[3] многие другие: https://github.com/ripienaar/free-for-dev#ci--cd
[4] https://www.npmjs.com/: https://www.npmjs.com/
[5] https://hub.docker.com/: https://hub.docker.com/
[6] https://mvnrepository.com/: https://mvnrepository.com/
[7] https://www.nuget.org/: https://www.nuget.org/
[8] https://rubygems.org/: https://rubygems.org/
[9] пока еще: https://docs.gitlab.com/ee/user/packages/
[10] этих: https://github.com/features/actions
[11] страницах: https://github.com/features/package-registry
[12] этой: https://habr.com/en/post/424805/
[13] использовался: https://help.github.com/en/articles/migrating-github-actions-from-hcl-syntax-to-yaml-syntax
[14] awesome-actions: https://github.com/sdras/awesome-actions
[15] этой ссылке: https://help.github.com/en/articles/about-github-actions
[16] вот как: https://github.com/Amet13/master-thesis/blob/master/.github/workflows/actions.yml
[17] документации: https://help.github.com/en/articles/events-that-trigger-workflows
[18] сторонний: https://github.com/softprops/action-gh-release
[19] костылями: https://github.com/actions/starter-workflows/issues/68#issuecomment-524937002
[20] Источник: https://habr.com/ru/post/468345/?utm_source=habrahabr&utm_medium=rss&utm_campaign=468345
Нажмите здесь для печати.