Использование Действия GitHub и террафом — Этот пост будет руководить вами путем автоматизации жизненного цикла на средние среды запроса на pull на github.
В качестве Sidenote, недолговечные среды проходят многие имена, некоторые из них: Особенности, эфемерные среды, Обзор приложений , по средам спроса или временных сред.
Что такое короткие жилые условия?
Скажите, что вы в команде, которая работает на нескольких функциях одновременно. Необходимо поделиться работой с коллегами по проектированию, продукту, дизайну или QA для совместной работы, тестирования и просмотра. Вот где входят короткие жилые условия. Их жизненный цикл привязан к тому, что проекта.
Почему инфраструктура как код?
Хотя Terraform — мое оружие выбора (материал для совершенно нового blogpost), там много других инструментов (например, Pulumi или облачность 😬).
Факт вопроса — это — вы должны использовать IAC-инструменты для поддержания вашего здравомыслия, и это особенно верно, когда речь идет о управлении короткой средой.
Хотя в этом уроке я просто поддерживаю ведро S3 с террафом (для моего блога), те же концепции могут быть легко сопоставлены на любые ресурсы, которые обладают модулями Terraporm и Есть много Отказ
Предварительные условия
- Если у вас еще нет одного, создайте AWS аккаунт .
- Убедитесь, что вы добавляете свои учетные данные AWS
AWS_ACCESS_KEY_IDиAws_secret_access_key.к вашему Github Секреты репозитория Отказ
Действия GitHub для контроля жизненного цикла короткой среды.
Мы создадим 2 действия GitHub для управления нашей средой. Действия GitHub в основном Ямл Файлы, которые находятся в ..Github/Workflows/ Отказ
create_and_update_pr_env.yml— Когда запрос на тяга открывается или обновляется, мы хотим создавать/обновить нашу инфраструктуру.Террафом применяетсяОба этого, просто!destry_pr_env.yml— Когда запрос на тягу закрывается, нам нужно уничтожить окружающую среду, чтобы убедиться, что мы не теряем ресурсы (если мы этого не сделаем, нашему законопроекту AWS будет одним противным сюрпризом).
Определение инфраструктуры с террафом
Для этого учебника мы используем конфигурацию Terraform для этого блога. На момент написания вот как это выглядит:
provider "aws" {
region = "eu-west-2"
}
terraform {
backend "s3" {
// make sure you'll replace the above
// with a bucket name that fits
bucket = "jkrsp-tf-state"
region = "eu-west-2"
}
}
variable "env_prefix" { }
variable "is_temp_env" {
default = false
}
Разве это не было бы потрясающе, если у всех есть доступ к игровой площадке AWS, чтобы мы могли заставить людей вовлечь и потенциально взволнованы об этом 🎉
Как вы можете видеть, мы используем S3 Как наша террафора. Мы также определяем две переменные здесь env_prefix и is_temp_env. . Далее вы можете увидеть единственный ресурс, определенный для этого веб-сайта, который используется для проведения блога. env_prefix Переменная — это то, что мы используем для уточнения нашего ресурса, специфичного окружающей среды, поэтому мы можем избежать взаимодействия с именами.
IS_TEMP_ENV Есть ли дифференцировать между производством и временными средами. Для временных сред мы хотим установить Force_Destroy к правда Так что мы можем легко разрушить ресурс ведра через террафору. Если это установлено значение false, уничтожение ведра не удастся, если оно не будет пустым (что именно та санатоспособность, которую мы хотим для производства, но не для временной среды)
resource "aws_s3_bucket" "b" {
bucket = "${var.env_prefix}jkrsp.com"
acl = "public-read"
force_destroy = var.is_temp_env
policy = <Наконец, мы используем выходную переменную для подачи URL для нашего веб-сайта Bucket обратно к нашему действию GitHub, мы будем использовать это позже, чтобы отобразить ссылку в PR.
output "website" {
value = "http://${aws_s3_bucket.b.website_endpoint}"
}
Теперь, когда у нас есть базовая настройка террафора, давайте создадим наши действия …
Создание/обновление среды, когда PR открыт
Сначала давайте создадим действие YML-файл .Github/Workflows/create_and_update_pr_env.yml со следующим содержанием:
on:
pull_request:
types: [reopened, opened, synchronize, edited]
Этот блок определяет, какие события вызывают действие (есть более полный список Help.github.com ), в этом случае действие срабатывает, когда запрос на тяга был открыт, вновь открыто, синхронизировано или отредактировано.
Затем мы определим имя действия, изображение используется для действий и переменных среды:
name: Create PR Env
jobs:
create_or_update_pr_env:
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
BRANCH_NAME: ${{ github.head_ref }}
steps:
- ....
Действия GitHub, не отличающиеся от других инструментов CI, контейнерные — Ubuntu-Neighle Это наш выбор контейнеров для этого действия. Мы определили 3 переменных, AWS_ACCESS_KEY_ID и Aws_secret_access_key. Нам нужно для развертывания AWS через террафору. Террафом автоматически выберет их. Мы будем использовать Flathion_name ENV переменная как префикс для именования нашей временной среды.
Мы используем GitHub Действия Контекстные переменные здесь А именно — Секреты и гадость . Очевидно, что Секреты Переменная относится к секретам GitHub Reppo для ваших секретов AWS.
Далее давайте посмотрим на фактические шаги:
Сначала этапы сборки:
- name: Checkout uses: actions/checkout@v1 - name: Install Dependencies run: yarn - name: Checkout uses: actions/checkout@v1 - name: Install Dependencies run: yarn - name: Build Site run: yarn build
Это довольно стандартно, вы всегда хотите проверить свой репозиторий в качестве первого шага и установить ваши зависимости. В этом случае я строю сайт GATSBY, но это может быть просто любое другое приложение с шагом сборки.
Как только сайт будет построен, мы используем Terraporm для Orchestrate нашего развертывания. Hashicorps ‘ Действия GitHub для террафора Давайте легко добавим команду Terraform в качестве шага. Для этого действия мы будем использовать 4 команды: в этом , План , Применить и вывод Отказ
Трюк к достижению окружающей среды на запрос на тягу — иметь разные государственные файлы на окружающую среду, а также разные имена для ресурсов. Это где Flathion_name Переменная приходит в.
При инициализации террафора мы можем пройти ключ Для ведра S3, специфичного для этой среды, обратите внимание на args Параметр Чтобы увидеть, как мы достигаем этого, префиксируя наш ключ конфигурации с Flathion_name Переменная.
- name: 'Terraform Init'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'init'
args: ' env.BRANCH_NAME }}.jkrsp.com.tfstate"'
Далее мы используем план террафора и пройти в Flathion_name В качестве переменной для параметризации нашего конфиника Terraform. Обратите внимание, что я также пропускаю в переменной is_temp_env. — Это я делаю, потому что мы хотим, чтобы наш временный ресурс S3 быть удаленным. Как только мы использовали план, мы можем следить за Применить Отказ
- name: Terraform Plan
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'plan'
args: ' env.BRANCH_NAME }}." -out tf.plan'
- name: Terraform Apply
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'apply'
args: 'tf.plan'
Далее мы используем вывод Для извлечения веб-сайта URL нашего ведра S3. Мы вернемся к этому немного, когда мы публикуем URL-адрес временного сайта в качестве комментариев на нашем PR. Чтобы вывести одно значение, мы добавляем наше имя поля для args Отказ
- name: Terraform Output
id: terraform
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'output'
args: 'website'
Далее мы развертываем нашу сборку нашему ведру S3 через CLI. Опять же, мы используем наши Flathion_name ENV переменная для указания ведра или среды.
- name: sync to s3
run: aws s3 sync public s3://${{ env.BRANCH_NAME }}.jkrsp.com
В качестве последнего шага в наших действиях я использую небольшую программу JavaScript, чтобы добавить комментарий к PR, включая веб-сайт.
- run: node .github/actions/comment.js
env:
github_token: ${{ secrets.GITHUB_TOKEN }}
issue_number: ${{ github.event.pull_request.number }}
repo: 'jkrsp'
owner: ${{ github.repository_owner }}
website_link: ${{ steps.terraform.outputs.tf_actions_output }}
comment.js Файл находится в .Github/Действия/Комментарий.js И выглядит так:
Как вы можете видеть, пройдя в вышеперечисленные параметры, даст сценарию все переменные, которым он должен опубликовать комментарий.
const github = require('@actions/github');
async function run() {
const { issue_number, github_token, owner, repo, website_link } = process.env
const octokit = new github.GitHub(github_token);
try {
const { data } = await octokit.issues.createComment({
owner,
repo,
issue_number,
// We unfortunately need to use replace to get rid
// of extraneous double quotes
body: `[Review website here](${website_link.replace(/"/gs, '')})`
});
// for debugging, lets log the created comment
console.log('created comment', data);
} catch (err) {
throw err
}
}
run();
Вот и все. Добавив это к вашему репозиторию GitHub, должно создать среду и отобразить ссылку на веб-сайт ведра при открытии PR.
Но Как мы избавимся от окружающей среды, как только мы закончим рассмотрение, и PR закрыт/объединен?
Вот где находится наше второе действие:
Уничтожение короткой среды
Сначала давайте начнем с блока, который определяет, для каких событий нашего действия срабатывает
on:
pull_request:
types: [closed]
Красивая самоуверенность: это действие срабатывает, когда запрос на тягах был закрыт.
Далее, как раньше — мы называем действие и работу и определите нашу среду переменные:
name: Destroy PR Env
jobs:
destroy_pr_env:
runs-on: ubuntu-latest
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
BRANCH_NAME: ${{ github.head_ref }}
Теперь на шаги. Сначала нам нужно снова проверить наше репо снова:
- name: Checkout
uses: actions/checkout@v1
with:
ref: ${{ github.head_ref }}
Затем мы начинаем инициализацию террафора, снова мы используем Flathion_name Чтобы указать ведро для нашей среды
- name: 'Terraform Init'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'init'
args: ' env.BRANCH_NAME }}.jkrsp.com.tfstate"'
Далее мы разрушаем окружающую среду, проходя в две переменные — IS_TEMP_ENV и env_prefix.
- name: 'Terraform Destroy'
uses: hashicorp/terraform-github-actions@master
with:
tf_actions_version: 0.12.13
tf_actions_subcommand: 'destroy'
args: ' env.BRANCH_NAME }}."'
Наконец, мы снова комментируем на нашем PR, чтобы рассказать нашим коллегам, что окружающая среда определенно была разрушена. Обратите внимание, как мы проходим в секреты. Github_token. — Нам нужен этот токен для любого взаимодействия с API GitHub.
- name: Tell PR that we have destroyed the thing
uses: thollander/actions-comment-pull-request@master
with:
message: 'Temporary environment now destroyed'
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
Правильно, вот и все. Если вы хотите проверить рабочие процессы, описанные в этом сообщении в блоге, пожалуйста, посмотрите Репозиторий для этого блога Отказ
Оригинальная версия Этот блог пост здесь Отказ
Оригинал: «https://dev.to/jkrsp/environments-per-pull-request-with-github-actions-and-terraform-27hh»