Рубрики
Uncategorized

Создание базового трубопровода CI/CD для приложения Golang с использованием действий GitHub

На прошлой неделе GitHub объявил о новых функциях для действий GitHub, включая встроенную поддержку трубопроводов CI/CD. В этом посте я покажу возможности новых действий GitHub для CI/CD, создав простой трубопровод для приложения Golang. Помечено GitHub, CICD, GitHubactions, DevOps.

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»