diff --git a/tasks/cleanup.yml b/tasks/cleanup.yml index 3231194..991d349 100644 --- a/tasks/cleanup.yml +++ b/tasks/cleanup.yml @@ -1,5 +1,15 @@ --- -# Clean up releases +- name: ANSISTRANO | Gather releases + find: + paths: "{{ ansistrano_releases_path }}" + file_type: directory + recurse: false + register: ansistrano_releases + when: ansistrano_keep_releases | int > 0 + - name: ANSISTRANO | Clean up releases - shell: ls -1dt {{ ansistrano_releases_path }}/* | tail -n +{{ ansistrano_keep_releases | int + 1 }} | xargs rm -rf + file: + path: "{{ item.path }}" + state: absent + loop: "{{ (ansistrano_releases.files | sort(attribute='mtime', reverse=true))[ansistrano_keep_releases | int:] }}" when: ansistrano_keep_releases | int > 0 diff --git a/tasks/update-code/unarchive.yml b/tasks/update-code/unarchive.yml index 6d42735..9c79325 100644 --- a/tasks/update-code/unarchive.yml +++ b/tasks/update-code/unarchive.yml @@ -1,32 +1,22 @@ --- - name: ANSISTRANO | Unarchive | Unarchive source - unarchive: - copy: no - src: "{{ ansistrano_archived_file }}" - dest: "{{ ansistrano_release_path.stdout }}" - exclude: "{{ ansistrano_unarchive_exclude }}" - extra_opts: "{{ ansistrano_unarchive_extra_opts }}" - when: ansistrano_unarchive_owner == "default" and ansistrano_unarchive_group == "default" - -- name: ANSISTRANO | Unarchive | Unarchive source - fail: - msg: "must set ansistrano_unarchive_group and ansistrano_unarchive_owner" + assert: + that: + - (ansistrano_unarchive_owner == "default") == (ansistrano_unarchive_group == "default") + fail_msg: "must set ansistrano_unarchive_group and ansistrano_unarchive_owner" when: > - (ansistrano_unarchive_owner == "default" and ansistrano_unarchive_group != "default") or - (ansistrano_unarchive_owner != "default" and ansistrano_unarchive_group == "default") + ansistrano_unarchive_owner == "default" or + ansistrano_unarchive_group == "default" -- name: ANSISTRANO | Unarchive | Unarchive source with owner and group +- name: ANSISTRANO | Unarchive | Unarchive source unarchive: copy: no src: "{{ ansistrano_archived_file }}" dest: "{{ ansistrano_release_path.stdout }}" - owner: "{{ ansistrano_unarchive_owner }}" - group: "{{ ansistrano_unarchive_group }}" + owner: "{{ ansistrano_unarchive_owner if ansistrano_unarchive_owner != 'default' else omit }}" + group: "{{ ansistrano_unarchive_group if ansistrano_unarchive_group != 'default' else omit }}" exclude: "{{ ansistrano_unarchive_exclude }}" extra_opts: "{{ ansistrano_unarchive_extra_opts }}" - when: > - ansistrano_unarchive_owner != "default" and - ansistrano_unarchive_group != "default" - name: ANSISTRANO | Unarchive | Delete archived file file: diff --git a/test/rsync-test.yml b/test/rsync-test.yml index 04d734a..63bf550 100644 --- a/test/rsync-test.yml +++ b/test/rsync-test.yml @@ -69,6 +69,58 @@ roles: - { role: local-ansistrano } +- name: When deploying with release cleanup enabled + hosts: all + vars: + ansistrano_deploy_to: "/tmp/cleanup-my-app.com" + pre_tasks: + - name: Set the first fixed release version + set_fact: + ansistrano_release_version: "20000101000000Z" + ansistrano_keep_releases: 1 + roles: + - { role: local-ansistrano } + +- name: And deploying a newer release with release cleanup enabled + hosts: all + vars: + ansistrano_deploy_to: "/tmp/cleanup-my-app.com" + pre_tasks: + - name: Set the second fixed release version + set_fact: + ansistrano_release_version: "20000101000001Z" + ansistrano_keep_releases: 1 + roles: + - { role: local-ansistrano } + +- name: Then only the newest release should remain + hosts: all + vars: + ansistrano_deploy_to: "/tmp/cleanup-my-app.com" + tasks: + - name: Assert the oldest release was removed + stat: + path: "{{ ansistrano_deploy_to }}/releases/20000101000000Z" + register: old_release + + - name: Assert the newest release still exists + stat: + path: "{{ ansistrano_deploy_to }}/releases/20000101000001Z" + register: new_release + + - name: Assert current points to the newest release + stat: + path: "{{ ansistrano_deploy_to }}/current" + register: current_release + + - name: Assert old release was removed and newest release kept + assert: + that: + - old_release.stat.exists is defined and not old_release.stat.exists + - new_release.stat.exists is defined and new_release.stat.exists + - current_release.stat.islnk is defined and current_release.stat.islnk + - current_release.stat.lnk_target == "./releases/20000101000001Z" + - name: When deploying fails before symlink hosts: all vars: