Рубрики
Uncategorized

Как FirdPort управлять GitHub, используя код, хранящийся в GitHub

Введение Как многие из вас уже узнают, я недавно начал захватывающую новую роль … Помечено Github, Terraform, DevOps, учебником.

Как многие из вас уже узнают, я недавно начал захватывающую новую роль в качестве руководителя технологий в 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»