В Предыдущий пост Я написал о том, как я реализовал CI/CD-проверки и авторелиазы для реализации Python моей программы случайного Standup. Я также разработал несколько аналогичных рабочих процессов для реализации GO, поэтому я подумал, что также напишу пост, прокурованный на упаковке CI/CD, используя действия GitHub. Этот пост может показаться очень знакомым, если вы прочитали этот предыдущий пост — как я описал в моем Сравнение реализаций GO и Python этой программы , мои цели CI/CD одинаковы: PR -проверки и авторелиазы.
Как я уже говорил, я хотел убедиться, что:
- Каждое изменение, которое я делаю в своей программе, не нарушает существующую функциональность (непрерывную интеграцию), и
- Публикация нового выпуска в pkg.go.dev является автоматическим (непрерывная доставка/развертывание).
GitHub предоставляет функцию автоматизации рабочего процесса под названием Действия GitHub Анкет По сути, вы пишете свои конфигурации рабочего процесса в файле YAML в your-repo/.github/workflows/
, и они будут выполнены на определенных событиях репозитория.
Эта автоматизация относительно проста. Я хочу запустить следующие рабочие процессы на каждом коммите в ствол репозитория и по каждому запросу на привлечение в багажник:
- Тестовый синтаксис, запустив проверку с линией с
Golangci-Lint
— Это лучший линтер (на самом деле, я полагаю, это мета-линтер, поскольку он вызывает несколько отдельных линтера), доступных для GO, и шлепает ваше запястье, если вы скользите в некоторые известные антипаттерны. - Функциональность тестирования путем запуска автоматизированных модульных тестов по всей программе. Это чрезвычайно простая программа, поэтому я определенно перевернул его факторинг в функции, чтобы облегчить тест на единицу.
- Стабильность тестирования сборки, пытаясь построить программу (но отбросить артефакт сборки) из -за многих комбинаций ОС и арх, поддерживаемых GO. Конечно, я не ожидаю, что кто-то запустит мой Randomizer, используя Plan 9 на чипе ARM, но это было скорее упражнение, чтобы узнать о возможностях кросс-компиляции GO.
Вот Полный рабочий процесс .
Каждый совершает багажник
Триггер для этого объявлен в верхней части файла рабочего процесса:
on: push: branches: [main] pull_request: branches: [main]
Синтаксис теста путем проверки форматирования
Во -первых, мы должны проверить репозиторий в действиях GitHub, используя Github’s собственная Оформление
действие . Затем мы должны настроить версию GO, используя GitHub’s Setup-go
действие Анкет Github Actions имеет 3 различных OSES для своих бегунов, каждый из которых имеет различные Go версии , но безопасно явно указать, какая версия GO будет использоваться.
Наконец, мы можем использовать Golangci-Lint’s предоставил GitHub Action Для линтирования — он работает Golangci-Lint
В клоне репо, клон бегуна рабочего процесса и выводит код ошибки, если какой -либо файл go в репо отказывает правила любых линтеров в Golangci-Lint
Анкет Обратите внимание, что Golangci-Lint
терпит неудачу, если Ast не может быть проанализировано (то есть, если есть какие -либо синтаксические ошибки), поэтому его также можно использовать для проверки правильности синтаксиса, что само по себе является хорошим прокси для проверки строк конфликтов слияния. Мы можем сбое с любыми проверками таким образом — нет необходимости раскручивать компиляцию и Перейти тест
Вызов, если есть синтаксические ошибки.
jobs: lint: name: Lint files runs-on: 'ubuntu-latest' steps: - uses: actions/checkout@v2.3.4 - uses: actions/setup-go@v2 with: go-version: '1.16.4' - name: golangci-lint uses: golangci/golangci-lint-action@v2.5.2 with: version: latest
Функциональность теста
Опять же, нам нужно проверить репо для этой работы и настроить версию GO:
name: Run tests runs-on: 'ubuntu-latest' needs: lint steps: - uses: actions/checkout@v2.3.4 - uses: actions/setup-go@v2 with: go-version: '1.16.4' - run: go test -v -cover
Обратите внимание, что в отличие от Python, для установки зависимостей не требуется настройка ( test
Проверьте стабильность сборки для различных OSE и архитектур
GO предоставляет Инструменты межкомпиляции Для широкого спектра операционных систем и архитектур. По сути, вы можете запустить команду, подобную
$ GOOS=plan9 GOARCH=arm go build
и компилятор GO построит двоичный файл, который будет работать на ОС, указанной в Goos
и арка в Гуарх
. Чтобы увидеть полный список вариантов Goos и Goarch, запустите Go Tool Dist List
.
Мы хотим проверить стабильность сборки в этом наборе, чтобы мы могли настроить матричную сборку для различных вариантов Goos и Goarch, используя действия GitHub:
build: runs-on: 'ubuntu-latest' needs: test strategy: matrix: goosarch: - 'aix/ppc64' - 'android/amd64' - 'android/arm64' - 'darwin/amd64' - 'darwin/arm64' - 'dragonfly/amd64' # ...
Это определено в jobs.
директива . Я добавил только 1 переменную для каждой пары Goos и Goarch (усеченное для этого положения блога — в моем файле рабочего процесса, определенные в файле рабочего процесса ).
Внутренне шаги в некоторой степени похожи на:
- Действия GitHub анализируют директивы на работу и видят, что есть стратегия матрицы.
- Он раскрывает отдельный бегун для каждой комбинации матрицы и определяет переменные
Matrix.goosarch
как значения для этой комбинации. - Он запускает шаги задания в каждом бегуне, который он развернул на шаге 2.
Вы можете увидеть пример того, как эта матрица выглядит в консоли действий GitHub Здесь (См. Все значения Goosarch на левой боковой панели). Эти варианты матрицы работают параллельно по умолчанию, поэтому время выполнения задания, определенная опцией самой медленной матрицы. Обратите внимание, что если ваш репозиторий является частным, вам будут заряжены минуты для каждой отдельной опции матрицы сборки, с некоторыми
Hefty Multipliers для MacOS и Windows Runners (1 Macos Minute — это 10 минут кредита, 1 минута Windows — 2 минута кредита действий по состоянию на май 2021 г.).
Мы выполняем нашу обычную проверку и настройку версий, а затем некоторые основные разбивки строк Bash на /
персонаж, чтобы мы могли установить Goos
и Goarch
Переменные среды отдельно от единой матричной опции:
- name: Get OS and arch info run: | GOOSARCH=${{matrix.goosarch}} GOOS=${GOOSARCH%/*} GOARCH=${GOOSARCH#*/} BINARY_NAME=${{github.repository}}-$GOOS-$GOARCH echo "BINARY_NAME=$BINARY_NAME" >> $GITHUB_ENV echo "GOOS=$GOOS" >> $GITHUB_ENV echo "GOARCH=$GOARCH" >> $GITHUB_ENV
Тогда мы просто бегаем Go’s иди строить
Подкоманда, которая создает бинар:
- name: Build run: | go build -o "$BINARY_NAME" -v
Auto-Merge
GitHub также позволяет автоматически объединяться запросов на привлечение, если правила защиты филиалов настроены и если запрос на вытягивание передает все необходимые проверки и проверки состояния. В настройках репо> Правила защиты филиалов> у меня есть правило, определенное для Главный
Требование всех рабочих мест в build.yml
Рабочий процесс для прохождения до того, как ветвь может быть объединена в Главный
Анкет
Есть 2 части для автоматизации выпуска GitHub:
- Создайте выпуск GitHub, используя теги GIT и добавьте в него артефакты сборки ( Workflow ).
- Опубликуйте пакет в pkg.go.dev ( Workflow ).
Создайте релиз GitHub
Мы настроили рабочий процесс, чтобы запустить толкание к тегу, начиная с V
:
on: push: # Sequence of patterns matched against refs/tags tags: - 'v*' # Push events to matching v*, i.e. v1.0, v20.15.10
Затем мы определяем наш Выпуск
Работа, работая на Ubuntu (самая дешевая и быстрое github incess invelode):
name: Create Release jobs: autorelease: name: Create Release runs-on: 'ubuntu-latest'
Я также настроил то же самое Матрица Goos и Goarch Build как в build.yml
— Когда мы создадим релиз Github, мы будем создавать и загрузить двоичные файлы в качестве активов релизов.
Наши первые 2 шага почти такие же, как и наш рабочий процесс сборки для толчков и PR, чтобы главный
: Мы проверяем репо и настроились. Наш шаг проверки немного отличается, хотя: мы предоставляем 0
к глубинный
Ввод, поэтому мы делаем глубокий клон со всеми коммитами, а не с мелким клоном только с самым последним коммитом.
steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0
Go Укажите версии модуля, используя теги управления версиями, поэтому нам не нужно анализировать какие -либо манифестные файлы, как мы делали с Python. Итак, мы можем сделать то же самое расщепление струйки, что и раньше, и построить двоичный файл:
- name: Get OS and arch info run: | GOOSARCH=${{matrix.goosarch}} GOOS=${GOOSARCH%/*} GOARCH=${GOOSARCH#*/} BINARY_NAME=${{github.repository}}-$GOOS-$GOARCH echo "BINARY_NAME=$BINARY_NAME" >> $GITHUB_ENV echo "GOOS=$GOOS" >> $GITHUB_ENV echo "GOARCH=$GOARCH" >> $GITHUB_ENV - name: Build run: | go build -o "$BINARY_NAME" -v
Следующим шагом является создание некоторых заметок о выпуске. Я держу шаблон выпуска в .github
папку и добавьте к нему несколько выводов Gitlog:
- name: Release Notes run: git log $(git describe HEAD~ --tags --abbrev=0)..HEAD --pretty='format:* %h %s%n * %an <%ae>' --no-merges >> ".github/RELEASE-TEMPLATE.md"
Эта грубая команда Gitlog проверяет все коммиты с момента последнего тега. Для каждого коммита он добавляет хэш коммита, субъект сообщения о коммите, имя автора и электронное письмо автору в шаблон выпуска.
Наконец, мы используем 3-й партийной релиз Для создания проекта релиза с заметками и артефактами, которые мы только что создали:
- name: Release with Notes uses: softprops/action-gh-release@v1 with: body_path: ".github/RELEASE-TEMPLATE.md" draft: true files: ${{env.BINARY_NAME}} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Это создает черновик, видимый в https://github.com/jidicula/random-standup/releases Анкет Я изменяю объявления о выпуске по мере необходимости и публикую релиз.
Публикация в pkg.go.dev
Последний шаг процесса выпуска состоит в том, чтобы уведомить pkg.go.dev, что для модуля доступна новая версия. Вот полный Рабочий процесс Анкет
На этот раз мы запускаем рабочий процесс, чтобы запустить опубликованный релиз (последний шаг предыдущего рабочего процесса — вручную публиковать проект релиза):
on: release: types: - published
Мы делаем такую же оформление, что и раньше. Тогда мы просто бежим Curl
к URL, где модуль извлечен из Получите
:
jobs: bump-index: runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v2.3.4 - name: Ping endpoint run: curl "https://proxy.golang.org/github.com/jidicula/random-standup/@v/$(git describe HEAD --tags --abbrev=0).info"
pkg.go.dev рекомендует это как Один из способов добавления нового модуля (или версии модуля) к своему индексу.
Так что в целом, работа над этим проектом будет включать:
- Сделайте пиар для моих изменений.
- Подтвердите автоматическую точку.
- Повторите шаги 1 и 2, пока я не буду готов освободить.
- Создайте тег на
Главный
Указывая на версию Bump Commit. - Нажмите метку на GitHub.
- Ждать Создать выпуск беги, чтобы закончить.
- Перейти к https://github.com/jidicula/random-standup/releases и изменить объявления для только что созданный проект выпуска.
- Публикуйте релиз.
- Ждать Публиковать беги, чтобы закончить.
- Проверьте pkg.go.dev Для обновленной версии пакета.
Если у вас есть какие -либо вопросы или комментарии, напишите мне по адресу johanan+blog@forcepush.tech , найти меня в Твиттере @jidicubout , или опубликовать комментарий ниже.
Вы нашли этот пост полезным? Купи мне напиток или спонсируй меня Здесь !
Оригинал: «https://dev.to/jidicula/go-package-ci-cd-with-github-actions-350o»