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