Как многие из вас уже узнают, я недавно начал захватывающую новую роль в качестве руководителя технологий в FirstPort ранее, ранее были в отличной консультации под названием DevOpsGroup Отказ
Ключевой частью моей роли является предоставление видения первогорта «Люди первой» технологии. Для этого необходимо, чтобы я выбирал правильную технологию, чтобы подкрепить доставку услуг, которые помогают облегчить жизнь клиентов.
Сегодня я хочу поговорить о моем выборе Github Enterprise
GitHub — лучшая порода, Безопасный Сотрудничество, платформа для хостинга кода со встроенным CI/CD Возможности с более чем 56 миллионами пользователей.
Многие организации используют его, и все они должны управлять пользователями, репозиториями, правилами отрасли и многое другое. Стандартизация всех этого вполне сложно и включает в себя создание таких вещей, как инструменты CLI, скрипты и другие способы автоматизации того, как люди имеют дело с Github.
Вот в первомпорте, я решил использовать Террафом Чтобы управлять и стандартизировать все репозиторий и управление пользователями, а сегодня я хочу поделиться с вами, как мы это делаем!
Управление командой и пользователем
Если вы используете GitHub Enterprise, вы, вероятно, будете использовать один вход (SSO). Это делает работу, но не отлично, особенно когда управлять сотрудниками за пределами вашего провайдера идентичности (однако, вы можете использовать Terraporm для управлять группами синхронизации ) — это все еще оставляет вас управлять репозиториями, этикетками, запросами по тягам все вручную. В нашем случае я решил использовать Поставщик GitHub Terraform автоматизировать большую часть этой работы.
Во-первых, я создал команды:
# Creates a parent team
resource "github_team" "engineering" {
name = "engineering"
description = "This is a parent team"
privacy = "closed"
}
# Creates a sub team of front-end developers
resource "github_team" "frontend" {
name = "frontend"
description = "This is a sub team "
parent_team_id = github_team.engineering.id
privacy = "closed"
}
Каждый раз, когда у нас есть кто-то новое соединение, любой в первомпорте может открыть PR и пригласить их в команду.
# Invites a user to the organization
resource "github_membership" "anewstarter" {
username = "firstportuser"
role = "member"
}
# Adds the user to a team
resource "github_team_membership" "frontend-firstportuser1" {
username = github_membership.firstportuser.username
team_id = github_team.frontend.id
role = "maintainer"
}
Это будет работать в рабочем процессе действий GitHub, и пользователь получит приглашение присоединиться к нашей организации.
Создание репозитория
Это, вероятно, главная причина, по которой я решил использовать террафом для управления GitHub. Если репозитории не стандартизируются, это может создать хаотическую ситуацию, если в каждом репозитории в каждом репозитории в каждом репозитории в каждом хранилище. Чтобы избежать этого, я решил создать большинство наших репозиториев таким же образом.
Несколько вещей были очень важны для нас, что должен иметь каждый репозиторий. Давайте пройдемся через сети:
Выпустить ноты
Я хотел предоставить способ иметь возможность легко создавать заметки выпуска, чтобы улучшить прозрачность на то, что мы доставляем. Я решил использовать инструмент под названием Выпуск Drafter в нашем рабочим процессе. Я хотел настроить, как эти метки будут использоваться в каждом репозитории, и для этого мы стандартизировали все этикетки на всех репозиториях. Я использую: Документы, зависимости, ошибка, функция и обслуживание.
Каждый раз, когда кто-то открывает PR, им нужно выбрать хотя бы один из этих меток, чтобы определить, как этот PR классифицируется (это принудительно с использованием Meading Meading Meader ). Когда PR будет объединен, я использую Drafter Action Release Github, который создает черновик с коммитами от пр в одну из этих категорий. Это помогает нам создавать заметки выпуска для всех наших услуг!
Вот как будут выглядеть заметка выпуска:
Каждый раз, когда кто-то создает новый репо, Release Rafter приходит предварительно настроен, и вы можете начать наслаждаться хорошими заметками выпуска без каких-либо усилий.
Защита от ответственности
Настройка правил, когда вы сможете объединить ветку, очень важно для качества кода, и в нашем случае по юридическим причинам (в FirstPort мы имеем дело с персональными пользователями, поэтому все изменения должны пройти строгие проверки качества кода). GitHub дает возможность настроить правила защиты от ответственности, чтобы решить это.
Я хотел определить тот же набор базовой защиты от ответственности для всех репозиториев. Это было легко решено с нашим модулем террафора.
Модуль террафора
Для достижения всего этого я создал модуль террафора, который управляет пользователям, командами и репозиториями. Вот пример того, как мы используем модуль:
module "my-firstport-repo" {
source = "./modules/repo"
version = "~> 1.0"
name = "my-firstport-repo"
description = "A firstport repository description"
visibility = "private"
delete_branch_on_merge = true
vulnerability_alerts = true
teams = { (data.github_team.engineering.id) = "push" }
collaborators = { (data.github_user.external.username) = "push" }
labels = {
"type: bug" = "d73a4a"
"type: docs" = "0f727f"
"type: feature" = "a2eeef"
"type: maintenance" = "a5f7da"
"type: dependencies" = "0366d6"
}
branch_protection = {
master = {
enforce_admins = true
push_restrictions = []
required_status_checks = {
strict = true
contexts = []
}
required_pull_request_reviews = {
dismiss_stale_reviews = true
require_code_owner_reviews = true
dismissal_restrictions = []
}
}
}
}
Действия GitHub
Действия GitHub — наш инструмент CI выбор. Действия GitHub — это услуга размещенного програва, предоставленная GitHub. Любой пользователь может писать отдельные задачи, называемые действиями, и вкладывать их в рабочий процесс. Эти рабочие процессы могут вызвать многочисленные события, такие как запросы на тяга, комментарии, этикетки, релизы и т. Д. Я думаю об этом как имея коробку из кирпичей Lego, которые могут быть собраны по мере необходимости; Я могу построить космический корабль или пиратский корабль, как желание моего сердца.
Пользователи могут свободно писать свои собственные действия или потреблять их из Github Marketplace Отказ Например, действие, которое выполняет Код Checkout написан Github и находится на рынке. Для более глубокого введения в действия GitHub я предлагаю прочитать Начало работы с Github Действия документация.
С целью этой статьи я использую действия GitHub для создания рабочего процесса для предоставления Функциональность CI .
Есть один рабочий процесс, который работает на каждом PR:
name: Terraform Plan
on:
- pull_request
jobs:
terraform:
name: Terraform
runs-on: ubuntu-latest
env:
ARM_CLIENT_ID: ${{ secrets.CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.GH_TERRAFORM_PRD }}
ARM_SUBSCRIPTION_ID: ${{ secrets.SUB_ID }}
ARM_TENANT_ID: ${{ secrets.TENANT_ID }}
ARM_ACCESS_KEY: ${{secrets.GH_TERRAFORM_PRD_STATE_BLOB_KEY}}
steps:
- name: Checkout
uses: actions/checkout@master
- name: "Security Scan"
uses: triat/terraform-security-scan@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Lint Code Base
uses: github/super-linter@master
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
VALIDATE_ALL_CODEBASE: true
VALIDATE_MD: true
VALIDATE_TERRAFORM: true
- uses: hashicorp/setup-terraform@master
with:
terraform_version: latest
- name: Terraform Format
id: fmt
run: terraform fmt -check
- name: Terraform Init
id: init
run: terraform init
- name: Terraform Validate
id: validate
run: terraform validate -no-color
env:
TF_VAR_github_token: ${{ secrets.GH_TOKEN }}
- name: Terraform Plan
id: plan
run: terraform plan -no-color
continue-on-error: true
env:
TF_VAR_github_token: ${{ secrets.GH_TOKEN }}
- uses: actions/github-script@master
env:
PLAN: "terraform\n${{ steps.plan.outputs.stdout }}"
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const output = `#### Terraform Security Scan ☠ \`Success! The configuration is secure.\`
#### Terraform Format and Style 🖌 \`${{ steps.fmt.outcome }}\`
#### Terraform Initialization ⚙️ \`${{ steps.init.outcome }}\`
#### Terraform Validation 🤖 ${{ steps.validate.outputs.stdout }}
#### Terraform Plan 📖 \`${{ steps.plan.outcome }}\`
Show Plan
\`\`\`${process.env.PLAN}\`\`\`
*Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`, Working Directory: \`${{ env.tf_actions_working_dir }}\`, Workflow: \`${{ github.workflow }}\`*`;
github.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
- name: Terraform Plan Status
if: steps.plan.outcome == 'failure'
run: exit 1
На слиянии мы запускаем следующий рабочий процесс:
name: Terraform Apply
on:
push:
branches:
- main
jobs:
terraform:
name: Apply
runs-on: ubuntu-latest
env:
ARM_CLIENT_ID: ${{ secrets.CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.GH_TERRAFORM_PRD }}
ARM_SUBSCRIPTION_ID: ${{ secrets.SUB_ID }}
ARM_TENANT_ID: ${{ secrets.TENANT_ID }}
ARM_ACCESS_KEY: ${{ secrets.GH_TERRAFORM_PRD_STATE_BLOB_KEY }}
steps:
- name: Checkout
uses: actions/checkout@master
- uses: hashicorp/setup-terraform@master
with:
terraform_version: 0.14.3
- name: Terraform Init
id: init
run: terraform init
- name: Terraform Apply
id: apply
run: terraform apply -auto-approve -input=false
env:
TF_VAR_github_token: ${{ secrets.GH_TOKEN }}
Релиз Drafter устанавливается следующим образом:
name: Release Drafter
on:
push:
branches:
- main
jobs:
update_release_draft:
runs-on: ubuntu-latest
steps:
- uses: release-drafter/release-drafter@master
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
С следующим YAML для конфигурации:
categories:
- title: '🚀 Features'
labels:
- 'feature'
- title: '🐛 Bug Fixes'
labels:
- 'bug'
- title: '🧰 Maintenance'
label: 'maintenance'
- title: '📖 Docs'
label: 'docs'
- title: '⚙️ Dependencies'
label: 'dependencies'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
template: |
## Changes
$CHANGES
Чтобы убедиться, что все захвачено в заметках выпуска, мы также используем Обеспечить действие метки :
name: Enforce PR labels
on:
pull_request:
types: [labeled, unlabeled, opened, edited, synchronize]
jobs:
enforce-label:
runs-on: ubuntu-latest
steps:
- uses: yogevbd/enforce-label-action@master
with:
REQUIRED_LABELS_ANY: "bug,docs,feature,maintenance,dependencies"
REQUIRED_LABELS_ANY_DESCRIPTION: "Select at least one label ['bug','docs','feature','maintenance','dependencies']"
Это то, что вы видите на вкладке «Потяжного запроса», каждый раз, когда PR Workflow работает. Позволяя вам быстро увидеть, может ли PR можно слиться:
Мы также продвигаем эту информацию в Microsoft Teams, используя Приложение интеграции GitHub
Devsecops.
Дополнительное преимущество использования рабочего процесса Ci добавляет автоматические тесты. В этом сценарии я добавил шаг, используя TFSEC Скачать для уязвимости статического кода. В приведенном ниже примере TFSEC предупреждает против создания правила безопасности сети Azure, которое полностью открыто. Это остановит и не пройдет рабочий процесс, если я не предоставим игнорирующему комментарию, чтобы принять предупреждение.
Резюме
В этом посте я исследовал использование действий GitHub в качестве рабочего процесса CI, который может построить и поддерживать организацию GitHub, включая пользователей, команды, разрешения, безопасность и т. Д. Я начал с создания нового репозитория GitHub, затем написал файлы рабочих процессов GitHub и, наконец, начали тестирование рабочего процесса CI и внедряя небольшие, инкрементные изменения.
Использование террафора для управления организациями GitHub может действительно помочь своим командам разработчика на борту быстро и надежно.
Я надеюсь, что смогу помочь вам узнать что-то новое сегодня, и поделиться, как мы делаем здесь вещи в FirstPort Отказ
Любые вопросы, свяжитесь на Twitter
Оригинал: «https://dev.to/ghostinthewire5/how-firstport-manage-github-using-code-stored-in-github-41f6»