GitHub объявил на прошлой неделе захватывающие новые функции для Действия GitHub , включая встроенную поддержку трубопроводов CI/CD.
Вы можете посмотреть полное объявление на YouTube Анкет
Это огромная веха для GitHub и одна из самых ожидаемых функций, поскольку платформы, такие как Gitlab и Bitbucket Уже есть решения для этого много раз.
Это еще один хороший пример огромной эволюции компании под руководством Microsoft и Nat Friedman.
Действия GitHub позволят создать полный трубопровод CI/CD, глубоко интегрированный с экосистемой GitHub, без необходимости использовать стороннюю услугу, такую как Travis CI или Circle CI, следуя тенденции для «All in One» решения, где Gitlab, вероятно, является Gitlab. лучший пример.
Эта функция в бета -версии для ограниченной группы пользователей и, как ожидается, будет выпущена для всех пользователей в ноябре этого года. Он будет бесплатным для проектов с открытым исходным кодом и будет иметь 2000 бесплатных минут сборки в месяц для частных репозиториев. (Пользователь, а не репо).
Вы можете Запросить ранний доступ Теперь. У меня это уже есть, и я пишу этот пост, чтобы показать, что вы можете сделать!
Что мы построим
Чтобы продемонстрировать новые функции действий GitHub, мы создадим приложение «Hello World» Golang с очень базовым трубопроводом, который после каждого запроса на вытягивание или нажатие к мастер -филиалам будет снимать наш код, запустить модульные тесты и генерировать отчет о покрытии кода с помощью Codecov Анкет
Затем, когда в репозитории создается новый «тег», он создаст новый выпуск GitHub, используя Горелезера инструмент.
Код проекта
Пример репозитория доступен Здесь , Не стесняйтесь раскошелиться или просто следить за ними.
Я не буду во многом подробностей о коде самого приложения. Это стандартное приложение «Hello World», которое печатает текст «Hello Github Daises» на стандартный вывод.
Вот код для файла main.go:
package main import ( "fmt" "github.com/brpaz/go-github-actions/hello" ) func main() { fmt.Println(hello.Greet()) }
А вот функция «приветствия»:
package hello // Greet Greets GitHub Actions func Greet() string { return "Hello GitHub Actions" }
И соответствующий модульный тест:
package hello import "testing" func TestGreetsGitHub(t *testing.T) { result := Greet() if result != "Hello GitHub Actions" { t.Errorf("Greet() = %s; want Hello GitHub actions", result) } }
Трубопровод
Действия GitHub основаны на концепции рабочих процессов. Рабочий процесс — это не что иное, как набор заданий и шагов, которые выполняются при выполнении какого -либо условия или события. ( Пример: толчок к репозиторию, запрос на притяжение, развертывание и т. Д.).
Вы можете иметь несколько рабочих процессов по проекту, каждый из которых отвечает на другой набор событий.
В нашем примере у нас будет два рабочего процесса. «Сборка» или «основной» рабочий процесс, который будет инициирован, когда появляется толчок главной ветви или когда создается пиар, и рабочий процесс «релиз», который будет работать, когда новый тег подталкивается к GitHub, который создаст новый Выпуск приложения.
Каждый рабочий процесс состоит из одной или нескольких рабочих мест. У нашего рабочего процесса «Build» будет 3 рабочих мест (Lint, Build and Test), а наш рабочий процесс «релиз» будет иметь одну работу «релиз».
Каждая работа сделана из шагов. Например, задание «модульный тест» будет иметь шаги для проверки исходного кода, запустить тесты и генерировать отчет о покрытии кода.
Самое приятное то, что вам не нужно изобретать колесо, и вы можете повторно использовать существующие действия, созданные самим GitHub или сообществом, и даже просто обычные изображения Docker в своих шагах.
Мы увидим примеры всех их в статье.
Рабочие процессы определены в файлах YAML, расположенных в .github/Workflows
каталог вашего репозитория.
Каждый файл в каталоге представляет собой другой рабочий процесс.
Вот как выглядит наш рабочий процесс сборки:
name: Build and Test on: push: branches: - master pull_request: jobs: lint: name: Lint runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Lint Go Code run: | export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 go get -u golang.org/x/lint/golint make lint test: name: Test runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Run Unit tests. run: make test-coverage - name: Upload Coverage report to CodeCov uses: codecov/codecov-action@v1.0.0 with: token: ${{secrets.CODECOV_TOKEN}} file: ./coverage.txt build: name: Build runs-on: ubuntu-latest needs: [lint, test] steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Build run: make build
Мы начнем с определения имени для рабочего процесса и когда он будет запущен. В нашем случае мы хотим, чтобы он работал, когда есть толчок к мастеру или запрос на тягу. Есть много событий, которые вы можете слушать. Вы можете прочитать больше об этом здесь
Рабочий процесс содержит 3 рабочих мест, «Lint», «Test» и «Build».
Давайте быстро рассмотрим работу: «Линт»:
lint: name: Lint runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Lint Go Code run: | export PATH=$PATH:$(go env GOPATH)/bin # temporary fix. See https://github.com/actions/setup-go/issues/14 go get -u golang.org/x/lint/golint make lint
Здесь мы указываем, что хотим, чтобы эта работа работала на машине Ubuntu. («Запустить» ключевое слово).
Действия имеют поддержку Linux, Mac и Windows, а также Docker. В будущем можно будет использовать ваши собственные машины также в качестве бегунов.
Затем мы определяем шаги, которые составляют нашу работу.
Первое, что установить Go. GitHub уже предоставляет для него действие, поэтому давайте используем его:
- name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12
Я думаю, что синтаксис довольно объяснительный. с
Ключевое слово позволяет нам указать аргументы, требуемые действием. В этом случае действие «Setup-GO» позволяет нам указать версию GO для использования.
Следующим шагом является проверка исходного кода. Опять же, мы будем использовать встроенное действие:
- name: Check out code uses: actions/checkout@v1
И, наконец, мы установим и запустим Golint
инструмент:
- name: Lint Go Code run: | export PATH=$PATH:$(go env GOPATH)/bin go get -u golang.org/x/lint/golint make lint
И это все. Остальные работы довольно похожи. Давайте посмотрим на «тестовую» работу.
test: name: Test runs-on: ubuntu-latest steps: - name: Set up Go uses: actions/setup-go@v1 with: go-version: 1.12 - name: Check out code uses: actions/checkout@v1 - name: Run Unit tests. run: make test-coverage - name: Upload Coverage report to CodeCov uses: codecov/codecov-action@v1.0.0 with: token: ${{secrets.CODECOV_TOKEN}} file: ./coverage.txt
Единственная новая вещь здесь-то, что мы используем стороннюю сторону действие , в этом случае, чтобы опубликовать отчет о покрытии тестирования в Codecov.
Использование точно так же, как встроенные действия. Здесь мы также используем новые «секреты» функциональности GitHub для хранения нашего «токена кодекова», необходимых для действия Codecov. Вы можете настроить свои секреты, получив доступ к настройкам проекта -> Вкладка «Секреты».
Вы можете создавать свои собственные действия на любом языке (просто добавьте DockerFile) или, если вам нравится TypeScript, вы можете использовать их Действия Toolkit Анкет
И с этим мы закончили наш первый рабочий процесс;)
Давайте создадим новую филиал и сделаем изменение кода, чтобы увидеть PR -процесс в действии.
git checkout -b greet-devto
Теперь измените нашу функцию «приветствия», чтобы «приветствовать», также Dev.to Пользователи:
func Greet() string { return "Hello GitHub Actions. Dev.to is awesome" }
Нам также необходимо соответствующим образом обновить соответствующий модульный тест:
func TestGreetsGitHub(t *testing.T) { result := Greet() if result != "ello GitHub Actions. Dev.to is awesome" { t.Errorf("Greet() = %s; want ello GitHub Actions. Dev.to is awesome", result) } }
Теперь нажмите ветку и создайте запрос на притяжение в главную ветку. Рабочий процесс «сборки» начнется немедленно.
Слияние будет заблокировано до тех пор, пока не пройдет рабочий процесс, и вы сможете увидеть статус непосредственно в запросе на вытяжение:
Помните, что мы добавили интеграцию Codecov? С одной строкой кода в рабочем процессе, мы получаем полную интеграцию с Codecov с проверкой статуса пиара и отчетом о покрытии в качестве PR.
Рабочий процесс выпуска
Пришло время создать свой «Рабочий процесс выпуска». Каждый рабочий процесс — это отдельный файл, поэтому мы создадим .github/Workflow/release.yml
со следующим содержимым:
name: Release on: create: tags: - v* jobs: release: name: Release on GitHub runs-on: ubuntu-latest steps: - name: Check out code uses: actions/checkout@v1 - name: Validates GO releaser config uses: docker://goreleaser/goreleaser:latest with: args: check - name: Create release on GitHub uses: docker://goreleaser/goreleaser:latest with: args: release env: GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
Мы указываем, что мы хотим запустить его только на недавно созданные теги, и мы определяем задание «выпуск».
Примечание: А на Похоже, что в состоянии есть некоторые проблемы. Например, когда я толкаю тег, он также запускает рабочий процесс сборки. Помните, что действия все еще бета, поэтому примите это во внимание.
Работа будет выходить на должность кода и использовать Горелезера Официальное изображение Docker, чтобы выполнить всю работу.
При использовании Docker можно определить «ARGS» и «точку входа» контейнера. В этом случае мы будем использовать входную точку по умолчанию, но определим другой аргумент на шагах «Validate» и «Create Release».
Мы также указываем Github_token
Переменная среда, требуемая Go Relaser для создания нашего выпуска на GitHub. Эта переменная будет передана в контейнер. Обратите внимание, что секреты. Github_token
Переменная вводится автоматически платформой действий, поэтому не нужно создавать ее сами.
Если вы создаете тег и подталкиваете к репозиторию:
git tag v0.1.0 git push --tags
Новый релиз будет создан на GitHub с артефактами приложения и изменением ChangeLog, созданного инструментом Go Releaser.
И у нас есть наш первый трубопровод, построенный с действиями GitHub. 😉
Очень основной пример, но я думаю, достаточно, чтобы дать вам хорошее представление о том, как это работает.
Вывод
Я очень впечатлен тем, как действия GitHub работают прямо сейчас и с нетерпением жду окончательного выпуска.
Я полагаю, что Gitlab все еще превосходит для более продвинутых вариантов использования, поскольку он поддерживает, например, ручные разрешения и параметризованные сборки, основные функции для предприятия, но мы не можем забыть, что действия Github все еще находятся в бета -версии, и я думаю, что эти функции появятся раньше или потом.
Действия также имеют несколько хороших функций, которых нет Gitlab, как строит матрица.
Особенности, которые в настоящее время имеют действия, должны быть более чем достаточно для 90% проектов, и я считаю, что будут огромными для открытых и личных проектов.
И со всеми построением сообщества GitHub все виды действий с открытым исходным кодом, мы можем ожидать удивительные вещи.
С тремя крупными провайдерами GIT хостинг, поддерживающими трубопроводы CI, с Дженкинсом по -прежнему очень популярны в Enterprise и некоторые новые более специализированные инструменты, такие как Codefresh Мне любопытно о будущем более традиционных платформ CI, таких как Travis или Circle CI.
Захватывающие времена в этом пространстве наверняка.
Спасибо за чтение, и, пожалуйста, если у вас была возможность попробовать бета -версию, дайте свой отзыв в разделе комментариев.
Справка
Оригинал: «https://dev.to/brpaz/building-a-basic-ci-cd-pipeline-for-a-golang-application-using-github-actions-icj»