Есть SonarQube, запускается из Jenkins-джоб.
См. SonarQube: запуск в Docker и вызов из Jenkins Pipeline.
SonarQube из Jenkins запускается, задачи проходят, но в самом SonarQube возникает ошибка:
java.lang.IllegalStateException: Unrecoverable indexation failures: 1 errors among 1 requests
at org.sonar.server.es.IndexingListener$1.onFinish(IndexingListener.java:39)
at org.sonar.server.es.BulkIndexer.stop(BulkIndexer.java:122)
…
Логи SonarQube:
Aug 29 12:30:26 jenkins-production docker-compose[12591]: sonarqube_1 | 2019.08.29 09:30:26 ERROR web[][o.s.s.es.BulkIndexer] index [components], type [auth], id [AWzcfdpYaLFDDA6l6km3], message [ClusterBlockException[blocked by: [FORBIDD
EN/12/index read-only / allow delete (api)];]]
Aug 29 12:30:26 jenkins-production docker-compose[12591]: sonarqube_1 | 2019.08.29 09:30:26 ERROR web[][o.s.s.e.RecoveryIndexer] Elasticsearch recovery – too many failures [167/167 documents], waiting for next run
Aug 29 12:30:26 jenkins-production docker-compose[12591]: sonarqube_1 | 2019.08.29 09:30:26 INFO web[][o.s.s.e.RecoveryIndexer] Elasticsearch recovery – 167 documents processed [167 failures] | time=51ms
Aug 29 12:30:48 jenkins-production docker-compose[12591]: sonarqube_1 | 2019.08.29 09:30:48 INFO es[][o.e.c.r.a.DiskThresholdMonitor] low disk watermark [85%] exceeded on [mjJvGbfOSZyVqbKWKCGwxw][sonarqube][/opt/sonarqube/data/es6/nodes
/0] free: 11.6gb[11.8%], replicas will not be assigned to this node
Смотрим документацию Disk-based shard allocation – надо обновить cluster.routing.allocation.disk.watermark.low
, либо вообще отключить проверку через "cluster.routing.allocation.disk.threshold_enabled" : false
.
При том, что на диске свободно 12 гиг из 100, но т.к. ElasticSearch по-умолчанию считает в процентах – ему этого мало.
Т.к. Elasticsearch запускается внутри (аштрисёт!) контейнера с самим SonarQube – ищем, где именно он хранит конфиг:
[simterm]
root@jenkins-production:/opt/jenkins# docker exec -ti jenkins_sonarqube_1 find / -name elasticsearch.yml find: ‘/proc/tty/driver’: Permission denied /opt/sonarqube/temp/conf/es/elasticsearch.yml /opt/sonarqube/elasticsearch/config/elasticsearch.yml
[/simterm]
Ага, вот эти ребята – /opt/sonarqube/elasticsearch/config/elasticsearch.yml
.
Sonar запускается из Docker Compose, в который монтируются каталоги:
version: '3.5' networks: sonar: external: name: jenkins services: sonarqube: user: 1004:1004 image: sonarqube:7.9.1-community ports: - "9000:9000" networks: - sonar environment: - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar volumes: - /data/sonarqube/conf:/opt/sonarqube/conf - /data/sonarqube/logs:/opt/sonarqube/logs - /data/sonarqube/temp:/opt/sonarqube/temp - /data/sonarqube/data:/opt/sonarqube/data - /data/sonarqube/extensions:/opt/sonarqube/extensions - /data/sonarqube/bundled_plugins:/opt/sonarqube/lib/bundled-plugins logging: driver: "journald" ...
Допустимые опции для менеджмента диска (см. Shards):
cluster.routing.allocation.disk.threshold_enabled
: будет ли Elasticsearch вообще проверять состояние дискаcluster.routing.allocation.disk.watermark.low
: default 85%, Elasticsearch не будет размещать шарды на этой нодеcluster.routing.allocation.disk.watermark.high
: default 90%, Elasticsearch попробует перенести шарды с этой ноды на другиеcluster.routing.allocation.disk.watermark.flood_stage
: default 95%, запрещает обновление индексов, шарды которых на этой ноде
Создаём на хосте свой конфиг /data/sonarqube/conf/elasticsearch.yml
:
cluster.routing.allocation.disk.watermark.flood_stage: 95% cluster.routing.allocation.disk.watermark.high: 90%
Добавляем маппинг в контейнер SonarQube:
... volumes: - /data/sonarqube/conf:/opt/sonarqube/conf - /data/sonarqube/conf/elasticsearch.yml:/opt/sonarqube/elasticsearch/config/elasticsearch.yml ...
Что бы получить доступ к Elasticsearch – на самом SonarQube надо включить sonar.search.httpPort
, см. How to Monitor ElasticSearch.
Включаем коннектор порту 9100:
... environment: - sonar.jdbc.url=jdbc:postgresql://db:5432/sonar - sonar.search.httpPort=9100 ...
Перезапускаепм сервис:
[simterm]
root@jenkins-production:/home/admin# systemctl restart sonarqube
[/simterm]
Правда в логах он пишет, что эта опция скоро устареет:
2019.08.29 10:56:15 INFO app[][o.s.a.es.EsSettings] Elasticsearch listening on /127.0.0.1:9001
2019.08.29 10:56:15 WARN app[][o.s.a.es.EsSettings] Elasticsearch HTTP connector is enabled on port 9100. MUST NOT BE USED FOR PRODUCTION
2019.08.29 10:55:10 WARN es[][o.e.d.c.s.Settings] [http.enabled] setting was deprecated in Elasticsearch and will be removed in a future release! See the breaking changes documentation for the next major version.
Проверяем параметры, которые мы задали в файле настроек – подхватил ли их Elasticsearch.
Т.к. Elasticsearch слушает только на localhost внутри конейнера с самим SonarQube (аштрисёт!) – то проверяем curl
-ом напрямую из контйнера с SonarQube:
[simterm]
root@jenkins-production:/home/admin# docker exec -ti jenkins_sonarqube_1 curl localhost:9100/_cluster/settings?include_defaults=true | jq '.[].cluster.routing.allocation.disk' null null { "threshold_enabled": "true", "watermark": { "low": "85%", "flood_stage": "95%", "high": "90%" }, "include_relocations": "true", "reroute_interval": "60s" }
[/simterm]
Применились – можно продолжать билды.
Занятое на ноде место можно проверить так:
[simterm]
root@jenkins-production:/home/admin# docker exec -ti jenkins_sonarqube_1 curl 'http://localhost:9100/_cat/allocation?v&pretty' shards disk.indices disk.used disk.avail disk.total disk.percent host ip node 24 613.4kb 86.3gb 11.5gb 97.9gb 88 127.0.0.1 127.0.0.1 sonarqube
[/simterm]
Все доступные параметры Elasticsearch – https://nickcanzoneri.com/elasticsearch-settings.
Готово.