diff -r e7c7e6e0a8bc -r 62bffc051e1c deploy/deploy.yml --- /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