Рубрики
Uncategorized

Как FirstPort использует мощность открытого источника для привода непрерывного качества кода

Вступление Как многие из вас уже узнают, я глава технологии в первомпорте. A… Теги с лазурным, Github, DevOps, террафом.

Как многие из вас уже узнают, я глава технологий в FirstPort Отказ

Ключевой частью моей роли является предоставление видения первогорта «Люди первой» технологии. Для этого необходимо, чтобы я выбирал правильную технологию, чтобы подкрепить доставку услуг, которые помогают облегчить жизнь клиентов.

Сегодня я хочу поговорить о моем выборе Sonarqube (и целый хост других прохладных инструментов и услуг, таких как действия GitHub, Terraform, Caddy, давайте шифрование, докер и многое другое)

Sonarqube является ведущим инструментом для постоянного осмотра качества кода и безопасности ваших кодовых базах и руководящих команд развития во время кода отзывы

Строительство нашего контейнера

Я не хотел использовать Сонарклауд Я не хотел провести это в виртуальной машине. Так что я решил на ACI (экземпляры контейнеров Azure)

Однако при попытке использовать ACI с внешней базой данных, я обнаружил, что Любая версия Sonarqube после 7,7 бросает ошибку:

ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

Я нашел это было потому, что Sonarqube использует встроенный Elasticsearch Поэтому вам необходимо убедиться, что ваша конфигурация Host Docker соответствует Elasticsearch Производственный режим Требования

Поскольку приведенные выше требования, чтобы исправить это, это означало бы изменение настроек хост-ОС для увеличения Max_Map_count, в ОС Linux это будет изменение файла/etc/sysctl.conf для обновления max_map_count

vm.max_map_count=262144

Проблема с ACI состоит в том, что нет доступа к хосту, так как в ACI может быть запущен последний Sonarqube (последняя версия на момент написания было 9.0.1), если она не может быть изменена.

В этом блоге я собираюсь рассказать о том, как мы запускаем Sonarqube в экземплярах контейнеров Azure с внешней базой данных Azure SQL.

Вот в первомпорте, мы также используем Террафом построить инфраструктуру Azure и, конечно, действий GitHub.

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

Первое, что нужно решить проблему max_map_count, для этого нам нужен файл sonar.properties, который содержит следующие настройки:

sonar.search.javaAdditionalOpts=-Dnode.store.allow_mmap=false

Этот параметр предоставляет возможность отключить отображение памяти в эластичном поисковом поиске, который требуется при запуске Sonarqube внутри контейнеров, где вы не можете изменить хосты VM.max_map_count. ( Посмотреть Elasticsearch Документация Несомненно

Теперь у нас есть наш файл sonar.properties, нам нужно создать пользовательский контейнер, чтобы мы могли добавить это в настройку. Небольшой докер может достичь этого:

FROM sonarqube:9.0.1-community
COPY sonar.properties /opt/sonarqube/conf/sonar.properties
RUN chown sonarqube:sonarqube /opt/sonarqube/conf/sonar.properties

Этот DockerFile теперь готов быть построен с помощью Docker и выталкивался на ACR (реестр контейнера Azure).

Для получения дополнительной информации о том, как создать контейнер и/или подтолкнуть к ACR, посмотрите на Докер и Microsoft Документация, которые легко следовать инструкциям.

Сначала мы строим ACR с использованием террафора:

resource "azurerm_container_registry" "acr" {
  name                = join("", [var.product, "acr", var.location, var.environment])
  resource_group_name = azurerm_resource_group.rg.name
  location            = azurerm_resource_group.rg.location
  admin_enabled       = true
  sku                 = "Standard"

  tags = local.tags
}

а затем используйте наш стандартный рабочий процесс для работы террафора в Действиях GitHub

Далее мы используем действия GitHub для создания и нажмите наш контейнер изображения на настройку ACR выше. Обратите внимание на CD контейнер линия. Это потому, что у нас есть наш Dockerfile и Sonar.properties файлы в папке под названием контейнер (папка SONAR содержит все файлы террафора для остальной части инфраструктуры):

name: Build Container Image & Push to ACR
on:
  workflow_dispatch:

jobs:
  build:
    name: Build Container & Push to ACR
    runs-on: ubuntu-latest

    steps:

      - name: Checkout
        uses: actions/checkout@master

      - name: ACR build
        uses: azure/docker-login@v1
        with:
          login-server: acrname.azurecr.io
          username: acrusername
          password: ${{ secrets.REGISTRY_PASSWORD }}

      - run: |
          cd container && docker build . -t acrname.azurecr.io/acrrepo:${{ github.sha }}
          docker push acrname.azurecr.io/acrrepo:${{ github.sha }}

Строительство инфраструктуры Sonarqube

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

Есть несколько частей для создания:

  • Акции файлов
  • Внешняя база данных
  • Контейнерная группа
    • Сонаркибе
    • Обратный прокси

В FirstPort наш по умолчанию должен использовать IAC (инфраструктуру в качестве кода), поэтому я покажу вам, как я использую Terraporm для настройки инфраструктуры Sonarqube.

Акции файлов

Сонаркбе Документация УМЕНСТВОСТИ УСТАНОВКА ГОЛОГОВЫХ КОНЕЦ ДЛЯ ДАННЫХ, УСЛУГИ И LOGS, для этого я использую учетную запись Azure Storage и Actions.

resource "azurerm_storage_account" "storage" {
  name                     = join("", [var.product, "strg", var.location, var.environment])
  location                 = azurerm_resource_group.rg.location
  resource_group_name      = azurerm_resource_group.rg.name
  account_tier             = "Standard"
  account_replication_type = "RAGZRS"
  min_tls_version          = "TLS1_2"
  tags                     = local.tags
}

resource "azurerm_storage_share" "data-share" {
  name                 = "data"
  storage_account_name = azurerm_storage_account.storage.name
  quota                = 50
}

resource "azurerm_storage_share" "extensions-share" {
  name                 = "extensions"
  storage_account_name = azurerm_storage_account.storage.name
  quota                = 50
}

resource "azurerm_storage_share" "logs-share" {
  name                 = "logs"
  storage_account_name = azurerm_storage_account.storage.name
  quota                = 50
}

Внешняя база данных

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

Используя ресурс Random_Password, чтобы создать пароль SQL, не включены секреты, и нет необходимости знать пароль до тех пор, пока делает сервер Sonarqube.

resource "azurerm_mssql_server" "sql_server" {
  name                         = join("", [var.product, "sql", var.location, var.environment])
  location                     = azurerm_resource_group.rg.location
  resource_group_name          = azurerm_resource_group.rg.name
  version                      = "12.0"
  administrator_login          = "sonaradmin"
  administrator_login_password = random_password.sql_admin_password.result
  minimum_tls_version          = "1.2"

  identity {
    type = "SystemAssigned"
  }

  tags = local.tags
}

resource "azurerm_mssql_server_transparent_data_encryption" "sql_tde" {
  server_id = azurerm_mssql_server.sql_server.id
}

resource "azurerm_sql_firewall_rule" "sql_firewall_azure" {

  name                = "AllowAccessToAzure"
  resource_group_name = azurerm_resource_group.rg.name
  server_name         = azurerm_mssql_server.sql_server.name
  start_ip_address    = "0.0.0.0"
  end_ip_address      = "0.0.0.0"
}

resource "azurerm_mssql_database" "sonar" {
  name      = "sonar"
  server_id = azurerm_mssql_server.sql_server.id
  collation = "SQL_Latin1_General_CP1_CS_AS"
  sku_name  = "S2"

  tags = local.tags
}

resource "random_password" "sql_admin_password" {
  length           = 32
  special          = true
  override_special = "/@\" "
}

Контейнерная группа

Настройка группы контейнера требует учетных данных для доступа к реестру контейнеров Azure, чтобы запустить пользовательский контейнер Sonarqube. Использование ресурса данных позволяет получать поиск деталей без передачи их в качестве переменных:

data "azurerm_container_registry" "registry" {
  name                = "acrname"
  resource_group_name = "acr-rg-name"
}

Для этой настройки мы будем иметь две контейнеры — пользовательский контейнер Sonarqube и контейнер Caddy. Кэдди Может использоваться в качестве обратного прокси и небольшой, легкий и обеспечивает управление сертификатами автоматически с помощью Давайте шифровать Отказ

Конфигурация контейнера SONARQUBE соединяет базу данных SQL и Azure Account Account, настроенные ранее.

Конфигурация контейнера Caddy устанавливает обратный прокси к экземпляру Sonarqube:

resource "azurerm_container_group" "container" {
  name                = "containergroupname"
  location            = azurerm_resource_group.rg.location
  resource_group_name = azurerm_resource_group.rg.name
  ip_address_type     = "public"
  dns_name_label      = "acrdnslabel"
  os_type             = "Linux"
  restart_policy      = "OnFailure"
  tags                = local.tags

  image_registry_credential {
    server   = data.azurerm_container_registry.registry.login_server
    username = data.azurerm_container_registry.registry.admin_username
    password = data.azurerm_container_registry.registry.admin_password
  }

  container {
    name   = "sonarqube-server"
    image  = "${data.azurerm_container_registry.registry.login_server}/acrrepo:latest"
    cpu    = "2"
    memory = "4"
    environment_variables = {
      WEBSITES_CONTAINER_START_TIME_LIMIT = 400
    }
    secure_environment_variables = {
      SONARQUBE_JDBC_URL      = "jdbc:sqlserver://${azurerm_mssql_server.sql_server.name}.database.windows.net:1433;database=${azurerm_mssql_database.sonar.name};user=${azurerm_mssql_server.sql_server.administrator_login}@${azurerm_mssql_server.sql_server.name};password=${azurerm_mssql_server.sql_server.administrator_login_password};encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;"
      SONARQUBE_JDBC_USERNAME = azurerm_mssql_server.sql_server.administrator_login
      SONARQUBE_JDBC_PASSWORD = random_password.sql_admin_password.result
    }

    ports {
      port     = 9000
      protocol = "TCP"
    }

    volume {
      name                 = "data"
      mount_path           = "/opt/sonarqube/data"
      share_name           = "data"
      storage_account_name = azurerm_storage_account.storage.name
      storage_account_key  = azurerm_storage_account.storage.primary_access_key
    }

    volume {
      name                 = "extensions"
      mount_path           = "/opt/sonarqube/extensions"
      share_name           = "extensions"
      storage_account_name = azurerm_storage_account.storage.name
      storage_account_key  = azurerm_storage_account.storage.primary_access_key
    }

    volume {
      name                 = "logs"
      mount_path           = "/opt/sonarqube/logs"
      share_name           = "logs"
      storage_account_name = azurerm_storage_account.storage.name
      storage_account_key  = azurerm_storage_account.storage.primary_access_key
    }
  }

  container {
    name     = "caddy-ssl-server"
    image    = "caddy:latest"
    cpu      = "1"
    memory   = "1"
    commands = ["caddy", "reverse-proxy", "--from", "acrrepo.azurecontainer.io", "--to", "localhost:9000"]

    ports {
      port     = 443
      protocol = "TCP"
    }

    ports {
      port     = 80
      protocol = "TCP"
    }
  }
}

Окончательная конфигурация

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

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

Как только экземпляр контейнера вы, вероятно, не хотите, чтобы он работает 24/7, так что используя функцию Azure или логическое приложение для остановки и запуска экземпляра, когда его не нужно, безусловно, сэкономит деньги. Я планирую запустить Azure Logic App, чтобы начать контейнер в 08:00 и остановить контейнер в 18:00 с понедельника по пятницу (Я могу почувствовать еще один пост блога!)

Я надеюсь, что смогу помочь вам узнать что-то новое сегодня, и поделиться, как мы делаем здесь вещи в FirstPort Отказ

Любые вопросы, свяжитесь на Twitter

Оригинал: «https://dev.to/ghostinthewire5/how-firstport-are-leveraging-the-power-of-open-source-to-drive-continuous-code-quality-fd0»