deploy/deploy.yml
changeset 180 62bffc051e1c
child 182 2dbb6ddbf645
--- /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