Эта статья была первоначально размещена на Circleci блог .
Выпуски — это функция GitHub, которая позволяет вам представлять значительные снимки вашего кода, отмеченную тегом GIT, в хорошем пользовательском интерфейсе GitHub. Если вы в настоящее время не используете релизы, я хочу показать вам, почему вы можете захотеть и как их реализовать автоматически.
С помощью выпусков вы получаете то, что предоставляют теги-номер версии и описание-но вы также получаете более длинный раздел для выпуска заметок и место для хранения и отображения артефактов. Это означает, что двойные файлы программного обеспечения, .deb, .rpm и Appimage будут размещены Github для каждого выпуска, предоставляя пользователям удобное место для установки вашего программного обеспечения.
В этом посте я покажу вам, как создавать релизы в Circleci. Для более общего обзора, см. Документ GitHub по созданию выпусков Анкет
По своей сути, GitHub Relases — это просто функция GitHub, сложенную поверх метров GIT. Давайте разберем это:
Git теги
Теги GIT дают вам номер версии, чтобы отметить конкретный коммит GIT, а также краткое описание. Хотите верьте, хотите нет, просто нажатие тега GIT в GitHub создаст новый релиз на вкладке «Выпуск» вашего проекта на GitHub. Это выпуск Barebones, который включает только информацию о теге.
Выпуски
Выпуски добавляют к тегам GIT, предоставляя более длинное «богатое» описание, возможность отмечать тег как обычный выпуск или предварительный выпуск, и, что наиболее важно, способность загружать артефакты, такие как двоичные файлы для этого выпуска. Загрузка этих артефактов из Circleci — это то, через что мы собираемся пройти здесь.
Инструменты
Есть несколько способов опубликовать артефакты из сборки Circleci до выпуска GitHub:
- вручную с
скручивание
и GitHub API - используя Github Release
- используя GitHub (Вилка релиза Github)
- и используя GHR , что мы будем использовать в нашем примере
Используя GHR
GHR
Команда Полная информация может быть найдено на GitHub , однако, нам действительно нужно изучить только одну подкоманду:
ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/
Эта команда загружает конкретные артефакты, как правило, двоичные файлы, в наш релиз GitHub на GitHub. Давайте разберем это:
ghr -t $ {github_token}
— Здесь мы запускаем команду и передаем ее токен GitHub для аутентификации. Это GitHub Personal Access Токен и не токен/ключ OAuth.
Специально созданный через вашу личную учетную запись GitHub, вы захотите защитить этот токен и загрузить его в среду Circleci через Частная переменная среды Анкет
-u $ {circle_project_username} -r $ {circle_project_reponame}
— Здесь мы передаем имя пользователя/орг и имя репозитория. Оба значения передаются через встроенные переменные среды Circleci. Не требуется дополнительная работа.-c $ {circle_sha1}
— Здесь мы предоставляем хэш Commit Commit (доступный в Circleci как$ circle_sha1
) длягриль
. Это говорит о том, что совершать и, таким образом, теги, релиз для.-Полета
— Это удаляет тег GIT и выпускает, если он уже существует.$ {Версия}
— Мы устанавливаем версию тега/выпуска GIT через$ Версия
переменная среды. Это может быть любая переменная, которую вы хотите, или строка. Как правило, это то же самое, что и версия вашего выпуска программного обеспечения../artifacts/
— Затем мы установили путь, чтобы найти артефакты. В этом случае все в каталоге под названиемАртефакты
Внутри текущего каталога.
Plain Circleci 2.0 пример
Мы прошли через как использовать GHR
Чтобы создать релиз GitHub, но давайте посмотрим, как он может заглянуть внутрь файла конфигурации Circleci 2.0:
publish-github-release: docker: - image: circleci/golang:1.8 steps: - attach_workspace: at: ./artifacts - run: name: "Publish Release on GitHub" command: | go get github.com/tcnksm/ghr VERSION=$(my-binary --version) ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/
CI строит пример Circleci 2.0
Это работа Circleci под названием Publish-github-Release
который использует Circleci Go Commerience Image Анкет Вот срыв:
- Используя Рабочие пространства , мы прижимаем двоичные файлы для нашего проекта с предыдущей работы (не рассматриваемой в этом посте).
- Эта работа тянет и компилирует
GHR
черезПолучите
(Посколькуghr
написан в Go). - Это населяет
$ Версия
с выводоммоя бинарная-версия
, наше пример приложения для этого поста. - Затем мы используем
GHR
командование загружать двоичные файлы вАртефакты
каталог на GitHub.
Мы можем сбрить несколько секунд с работы выше, используя GHR
Docker Image от CI строит . Это легкое изображение Docker, которое уже имеет GHR
установлены. Вот как будет выглядеть новый пример конфигурации:
publish-github-release: docker: - image: cibuilds/github:0.10 steps: - attach_workspace: at: ./artifacts - run: name: "Publish Release on GitHub" command: | VERSION=$(my-binary --version) ghr -t ${GITHUB_TOKEN} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -c ${CIRCLE_SHA1} -delete ${VERSION} ./artifacts/
Пример рабочего процесса
Вот пример того, как одно из вариаций вышеупомянутого задания может быть реализовано в рамках Рабочий процесс Чтобы опубликовать Tagged Commits для выпусков GitHub:
workflows: version: 2 main: jobs: - build: filters: tags: only: /^\d+\.\d+\.\d+$/ - publish-github-release: requires: - build filters: branches: ignore: /.*/ tags: only: /^\d+\.\d+\.\d+$/
В этом примере мы запустили Circleci Publish-github-Release
работа, когда нажимается тег GIT. Как именно вы выбираете, когда опубликовать релиз GitHub, зависит от вас, но здесь мы сделаем это с помощью Semver-подобного тега GIT. Мы говорим Semver-Like, потому что режима тега, которую мы используем /^\d+\.\d+\.\d+$/
соответствует тегам, таким как 1.2.3
но не учитывает все правила Semver (Семантическое управление версией).
Ради полноты, вот как будет выглядеть полная регуляция для Semver в соответствии с rgxdb.com :
/(?<=^[Vv]|^)(?:(?(?:0|[1-9](?:(?:0|[1-9])+)*))[.](? (?:0|[1-9](?:(?:0|[1-9])+)*))[.](? (?:0|[1-9](?:(?:0|[1-9])+)*))(?:-(? (?:(?:(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?|(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?)|(?:0|[1-9](?:(?:0|[1-9])+)*))(?:[.](?:(?:(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?|(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?)|(?:0|[1-9](?:(?:0|[1-9])+)*)))*))?(?:[+](?(?:(?:(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?|(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?)|(?:(?:0|[1-9])+))(?:[.](?:(?:(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?|(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)(?:[A-Za-z]|-)(?:(?:(?:0|[1-9])|(?:[A-Za-z]|-))+)?)|(?:(?:0|[1-9])+)))*))?)$/
Оригинал: "https://dev.to/circleci/automate-github-releases-with-circleci-lke"