DevGang
Авторизоваться

GitHub action с Go

В этой статье вы узнаете, как создать собственное GitHub actions в Go. GitHub предоставляет нам два способа создания пользовательских действий GitHub: вы можете создавать действия с помощью JavaScript 💩 или использовать Docker 🐳. Я собираюсь использовать Docker + Go для создания пользовательского действия GitHub, при этом я укажу на некоторые важные вещи, на которые следует обратить внимание.

Написание кода Go

А пока давайте упростим код и просто напечатаем сообщение. Создайте файл main.go и добавьте в него следующий код.

package main

import "fmt"

func main() {
	fmt.Println("Hello World From GitHub Action")
}

Пишем Dockerfile

Нет необходимости делать что-то конкретное для Dockerfile, все, что вам нужно, это обычный образ докера, который запускает код go. Создайте новый Dockerfile и добавьте в него следующий код.

FROM golang:1.18.3-alpine3.16

WORKDIR /app

COPY ./ ./

RUN go build -o /bin/app main.go

ENTRYPOINT ["app"]

Вы могли заметить, что (RUN go build -o /bin/app main.go) при построении кода go исполняемый файл сохраняется внутри каталога bin. Это не обязательно, вы можете хранить исполняемый файл где угодно.

Пишем action.yml

action.yml это файл, который сообщает GitHub: «Эй, GitHub! Этот репозиторий содержит действие GitHub». Вы можете определить множество метаданных, связанных с действием в этом файле. Я настоятельно рекомендую прочитать эту документацию, если вы разрабатываете GitHub Action 👉 Синтаксис метаданных для GitHub Actions.

Создайте новый файл action.yml и добавьте в него следующий код.

name: "github-action-go"
description: "An example of building github actions with Go"
runs:
  using: docker
  image: Dockerfile

В разделе runs вы можете указать GitHub для запуска этого действия с помощью Docker.

Публикация действия

Теперь все готово, создайте новый репозиторий и загрузите код. Прежде чем вы сможете использовать действие, вам необходимо опубликовать его, создав релиз на GitHub. В репозитории нажмите «Создать новый релиз».

Вам нужно будет создать тег перед выпуском, создать тег с именем v1 (вы можете назвать его как хотите, но настоятельно рекомендуется сохранять правильные версии).

Дайте релизу название и нажмите «Опубликовать релиз».

Использование действия

После создания релиза вы можете начать использовать действие в любых репозиториях github, пример файла рабочего процесса будет выглядеть примерно так:

jobs:
  github-action-go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: gurleensethi/github-action-go@v1 # 👈 using custom action

Вы также можете использовать свое пользовательское действие в том же репозитории, что и само действие.

jobs:
  github-action-go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: ./ # 👈 using action from the repository itself.

Как GitHub запускает Docker

Поскольку действие должно выполняться в качестве контейнера докеров, GitHub использует команду docker run для его запуска, она предоставляет набор аргументов. Осмелитесь увидеть гигантскую команду.

docker run --name e225889822a53557c5068f1d4400b154c_a1b5de --label 72882e 
--workdir /github/workspace --rm -e HOME -e GITHUB_JOB -e GITHUB_REF -e GITHUB_SHA 
-e GITHUB_REPOSITORY -e GITHUB_REPOSITORY_OWNER -e GITHUB_RUN_ID 
-e GITHUB_RUN_NUMBER -e GITHUB_RETENTION_DAYS -e GITHUB_RUN_ATTEMPT 
-e GITHUB_ACTOR -e GITHUB_WORKFLOW -e GITHUB_HEAD_REF -e GITHUB_BASE_REF 
-e GITHUB_EVENT_NAME -e GITHUB_SERVER_URL -e GITHUB_API_URL -e GITHUB_GRAPHQL_URL 
-e GITHUB_REF_NAME -e GITHUB_REF_PROTECTED -e GITHUB_REF_TYPE -e GITHUB_WORKSPACE 
-e GITHUB_ACTION -e GITHUB_EVENT_PATH -e GITHUB_ACTION_REPOSITORY 
-e GITHUB_ACTION_REF -e GITHUB_PATH -e GITHUB_ENV -e GITHUB_STEP_SUMMARY 
-e RUNNER_OS -e RUNNER_ARCH -e RUNNER_NAME -e RUNNER_TOOL_CACHE -e RUNNER_TEMP 
-e RUNNER_WORKSPACE -e ACTIONS_RUNTIME_URL -e ACTIONS_RUNTIME_TOKEN 
-e ACTIONS_CACHE_URL -e GITHUB_ACTIONS=true -e CI=true 
-v "/var/run/docker.sock":"/var/run/docker.sock" 
-v "/home/runner/work/_temp/_github_home":"/github/home" 
-v "/home/runner/work/_temp/_github_workflow":"/github/workflow" 
-v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" 
-v "/home/runner/work/github-action-go/github-action-go":"/github/workspace" 72882e:225889822a53557c5068f1d4400b154c

Здесь есть куча хороших вещей, он устанавливает рабочий каталог --workdir /github/workspace, передает кучу переменных среды, используя флаг -e, и прикрепляет много томов. Внимательно прочтите эту команду, она может помочь вам в том, что вы разрабатываете.

Ввод действия и аргументы контейнера

Действия GitHub позволяют указать входные данные, которые пользователь действия может передать при определении файла рабочего процесса.

Код этого раздела доступен в ветке репозитория input_args.

Давайте реорганизуем код, чтобы он принимал сообщение от пользователя, а не закодировал его. Обновите код main.go, чтобы распечатать все аргументы, переданные программе.

package main

import (
	"fmt"
	"strings"
	"os"
)

func main() {
	fmt.Println(strings.Join(os.Args[1:], " "))
}

Если вы запустите go run main.go hello world, вы получите результат hello world.

Обновите action.yml, чтобы принимать ввод от пользователя, назовем его message.

name: "github-action-go"
description: "An example of building github actions with Go"

inputs:
  message:
    required: true

runs:
  using: docker
  image: Dockerfile

Как видите, я добавил новый раздел inputs, в котором я определил ввод с именем message.

Этот ввод необходимо передать в качестве аргументов программе go, вы можете сделать это, используя параметр args в разделе run. Любые указанные вами аргументы args будут переданы команде docker run при выполнении действия.

name: "github-action-go"
description: "An example of building github actions with Go"

inputs:
  message:
    required: true
    
runs:
  using: docker
  image: Dockerfile
  args:
    - ${{ inputs.message }}

Обновите файл рабочего потока, чтобы использовать message.

jobs:
  github-action-go:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: gurleensethi/github-action-go@v1
      	with:
        	message: Hello World from Github Action Input

Запустив рабочий процесс, вы увидите указанное сообщение 🎉, а также увидите, что команде docker run передаются аргументы.

Вы можете сделать гораздо больше с GitHub Actions и еще больше с прекрасным языком Go, идите и создавайте какие-нибудь действия 😉.

#Golang #GitHub
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

Vladimir Shaitan - Видео блог о frontend разработке и не только

Посмотреть