Рубрики
Uncategorized

Go Package CI/CD с действиями GitHub

В предыдущем посте я написал о том, как я реализовал CI/CD -проверки и авторелиазы для Python Impl … Tagged with Go, GitHub, DevOps.

В Предыдущий пост Я написал о том, как я реализовал CI/CD-проверки и авторелиазы для реализации Python моей программы случайного Standup. Я также разработал несколько аналогичных рабочих процессов для реализации GO, поэтому я подумал, что также напишу пост, прокурованный на упаковке CI/CD, используя действия GitHub. Этот пост может показаться очень знакомым, если вы прочитали этот предыдущий пост — как я описал в моем Сравнение реализаций GO и Python этой программы , мои цели CI/CD одинаковы: PR -проверки и авторелиазы.

Как я уже говорил, я хотел убедиться, что:

  1. Каждое изменение, которое я делаю в своей программе, не нарушает существующую функциональность (непрерывную интеграцию), и
  2. Публикация нового выпуска в pkg.go.dev является автоматическим (непрерывная доставка/развертывание).

GitHub предоставляет функцию автоматизации рабочего процесса под названием Действия GitHub Анкет По сути, вы пишете свои конфигурации рабочего процесса в файле YAML в your-repo/.github/workflows/ , и они будут выполнены на определенных событиях репозитория.

Эта автоматизация относительно проста. Я хочу запустить следующие рабочие процессы на каждом коммите в ствол репозитория и по каждому запросу на привлечение в багажник:

  1. Тестовый синтаксис, запустив проверку с линией с Golangci-Lint — Это лучший линтер (на самом деле, я полагаю, это мета-линтер, поскольку он вызывает несколько отдельных линтера), доступных для GO, и шлепает ваше запястье, если вы скользите в некоторые известные антипаттерны.
  2. Функциональность тестирования путем запуска автоматизированных модульных тестов по всей программе. Это чрезвычайно простая программа, поэтому я определенно перевернул его факторинг в функции, чтобы облегчить тест на единицу.
  3. Стабильность тестирования сборки, пытаясь построить программу (но отбросить артефакт сборки) из -за многих комбинаций ОС и арх, поддерживаемых 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. .trategy.matrix директива . Я добавил только 1 переменную для каждой пары Goos и Goarch (усеченное для этого положения блога — в моем файле рабочего процесса, определенные в файле рабочего процесса ).

Внутренне шаги в некоторой степени похожи на:

  1. Действия GitHub анализируют директивы на работу и видят, что есть стратегия матрицы.
  2. Он раскрывает отдельный бегун для каждой комбинации матрицы и определяет переменные Matrix.goosarch как значения для этой комбинации.
  3. Он запускает шаги задания в каждом бегуне, который он развернул на шаге 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:

  1. Создайте выпуск GitHub, используя теги GIT и добавьте в него артефакты сборки ( Workflow ).
  2. Опубликуйте пакет в 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. Подтвердите автоматическую точку.
  3. Повторите шаги 1 и 2, пока я не буду готов освободить.
  4. Создайте тег на Главный Указывая на версию Bump Commit.
  5. Нажмите метку на GitHub.
  6. Ждать Создать выпуск беги, чтобы закончить.
  7. Перейти к https://github.com/jidicula/random-standup/releases и изменить объявления для только что созданный проект выпуска.
  8. Публикуйте релиз.
  9. Ждать Публиковать беги, чтобы закончить.
  10. Проверьте pkg.go.dev Для обновленной версии пакета.

Если у вас есть какие -либо вопросы или комментарии, напишите мне по адресу johanan+blog@forcepush.tech , найти меня в Твиттере @jidicubout , или опубликовать комментарий ниже.

Вы нашли этот пост полезным? Купи мне напиток или спонсируй меня Здесь !

Оригинал: «https://dev.to/jidicula/go-package-ci-cd-with-github-actions-350o»