Рубрики
Uncategorized

Разверните API без сердца с действиями GitHub

Введение в Действия GitHub, почему я думаю, что это важно, и быстрый учебник, который разворачивает беспроводной API прямо из вашего GitHub. Теги с GitHub, Go, Serverless, CICD.

Возглавляет, прежде чем читать дальше: Этот пост устарел! Действия GitHub переключились на YAML в качестве языка конфигурации и изменили некоторые семантики. Не стесняйтесь продолжать читать, если вы заинтересованы в том, почему я думаю, что действия GitHub является важным шагом в социальной кодировании или взгляда на то, как действия GitHub работают во время его бета-версии. Счастливое кодирование!

Вы слышали, что говорится, что «релизы должны быть скучными»? Это неофициальный девиз непрерывной интеграции и непрерывного развертывания (Ci/Cd). Действия GitHub, объявленные на конференции по вселенной конференции Github 2018 года, стремится принести скучные релизы до все Пользователи в экосистеме GitHub. Сегодня мы начнем с покрытия, почему Действия GitHub являются важным развитием в социальной кодировке, а затем мы посмотрим на основные концепции, которые действия используют для создания системы автоматизации. Наконец, мы построим и развертываем API без сервера, используя AWS, Servelless Framework и действия GitHub. Обратите внимание, что для завершения учебного пособия API необходимы следующие предпосылки:

Социальное кодирование

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

Автоматизация и Ci/Cd, как правило, являются тяжелыми. Это приводит к повторению кодекса и времени, потраченной на работу, которая на самом деле не отличается вашей заявкой. Действия позволяют оптимизировать доступ к инструментам автоматизации и Способность легко поделиться этими инструментами. Действия, основанные на доке, что обеспечивает портативность и облегчение обмена. GitHub использует это, позволяя строителям включать действия из любого публичного репозитория GitHUB или любого образа докера на DockerHub. Конечно, если конкретное действие не существует, Builder может создавать пользовательские действия и необязательно обмениваться их в публичном хранилище. Сочетание интегрированных инструментов автоматизации и простота обмена — это то, что делает действия отличной стратегической возможностью для GitHub и Boon для строителей в экосистеме GitHub.

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

Основные понятия

Визуальный редактор или язык конфигурации

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

Действия

Действия являются «Код, который работает в Docker Continers». Хотя действия поделяют свое имя с более широкой услугой, они являются отдельными единицами работы, которые необходимо выполнить. Каждое действие имеет уникальное имя и один требуемый атрибут, а именно использует Отказ Действие определяется с использованием Действие блокировать:

action "Unique Name" {
  uses = "./actions/helloworld"
}

использует Атрибут может ссылаться на действие в одном и том же репо, публичных действиях в репозитории GitHUB или общедоступный контейнер докеров, размещенный на Dockerhub. Не волнуйтесь слишком много, если вы незнакомы с докером. Мы сделаем краткий обзор команд, используемых позже. Это действие ссылается на следующий контейнер докера:

# actions/helloworld/Dockerfile
FROM golang:1.11.4-stretch

LABEL "com.github.actions.name"="Echo Hello World"
LABEL "com.github.actions.description"="Say Hello to the World!"

CMD echo "Hello World!"

Вы можете предоставить другие дополнительные атрибуты в зависимости от ваших потребностей. Несколько общих атрибутов, включая нужно , Секреты и args будет обсуждаться позже. Для полного списка атрибутов см. Официальная документация Отказ

События

События являются «событиями» в вашем репозитории GitHUB, включая pull_request_review. , толчок и проблемы Отказ События вызывают разные рабочие процессы и имеют разные переменные среды в зависимости от типа события. Это важно, потому что коммит о том, что действие проходит воздействие, зависит от типа события, вызывающего действие.

Например, Выпуск Событие разрешает Github_sha (Commit Hash) по метку, который вызвал выпуск. Итак, действие, вызванное Выпуск Событие использует последний фиксатор SHA филиала.

Но, толчок Событие Github_sha «Concept Contace, если только не удаляет ветку (когда это ветвь по умолчанию)». Это означает, что он захватывает фиксацию SHA непосредственно из запуск события.

Вы можете прочитать больше о доступных событиях и резолюциях SHA в Официальная документация Отказ

Рабочие процессы

Рабочие процессы состоят из действий и запускаются событиями. Поместите другой путь, рабочие процессы объединяют события и действия. Рабочие процессы определяются с использованием рабочий процесс блокировать. Каждый рабочий процесс Блок нуждается в уникальном имени и имеет два обязательных атрибута: на и решает Отказ В на Атрибут Вы определяете тип события, который вызывает рабочий процесс. В решает Атрибут Вы описываете действия, которые будут «разрешены» рабочим процессом. рабочий процесс Определение блока читается как предложение на английском языке: «Рабочий процесс с именем развертывания постановки, на событии выпуска, разрешит сборку, тест и развертывание».

workflow "Deploy Staging" {
  on = "release"
  resolves = ["build", "test", "deploy"]
}

решает Атрибут заслуживает немного больше внимания, которое мы будем охватывать дальше.

Зависимость

Зависимость между действиями может быть выражена с использованием нужно атрибут. В приведенном ниже примере «развертывание» зависит от успешного завершения «сборки», «теста» и «LINT». Вы заметите, что мы включаем только действие «Развертывание» в решает Атрибут блока рабочего процесса:

workflow "Deploy to Staging" {
  on = "release"
  resolves = "Deploy"
}

action "Build" {
  uses = "docker://image1"
}

action "Test" {
  uses = "docker://image2"
}

action "Lint" {
  uses = "docker://image3"
}

action "Deploy" {
  needs = ["Build", "Test", "Lint"]
  uses = "docker://image4"
}

Это связано с тем, что действие «развертывание» зависит от завершения «строить», «тестирование» и действий «Lint». Мы можем выразить сложные зависимости с использованием этого стиля.

Параллелизм

Мое первоначальное предположение было то, что в рабочем процессе выше «сборки», «тест» и «Lint» будет работать параллельно, учитывая, что они являются независимыми действиями. На практике это не так. Я попробовал следующий формат рабочего процесса, который я также ожидал, что будет работать параллельно:

workflow "Deploy to Staging" {
  on = "release"
  resolves = ["Build", "Test"]
}

action "Build" {
  uses = "docker://image1"
}

action "Test" {
  uses = "docker://image2"
}

Еще раз, это было не так, и вышесказанное не проводилось параллельно. Согласно документации «[W], курица более одного действия [в Resolvates атрибут] действия выполняются параллельно. » Это может быть просто ограничение общественной бета-бета, и я представляю, что действия позволят параллелизму в будущем.

Рабочее пространство

Рабочая область является каталогом, в котором ваши действия будут выполнять свою работу. Каталог Workspace содержит копию репозитория, установленного на Github_sha от мероприятия, вызванного рабочим процессом. Действие может изменить этот каталог, получить доступ к содержимому, создавать двоичные файлы и т. Д. Мы будем использовать рабочее пространство для хранения скомпилированного двоичного двоида, генерируемого нашим действием.

Управление секретами

Действия Разрешить доступ к секретам через Секреты атрибут. Вы должны явно перечислите, какие секреты действуют имеют разрешение на доступ. В следующем примере действие «Развертывание Hello World» дается разрешение на доступ к AWS_ACCESS_KEY_ID и Aws_secret_access_key Отказ

action "Deploy Hello World" {
    needs = ["Build Hello World", "Lint Hello World"]
    uses = "serverless/github-action@master"
    secrets =  ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]
    args = "deploy"
}

Секреты добавляются через панель настроек репозитория и подвержены переменным среды к действию.

ПРИМЕЧАНИЕ. Действия GitHub рекомендуют, чтобы во время общественной бета-бета не хранят никаких производственных секретов в это время. Для получения дополнительной информации прочитайте Официальная документация.

Разверните API без сердца с помощью действий GitHub

Далее мы построим беспроводной API. Рабочий процесс создаст, Lint и развертывание на каждом толкать к магистратуру в нашем репозитории.

Секреты

Хватает AWS_ACCESS_KEY_ID и Aws_secret_access_key от IAM пользователь, который вы создали. На странице «Настройки» в вашем репозитории нажмите «Секреты» и добавьте AWS_ACCESS_KEY_ID и Aws_secret_access_key. . Примечание. Во время общественной бета не хранит никаких производственных секретов в репозитории.

API-код без сервера

Смертная структура обрабатывает инфраструктуру и предоставление серверу сервера. Инфраструктура определяется в Serverless.yml Файл, так вот где мы посмотрим сначала. Serverless использует минимальный язык конфигурации для связывания событий с желаемыми вычислениями. Здесь мы создаем HTTP API Получить/привет и обрабатывать событие API с бинарным двоичным в Bin/Hello Отказ

# serverless.yml

...

functions:
  hello:
    handler: bin/hello
    events:
      - http:
          path: hello
          method: get

Далее мы просмотрим исходный код для Bin/Hello бинарный. Этот код использует шаблон GO по умолчанию Serverless Framework с небольшим модификацией для сообщение тело:

// hello/main.go

...

type Response events.APIGatewayProxyResponse

func Handler(ctx context.Context) (Response, error) {
    var buf bytes.Buffer

    body, err := json.Marshal(map[string]interface{}{
        "message": "Hello From Two Bulls!",
    })
    if err != nil {
        return Response{StatusCode: 404}, err
    }
    json.HTMLEscape(&buf, body)

    resp := Response{
        StatusCode:      200,
        IsBase64Encoded: false,
        Body:            buf.String(),
        Headers: map[string]string{
            "Content-Type": "application/json",
        },
    }

    return resp, nil
}

...

Эта функция возвращает AppoutwayProxyresponse который определяет код состояния HTTP, заголовки и тело ответа.

Makefile Определяет шаги построения, которые будут работать действие. Две вещи, которые стоит отметить: это использует модульную систему Go 1.11, и мы устанавливаем Goos Переменная среды для Linux Поскольку мы будем запустить эту функцию в AWS Lambda.

build:
    export GO111MODULE=on
    env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go

Github Действия Код

Далее мы посмотрим на рабочие процессы Действия GitHub и определения действий. Здесь мы определили рабочий процесс, который срабатывает на каждом толчок Событие и разрешает действие «Развертывание Hello World». Действие «Развертывать Hello World» использует Внешнее действие, которое поддерживается организацией GitHub без сервеса. Чтобы ссылаться на это внешнее действие, мы используем имя организации, имя REPO и Compart-ish, которое мы хотели бы пригласить версию к. Кроме того, мы явно предоставляем этот активный доступ к AWS_ACCESS_KEY_ID и Aws_secret_access_key Секреты, которые мы создали ранее. args Атрибут — это аргумент, который мы проходим к действию — поскольку это действие обертывает Where Serverless Framework, мы хотим пройти Развертывание Аргумент, но любая команда без сервеса может быть запущена здесь. Действие «Развертывать Hello World» нужно Действия «Build Hello World» и «Lint Hello World», но они определяются в нашем репозитории и, таким образом, могут ссылаться с использованием относительного синтаксиса пути. Они будут завершены до «Развертывание Hello World Action».

workflow "New workflow" {
    on = "push"
    resolves = "Deploy Hello World"
}

action "Build Hello World" {
    uses = "./actions/build"
}

action "Lint Hello World" {
    uses = "./actions/lint"
}

action "Deploy Hello World" {
    needs = ["Build Hello World", "Lint Hello World"]
    uses = "serverless/github-action@master"
    secrets =  ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"]
    args = "deploy"
}

Докер

Действия, определенные в нашем репозитории справочных документов докера. Мы сделаем быстрый обзор синтаксиса Docker, используемый здесь, и что это значит.

От Определяет базовое изображение, которое мы будем использовать для нашего контейнера. Мы используем Голанг: 1.11.4-растяжка который поставляется с зависимостями, необходимыми для строительства. Кроме того, он поставляется с идти Инструмент установлен.

Этикетка Обеспечивает метаданные о нашем контейнере. Мы можем включить имя, описание и другие метаданные, включая то, как действие должно появиться в Visual Editor.

CMD Команда, которую мы хотели бы запустить, когда начинается контейнер Docker. Здесь мы проведем большую часть нашего времени, написав команды, которые мы хотели бы наш контейнер для выполнения.

С этим быстром введением мы можем посмотреть на Dockerfile S в нашем репозитории. Контейнер «Build Hello World» работает сделать Отказ Сделать запускает шаги в Makefile обсуждается выше. Контейнер «Lint Hello World» работает Go Vet Против исходного кода GO в нашем репозитории.

# actions/build/Dockerfile

FROM golang:1.11.4-stretch

LABEL "com.github.actions.name"="Build Hello World"
LABEL "com.github.actions.description"="Run make to build the Golang binary."

CMD make
# action/lint/Dockerfile

FROM golang:1.11.4-stretch

LABEL "com.github.actions.name"="Lint Hello World"
LABEL "com.github.actions.description"="Lint the hello world application using go vet."

CMD cd hello && go vet

Развертывать!

Со всем настроенным, мы готовы развернуть API. Вы можете вносить изменения в Readme.md , совершить и нажать. Откройте панель действий в репозитории, и вы можете посмотреть в качестве очереди действий и начать работу. Вы можете открыть журналы и просмотреть также вывод журнала. Когда действие успешно завершится, вы увидите зеленую галочку на каждом из действий.

Далее просмотрите журналы действия «Развертывание Hello World».

Serverless: Stack update finished...
Service Information
service: go-github-actions
stage: dev
region: us-east-1
stack: go-github-actions-dev
api keys:
  None
endpoints:
  GET - https://xxrefpqkp2.execute-api.us-east-1.amazonaws.com/dev/hello
functions:
  hello: go-github-actions-dev-hello
layers:
  None
Serverless: Removing old service artifacts from S3...

### SUCCEEDED Deploy Hello World 23:54:39Z (1m23.488s)

URL для вашего API перечислена в конечных точках. Откройте URL, и вы увидите следующее:

{"message":"Hello From Two Bulls!"}

Вуаля! API без сердца, развернутой действиями GitHub.

Ограничения

Есть несколько ограничений, которые нужно знать при использовании действий GitHub. Во-первых, он все еще находится в ограниченной общественной бета-версии, поэтому можно ожидать изменения в API, функций и пределов.

Ограничения рабочего процесса

Кроме того, есть ограничения для параллелизма, вычисления и общего времени. Убедитесь, что эти ограничения соответствуют вашему текущему корпусу, прежде чем принимать решение использовать действия GitHub.

  • Беги за 58 минут (очередь и время выполнения)
  • Каждый рабочий процесс может работать до 100 действий
  • Два рабочих процессы одновременно на репозиторий

Вы можете прочитать полный список в Официальная документация.

Ограничения безопасности

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

  • Есть ли способ знать, что действие скомпрометируется с точки зрения безопасности?
  • Сколько доступа требуется внешнее действие?
  • Что касается внешнего действия с вашими секретами, если вы предоставляете доступ?

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

Следующие шаги

Сегодня вы узнали о действиях GitHub и развернули беспроводной API. Действия GitHub чрезвычайно гибко, и это просто царапает поверхность того, что возможно. Из-за разнообразия доступных событий акция может интегрироваться с проблемами GitHub и с внешними инструментами связи, такими как провисание. Вы можете создать автоматизацию для многих общих задач. Но самое главное, вы можете поделиться этой автоматизацией и использованием автоматизации, которую другие уже построили.

Оригинал: «https://dev.to/alexbielen/deploy-a-serverless-api-with-github-actions-3k6o»