Skip to content
This repository has been archived by the owner on Jun 7, 2020. It is now read-only.

added postgres support #32

Closed
wants to merge 15 commits into from
Closed
18 changes: 18 additions & 0 deletions README.md
Expand Up @@ -34,6 +34,12 @@ The URL from which SonarQube will be downloaded, and the resulting directory nam

The value of `sonar.web.context`. Setting this to something like `/sonar` allows you to set the context where Sonar can be accessed (e.g. `hostname/sonar` instead of `hostname`).

sonar_plugins_dir: /usr/local/sonar/extensions/plugins
sonar_plugins_url: []

Directory where downloaded plugins will be installed.
List of the urls where to download each plugin.

sonar_mysql_username: sonar
sonar_mysql_password: sonar

Expand All @@ -48,6 +54,18 @@ The value of `sonar.web.context`. Setting this to something like `/sonar` allows

JDBC settings for a connection to a MySQL database. Defaults presume the database resides on localhost and is only accessible on the SonarQube server itself.

sonar_install_method: "move"

The way you want the install to be done. By default **move** is a rename of the versionned directory into _sonar_. You can set to **link** to create a symlink _sonar_ targeting the versionned directory. You can set to **copy** to copy the versionned directory into _sonar_ and remove the versionned directory (use case: dedicated filesystem).

sonar_user: sonar

Change Sonar default user running Sonar.

sonar_group: sonar

Change Sonar default group of the user running Sonar.

## Dependencies

- geerlingguy.java
Expand Down
26 changes: 20 additions & 6 deletions defaults/main.yml
Expand Up @@ -7,16 +7,30 @@ sonar_version: 4.5.6
sonar_download_url: "https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-{{ sonar_version }}.zip"
sonar_version_directory: "sonarqube-{{ sonar_version }}"

sonar_user: sonar
sonar_group: "{{ sonar_user }}"
sonar_web_context: ''

# MySQL database connection details.
sonar_mysql_username: sonar
sonar_mysql_password: sonar
# The Database engine.
# possible values: postgres and mysql
sonar_database_engine: mysql

sonar_plugins_dir: /usr/local/sonar/extensions/plugins
sonar_plugins_url: []

# Default: move - Values: move, copy, link
sonar_install_method: "move"

sonar_mysql_host: localhost
sonar_mysql_port: "3306"
sonar_mysql_database: sonar
# Database connection details
sonar_database_username: sonar
sonar_database_password: sonar

sonar_database_host: localhost
# mysqlsql default port is 3306 and the postgres' is 5432
sonar_database_port: "3306"
sonar_database_name: sonar

# MySQL database connection details.
sonar_mysql_allowed_hosts:
- "127.0.0.1"
- "::1"
Expand Down
3 changes: 2 additions & 1 deletion meta/main.yml
@@ -1,7 +1,8 @@
---
dependencies:
- geerlingguy.java
- geerlingguy.mysql
- {role: 'geerlingguy.postgresql', when: sonar_database_engine == 'postgres', become: yes}
- {role: 'geerlingguy.mysql', when: sonar_database_engine == 'mysql'}

galaxy_info:
author: geerlingguy
Expand Down
20 changes: 5 additions & 15 deletions tasks/configure.yml
@@ -1,16 +1,6 @@
---
- name: Configure SonarQube JDBC settings for MySQL.
lineinfile:
dest: /usr/local/sonar/conf/sonar.properties
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
notify: restart sonar
with_items:
- regexp: "^sonar.jdbc.username"
line: "sonar.jdbc.username={{ sonar_mysql_username }}"
- regexp: "^sonar.jdbc.password"
line: "sonar.jdbc.password={{ sonar_mysql_password }}"
- regexp: "^sonar.jdbc.url"
line: "sonar.jdbc.url=jdbc:mysql://{{ sonar_mysql_host }}:{{ sonar_mysql_port }}/{{ sonar_mysql_database }}?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance"
- regexp: "^sonar.web.context"
line: "sonar.web.context={{ sonar_web_context }}"
- include: configure_mysql.yml
when: sonar_database_engine == "mysql"

- include: configure_postgres.yml
when: sonar_database_engine == "postgres"
29 changes: 29 additions & 0 deletions tasks/configure_mysql.yml
@@ -0,0 +1,29 @@
---
- name: Create a database for Sonar.
mysql_db:
name: "{{ sonar_database_name }}"
state: present

- name: Create a sonar user.
mysql_user:
name: "{{ sonar_database_username }}"
host: "{{ item }}"
priv: "{{ sonar_database_name }}.*:ALL"
password: "{{ sonar_database_password }}"
with_items: "{{ sonar_mysql_allowed_hosts }}"

- name: Configure SonarQube JDBC settings for MySQL.
lineinfile:
dest: /usr/local/sonar/conf/sonar.properties
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
notify: restart sonar
with_items:
- regexp: "^sonar.jdbc.username"
line: "sonar.jdbc.username={{ sonar_database_username }}"
- regexp: "^sonar.jdbc.password"
line: "sonar.jdbc.password={{ sonar_database_password }}"
- regexp: "^sonar.jdbc.url"
line: "sonar.jdbc.url=jdbc:mysql://{{ sonar_database_host }}:{{ sonar_database_port }}/{{ sonar_database_name }}?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance"
- regexp: "^sonar.web.context"
line: "sonar.web.context={{ sonar_web_context }}"
33 changes: 33 additions & 0 deletions tasks/configure_postgres.yml
@@ -0,0 +1,33 @@
---
- name: Create a database for Sonar.
become: yes
become_user: "{{ postgresql_user }}"
postgresql_db:
name: "{{ sonar_database_name }}"
encoding: UTF-8
state: present

- name: Create a sonar user.
become: yes
become_user: "{{ postgresql_user }}"
postgresql_user:
name: "{{ sonar_database_username }}"
password: "{{ sonar_database_password }}"
db: "{{ sonar_database_name }}"
priv: "ALL"

- name: Configure SonarQube JDBC settings for Postgres.
lineinfile:
dest: /usr/local/sonar/conf/sonar.properties
regexp: "{{ item.regexp }}"
line: "{{ item.line }}"
notify: restart sonar
with_items:
- regexp: "^sonar.jdbc.username"
line: "sonar.jdbc.username={{ sonar_database_username }}"
- regexp: "^sonar.jdbc.password"
line: "sonar.jdbc.password={{ sonar_database_password }}"
- regexp: "^sonar.jdbc.url"
line: "sonar.jdbc.url=jdbc:postgresql://{{ sonar_database_host }}:{{ sonar_database_port }}/{{ sonar_database_name }}"
- regexp: "^sonar.web.context"
line: "sonar.web.context={{ sonar_web_context }}"
70 changes: 58 additions & 12 deletions tasks/main.yml
@@ -1,22 +1,26 @@
---
- name: Create a database for Sonar.
mysql_db:
name: "{{ sonar_mysql_database }}"
- name: Ensure sonar group is created.
group:
name: "{{ sonar_group }}"
state: present

- name: Create a sonar user.
mysql_user:
name: "{{ sonar_mysql_username }}"
host: "{{ item }}"
priv: "{{ sonar_mysql_database }}.*:ALL"
password: "{{ sonar_mysql_password }}"
with_items: "{{ sonar_mysql_allowed_hosts }}"
- name: Ensure sonar user is created.
user:
name: "{{ sonar_user }}"
group: "{{ sonar_group }}"
createhome: no
home: /usr/local/sonar

- name: Verify Sonar installation.
stat: path=/usr/local/sonar/bin/linux-x86-64/sonar.sh
register: sonar_installed

- name: Download Sonar.
get_url:
url: "{{ sonar_download_url }}"
dest: "{{ workspace }}/{{ sonar_version_directory }}.zip"
validate_certs: "{{ sonar_download_validate_certs }}"
when: sonar_installed.stat.exists == False

- name: Unzip Sonar.
unarchive:
Expand All @@ -29,8 +33,35 @@
shell: >
mv /usr/local/{{ sonar_version_directory }} /usr/local/sonar
creates=/usr/local/sonar/COPYING
when: sonar_install_method == 'move'

- name: Check /usr/local/sonar is a directory.
file:
path: /usr/local/sonar
state: directory
when: (sonar_install_method == 'move' or sonar_install_method == 'copy')

- name: Copy Sonar into place.
shell: >
cp -r /usr/local/{{ sonar_version_directory }}/* /usr/local/sonar
creates=/usr/local/sonar/COPYING
when: sonar_install_method == 'copy'

- name: Clean the origin of the copy.
file:
path: /usr/local/{{ sonar_version_directory }}
state: absent
when: sonar_install_method == 'copy'

- name: Add sonar symlink to the installed version.
file:
src: /usr/local/{{ sonar_version_directory }}
dest: /usr/local/sonar
state: link
when: sonar_install_method == 'link'

- include: configure.yml
- include: plugins.yml

- name: Symlink sonar bin.
file:
Expand All @@ -55,12 +86,27 @@
mode: 0755
when: "ansible_service_mgr == 'systemd'"

- name: Ensure ownership of SonarQube objects.
file:
path: /usr/local/sonar
owner: "{{ sonar_user }}"
group: "{{ sonar_group }}"
recurse: yes

- name: Ensure Sonar is running and set to start on boot.
service: name=sonar state=started enabled=yes

- name: Allow Sonar time to build on first start.
pause: seconds=180
- name: Ensure Sonar is started.
wait_for:
path: /usr/local/sonar/logs/sonar.log
delay: 10
search_regex: 'app\[o\.s\.p\.m\.Monitor\] Process\[web\] is up'
when: sonar_symlink.changed

- name: Make sure Sonar is responding on the configured port.
wait_for: port=9000 delay=3 timeout=300

- name: Clean workspace.
file:
path: "{{ workspace }}/{{ sonar_version_directory }}.zip"
state: absent
12 changes: 12 additions & 0 deletions tasks/plugins.yml
@@ -0,0 +1,12 @@
---
- name: Ensure plugins folder.
file:
path: "{{ sonar_plugins_dir }}"
state: directory

- name: Install Sonar plugins.
get_url:
url: "{{ item }}"
dest: "{{ sonar_plugins_dir }}"
with_items: "{{ sonar_plugins_url }}"
notify: restart sonar
1 change: 1 addition & 0 deletions tests/requirements.yml
Expand Up @@ -2,3 +2,4 @@
- src: geerlingguy.repo-remi
- src: geerlingguy.java
- src: geerlingguy.mysql
- src: geerlingguy.postgresql
2 changes: 2 additions & 0 deletions tests/test-latest.yml
Expand Up @@ -4,6 +4,8 @@
vars:
# Latest version of SonarQube, from http://www.sonarqube.org/downloads/
sonar_version: 5.6.1
sonar_database_engine: "mysql"
sonar_database_port: "3306"

pre_tasks:
- name: Update apt cache.
Expand Down
4 changes: 4 additions & 0 deletions tests/test-lts.yml
@@ -1,6 +1,10 @@
---
- hosts: all

vars:
sonar_database_engine: "mysql"
sonar_database_port: "3306"

pre_tasks:
- name: Update apt cache.
apt: update_cache=yes cache_valid_time=600
Expand Down
2 changes: 2 additions & 0 deletions tests/test-web_context.yml
Expand Up @@ -3,6 +3,8 @@

vars:
sonar_web_context: "/sonar"
sonar_database_engine: "mysql"
sonar_database_port: "3306"

pre_tasks:
- name: Update apt cache.
Expand Down