--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/deploy/deploy.yml Wed Nov 28 15:45:37 2018 +0100
@@ -0,0 +1,341 @@
+---
+# - hosts: all
+# tasks:
+# - name: Print some debug information
+# vars:
+# msg: |
+# Module Variables ("vars"):
+# --------------------------------
+# {{ vars | to_nice_json }}
+
+# Environment Variables ("environment"):
+# --------------------------------
+# {{ environment | to_nice_json }}
+
+# GROUP NAMES Variables ("group_names"):
+# --------------------------------
+# {{ group_names | to_nice_json }}
+
+# GROUPS Variables ("groups"):
+# --------------------------------
+# {{ groups | to_nice_json }}
+
+# HOST Variables ("hostvars"):
+# --------------------------------
+# {{ hostvars | to_nice_json }}
+
+# debug:
+# msg: "{{ msg.split('\n') }}"
+# tags: debug_info
+#
+# Localhost actions
+#
+- hosts: localhost
+ connection: local
+ vars:
+ irinotes_build_dir: "{{playbook_dir}}/build/tmp/irinotes/"
+ backend_build_dir: "{{playbook_dir}}/build/tmp/irinotes/src"
+ client_dir: "{{playbook_dir}}/build/tmp/irinotes/client"
+ tasks:
+
+ - name: mkdir build folder
+ file:
+ path: "{{playbook_dir}}/build/tmp"
+ state: directory
+
+ - name: clear irinotes checkout dir if exists
+ file:
+ path: "{{irinotes_build_dir}}"
+ state: absent
+
+ - name: checkout irinotes
+ hg:
+ repo: "{{irinotes_repo}}"
+ version: "{{irinotes_version}}"
+ force: yes
+ dest: "{{irinotes_build_dir}}"
+
+ - name: make irinotes py package
+ command: python setup.py sdist chdir="{{backend_build_dir}}"
+
+#
+# all actions
+#
+- hosts: remote_backend
+ vars:
+ backend_build_dir: "{{playbook_dir}}/build/tmp/irinotes/src"
+ client_dir: "{{playbook_dir}}/build/tmp/irinotes/client"
+ tasks:
+
+ - name: get backend version
+ local_action: command python setup.py -V chdir="{{backend_build_dir}}"
+ register: backend_version
+
+ - name: get discussion package version
+ set_fact:
+ backend_pkg_version: "{{backend_version.stdout}}"
+
+#
+# Localhost actions
+#
+- hosts: localhost
+ connection: local
+ vars:
+ backend_build_dir: "{{playbook_dir}}/build/tmp/irinotes/src"
+ client_dir: "{{playbook_dir}}/build/tmp/irinotes/client"
+ tasks:
+
+# build client js
+ - name: remove build
+ file: path="{{client_dir}}/build" state=absent
+
+ - name: client yarn install
+ command: npm install --no-save yarn
+ args:
+ chdir: "{{client_dir}}"
+
+ - name: client dependencies install
+ command: npx yarn install
+ args:
+ chdir: "{{client_dir}}"
+
+ - name: client build
+ command: npx yarn build
+ args:
+ chdir: "{{client_dir}}"
+ environment:
+ REACT_APP_API_ROOT_URL: "{{api_root_url}}"
+ REACT_APP_BASENAME: "{{api_root_url}}"
+ REACT_APP_NETWORK_STATUS_INTERVAL: "{{network_status_interval}}"
+ REACT_APP_NETWORK_STATUS_TIMEOUT: "{{network_status_timeout}}"
+ REACT_APP_SYNC_INTERVAL: "{{sync_interval}}"
+
+#
+# Static server
+#
+- hosts: remote_static
+ become: yes
+ vars:
+ backend_build_dir: "{{playbook_dir}}/build/tmp/irinotes/src"
+ client_dir: "{{playbook_dir}}/build/tmp/irinotes/client"
+ tasks:
+
+ - name: create dest static directory content
+ file:
+ path: "{{remote_static_path}}"
+ state: directory
+ owner: "{{static_http_user}}"
+ group: "{{static_http_group}}"
+
+ - name: remove dest static directory content
+ command: /bin/rm -fr "{{remote_static_path}}/*" warn=False
+ when: remote_static_path != ""
+
+ - name: transfert static dist to remote
+ copy:
+ src: "{{client_dir}}/build/"
+ dest: "{{remote_static_path}}/"
+ owner: "{{static_http_user}}"
+ group: "{{static_http_group}}"
+ notify:
+ - restart static nginx
+
+ - name: create refresh nginx config
+ template:
+ src: "{{static_nginx_use_ssl | ternary('nginx.static.ssl.conf.j2', 'nginx.static.conf.j2')}}"
+ dest: "{{static_nginx_config | default('/etc/nginx/site-available/'+static_server_name, true)}}"
+ notify:
+ - restart static nginx
+
+ handlers:
+ - name: restart static nginx
+ service:
+ name: "{{static_http_service}}"
+ state: restarted
+ ignore_errors: yes
+
+#
+# backend servers
+#
+- hosts: remote_backend
+ become: yes
+ vars:
+ backend_build_dir: "{{playbook_dir}}/build/tmp/irinotes/src"
+ tasks:
+
+ - name: add iri group
+ group:
+ name: iri
+
+ - name: add uwsgi user
+ user:
+ name: uwsgi
+ group: iri
+ home: /var/www
+ create_home: no
+ system: yes
+ shell: /bin/false
+
+ - name: create log dir
+ file:
+ path: "{{log_base_path}}"
+ state: directory
+ owner: uwsgi
+ group: iri
+ mode: 0755
+
+ - name: create config dir
+ file:
+ path: "{{backend_config_base}}"
+ state: directory
+ owner: uwsgi
+ group: iri
+ mode: 0755
+
+ - name: create config dir requirements
+ file:
+ path: "{{backend_config_base}}/requirements"
+ state: directory
+ owner: uwsgi
+ group: iri
+ mode: 0755
+
+ - name: create static folder
+ file:
+ path: "{{backend_static_root}}"
+ state: directory
+ owner: uwsgi
+ group: iri
+ mode: 0755
+
+ - name: create media folder
+ file:
+ path: "{{backend_media_root}}"
+ state: directory
+ owner: uwsgi
+ group: iri
+ mode: 0755
+
+ - name: install backend venv
+ block:
+ - name: register backend virtualenv stats
+ stat: path="{{backend_venv}}"
+ register: backend_venv_stats
+
+ - name: copy backend base requirement file
+ copy:
+ src: "{{backend_build_dir}}/requirements/base.txt"
+ dest: "{{backend_config_base}}/requirements/base.txt"
+ register: copy_backend_requirements_base
+
+ - name: copy backend prod requirement file
+ copy:
+ src: "{{backend_build_dir}}/requirements/prod.txt"
+ dest: "{{backend_config_base}}/requirements/prod.txt"
+ register: copy_backend_requirements_prod
+
+
+ - name: remove annotation api venv
+ file:
+ path: "{{backend_venv}}"
+ state: absent
+ when: copy_backend_requirements_base.changed or copy_backend_requirements_prod.changed
+
+ - name: create backend virtualenv
+ pip:
+ virtualenv_command: /usr/bin/python3 -m venv
+ virtualenv: "{{backend_venv}}"
+ name: pip
+ state: latest
+ when: (copy_backend_requirements_base.changed or copy_backend_requirements_prod.changed) or (not backend_venv_stats.stat.exists)
+
+ - name: virtualenv install requirements
+ pip:
+ virtualenv: "{{backend_venv}}"
+ requirements: "{{backend_config_base}}/requirements/prod.txt"
+ when: (copy_backend_requirements_base.changed or copy_backend_requirements_prod.changed) or (not backend_venv_stats.stat.exists)
+ notify: restart irinotes backend service
+
+ - name: copy backend config
+ template:
+ src: "backend_settings.ini.j2"
+ dest: "{{backend_config_base}}/settings.ini"
+ notify: restart irinotes backend service
+
+ # install irinotes
+ - name: create temporary install directory
+ tempfile:
+ state: directory
+ suffix: build
+ register: backend_temp_folder
+
+ - name: copy irinotes backend build
+ copy:
+ src: "{{backend_build_dir}}/dist/irinotes-{{backend_pkg_version}}.tar.gz"
+ dest: "{{backend_temp_folder.path}}/irinotes-{{backend_pkg_version}}.tar.gz"
+
+ - name: virtualenv remove irinotes
+ pip:
+ virtualenv: "{{backend_venv}}"
+ name: irinotes
+ state: absent
+ notify: restart irinotes backend service
+
+ - name: virtualenv install irinotes
+ pip:
+ virtualenv: "{{backend_venv}}"
+ name: "file://{{backend_temp_folder.path}}/irinotes-{{backend_pkg_version}}.tar.gz"
+ notify: restart irinotes backend service
+
+ - name: irinotes migrate
+ command: "{{backend_venv}}/bin/django-admin migrate --noinput"
+ args:
+ chdir: "{{backend_venv}}"
+ environment:
+ DJANGO_SETTINGS_MODULE: "irinotes.settings"
+ IRINOTES_CONFIG_BASE: "{{backend_config_base}}"
+ become: yes
+ become_user: uwsgi
+ notify: restart irinotes backend service
+
+ - name: irinotes collectstatic
+ command: "{{backend_venv}}/bin/django-admin collectstatic --noinput -c"
+ args:
+ chdir: "{{backend_venv}}"
+ environment:
+ DJANGO_SETTINGS_MODULE: "irinotes.settings"
+ IRINOTES_CONFIG_BASE: "{{backend_config_base}}"
+ become: yes
+ become_user: uwsgi
+ notify: restart irinotes backend service
+
+ always:
+ - name: remove temp folder
+ file:
+ state: absent
+ path: "{{backend_temp_folder.path}}"
+ when: backend_temp_folder is defined
+
+
+ - name: copy backend uwsgi config
+ template:
+ src: "uwsgi_irinotes.yml.j2"
+ dest: "{{backend_config_base}}/uwsgi_irinotes.yml"
+ notify: restart irinotes backend service
+
+ - name: copy annotations api supervisor config
+ template:
+ src: "supervisord_irinotes_backend.ini.j2"
+ dest: "{{backend_supervisor_conf_path}}/irinotes_backend.ini"
+ notify: restart irinotes backend service
+
+ - name: Add uwsgi app (reread + add)
+ supervisorctl: name=irinotes_backend state=present
+
+ handlers:
+ - name: reload backend service supervisorctl
+ listen: "restart irinotes backend service"
+ supervisorctl:
+ name: irinotes_backend
+ state: restarted
+ ignore_errors: yes