Как настроить sonarqube 7.1 в AWS эластичных бобов - PullRequest
0 голосов
/ 22 мая 2018

Я попробовал несколько способов запустить sonarQube в нашей среде AWS, все успешно.Однако SonarQube нестабилен.Всякий раз, когда Elastic beanstalk перезапускает экземпляр, моя среда SonarQube стирается.

Вот что я пробовал:

Попытка 1: Экземпляр EC2.Я создаю экземпляр EC2 из bitnami ami imageId: ami-0f9cf81913a6dce27

Это казалось довольно простым процессом.Но я предпочитаю среду гибких beanstalk для управления нашими экземплярами sonarQube EC2.

Попытка 2: Создание среды EB с использованием одного экземпляра docker с помощью этого файла docker:

{
  "AWSEBDockerrunVersion": "1",
  "Image": {
    "Name": "sonarqube:7.1"
  },
  "Ports": [{
    "ContainerPort": "9000"
  }]
}

Это создало среду EB.Он создает экземпляр RDS (с mySql 5.x) для хранения данных сканирования (в базе данных с именем ebdb).Сервер sonarQube локально размещает внутренний экземплярasticsearch для своих данных поиска.

Затем мне нужно добавить несколько переменных среды для поддержки экземпляра RDS (имя пользователя jdbc, пароль, конечная точка URL и т. Д.).

Затем мне нужно настроить сторону безопасности sonarQube.

Функции на рынке не установлены.Поэтому я добавляю SonarJava, Groovy и SonarJS.

Я добавляю пользователя для сканирования.Все хорошо.

За исключением случаев, когда у Elastic Beanstalk возникает проблема со здоровьем, он сбрасывает текущий экземпляр и воссоздает новый экземпляр.

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

Схема для контейнера Docker с одним экземпляром довольно скудна, я не видел никакого способа дальнейшей настройки с файлом Docker.

Попытка 3: Использовать Docker-контейнер с несколькими экземплярами.Схема более надежна, возможно, я смогу настроить sonarQube более явно.Например, вы можете передать переменные окружения, настройки MySQL и т. д.

Мне не удалось заставить это работать.Я узнал, что мне нужно установить объем памяти выше 2 ГБ, чтобы начать работать с Flexiblesearch.Но я не смог запустить среду sonarQube.

Я мог бы вернуться к этому позже.

Попытка 4: использовать AMI в эластичном beanstalk (с провайдером terraform aws)

main.tf


resource "aws_elastic_beanstalk_application" "sonarqube" {
    name        = "SonarQube"
    description = "SonarQube for nano-services"
}

resource "aws_elastic_beanstalk_environment" "nonprod" {
    name                = "${var.application-name}"
    application         = "${aws_elastic_beanstalk_application.sonarqube.name}"
    solution_stack_name = "64bit Amazon Linux 2018.03 v2.10.0 running Docker 17.12.1-ce"
    wait_for_ready_timeout = "30m"

    setting {
        namespace = "aws:autoscaling:updatepolicy:rollingupdate"
        name      = "Timeout"
        value     = "PT1H"
      }

     setting {
        namespace = "aws:elasticbeanstalk:environment"
        name      = "ServiceRole"
        value     = "aws-elasticbeanstalk-service-role"
      }

      setting {
        namespace = "aws:elasticbeanstalk:command"
        name      = "DeploymentPolicy"
        value     = "Rolling"
      }

      setting {
        namespace = "aws:elasticbeanstalk:command"
        name      = "BatchSizeType"
        value     = "Fixed"
      }

      setting {
        namespace = "aws:elasticbeanstalk:command"
        name      = "BatchSize"
        value     = "1"
      }

      setting {
        namespace = "aws:elasticbeanstalk:command"
        name      = "IgnoreHealthCheck"
        value     = "true"
      }

      setting {
        namespace = "aws:autoscaling:launchconfiguration"
        name      = "EC2KeyName"
        value     = "web-aws-key"
      }

      setting {
        namespace = "aws:autoscaling:launchconfiguration"
        name      = "IamInstanceProfile"
        value     = "arn:aws:iam::<redacted>:instance-profile/aws-elasticbeanstalk-ec2-role"
      }

      setting {
        namespace = "aws:autoscaling:launchconfiguration"
        name      = "instanceType"
        value     = "t2.xlarge"
      }

      setting {
        namespace = "aws:elb:listener:443"
        name      = "ListenerProtocol"
        value     = "SSL"
      }

      setting {
        namespace = "aws:elb:listener:443"
        name      = "InstanceProtocol"
        value     = "SSL"
      } 

      setting {
        namespace = "aws:elb:listener:443"
        name      = "SSLCertificateId"
        value     = "arn:aws:acm:<redacted>"
      } 

      setting {
        namespace = "aws:elb:listener:443"
        name      = "ListenerEnabled"
        value     = "true"
      } 
}

Изначально я включил sonarQube AMI:

  setting {
    namespace = "aws:autoscaling:launchconfiguration"
    name      = "imageId"
    value     = "ami-0f9cf81913a6dce27"
  }

Это создает все.Однако экземпляры EC2 реагируют слишком медленно, и EB переходит в статус Грея.Хотя SonarQube работает и работает, EB не знает об этом.Поэтому я закомментировал это и вручную изменил идентификатор изображения как одноразовый.

wait_for_ready_timeout помогает в этом, поскольку это просто не позволяет терраформе истечь.Например, он завершается за 22,5 минуты вместо жесткого останова через 20 минут.

В этом случае он создает SonarQube с локальной базой данных mysql (без экземпляра RDS) с локальным / эластичным поиском.

Функции рынка SonarQube также включены, за исключением Groovy.Который я добавил.

Однако та же проблема, что и раньше.Когда EB отбрасывает экземпляр и создает его заново, среда sonarQube стирается.На этот раз учетные данные, функции рынка и все такое.

Кто-нибудь сталкивался с этой проблемой и понял ее?

1 Ответ

0 голосов
/ 03 октября 2018

Я решил проблему, используя ECS (Fargate) вместо контейнера Elastic Beanstalk.

Шаги:

  1. Создание RDSЭкземпляр mysql в AWS для сонара

  2. Откройте оболочку mysql для этого экземпляра и настройте ее для сонара, см .: Настройка сонара с MySql

  3. Создайте файл docker с интересующими вас плагинами, например:

    FROM sonarqube: последний

    ENV SONARQUBE_JDBC_USERNAME = [YOUR-USERNAME] \
    SONARQUBE_JDBC_PASSWORD =-PASSWORD] \
    SONARQUBE_JDBC_URL = jdbc: mysql: // [YOUR-RDS-ENDPOINT]: 3306 / sonar? UseSSL = false & useUnicode = true & characterEncoding = utf8 & rewriteBatchedStatements = true * useConfigs * 10 * useConfigs * 10 * RU1026 = 10Phttps://sonarsource.bintray.com/Distribution/sonar-java-plugin/sonar-java-plugin-5.7.0.15470.jar" \ && wget "https://sonarsource.bintray.com/Distribution/sonar-javascript-plugin/sonar-javascript-plugin-4.2.1.6529.jar" \ && wget" https://sonarsource.bintray.com/Distribution/sonar-groovy-plugin/sonar-groovy-plugin-1.4.jar" \ && mv * .jar $ SONARQUBE_HOME / extensions / plugins \ && ls -lah $ SONARQUBE_HOME / extensions / plugins

    EXPOSE 9000

    EXPOSE 9092

Я выставил 9092 в случаея хотел закомментировать соединение mysql и протестировать локально с внутренней базой данных h2 в какой-то момент.

Убедитесь, что образ докера работает локально

eval $(docker-machine env)

docker build -t sonar .

docker run -it -d --rm --name sonar -p 9000:9000 -p 9092:9092 sonar:latest

echo $DOCKER_HOST

Откройте браузер с этим IP-адресом, порт 9000. Например, http://192.x.x.x:9000

Создайте новый репозиторий ECS с именем sonar для хранения образа докера.

Интерфейс AWS фактически говорит о том, как опубликовать образ докера, так что это должно быть само собой разумеющимся.

Отметьте и отправьте файл докера в репозиторий сонара

$(aws ecr get-login --no-include-email --region [YOUR-AWS-REGION])

docker tag sonar:latest [YOUR-ECS-DOCKER-IMAGE-URI]/sonar:latest

docker push [YOUR-ECS-DOCKER-IMAGE-URI]/sonar:latest

Создайте новый кластер fargate под названием sonar

Создать новое определение задачи.

Для вашего контейнера используйте URI образа док-станции ECS.Я дал 6 ГБ памяти и 2 процессора, с 1024 процессорами.Здесь я открыл порты 9000 и 9092. Я также добавил сюда переменные среды в Dockerfile.

Создайте службу ECS и включите задачу.Запустите его, проверьте логи cloudwatch.И поразил публичную конечную точку на порту 9000, и готово.

Я в основном позаимствовал из этого: https://www.infralovers.com/en/articles/2018/05/04/sonarqube-on-aws-fargate/

Надеюсь, это поможет другим.

...