01_setup.ymlΒΆ

---
- name: βœ… Ensure shared Playwright project dir exists
  ansible.builtin.file:
    path: "{{ TEST_E2E_PLAYWRIGHT_SHARED_DIR }}"
    state: directory
    mode: "0755"

- name: πŸ“„ Render shared package.json from central template
  ansible.builtin.template: # nocheck: stack-host-template (per-host playwright stage dir, runs on every test host)
    src: "{{ lookup('path_absolute', 'roles/test-e2e-playwright/templates/package.json.j2') }}"
    dest: "{{ TEST_E2E_PLAYWRIGHT_SHARED_DIR }}/package.json"
    mode: "0644"

- name: πŸ“¦ Pack the persona flows for a single transfer
  ansible.builtin.command:
    cmd: >-
      tar -cf {{ TEST_E2E_PLAYWRIGHT_PERSONAS_ARCHIVE | quote }}
      -C {{ lookup('path_absolute', 'roles/test-e2e-playwright/files/personas') | quote }} .
  delegate_to: localhost
  become: false
  changed_when: false

- name: πŸ“¦ Pack the shared Playwright helpers for a single transfer per role
  ansible.builtin.command:
    argv: >-
      {{
        ['tar', '-cf', TEST_E2E_PLAYWRIGHT_HELPERS_ARCHIVE, '-C', TEST_E2E_PLAYWRIGHT_HELPERS_DIR]
        + (query('fileglob', TEST_E2E_PLAYWRIGHT_HELPERS_DIR ~ '/*.js')
           | map('basename') | reject('equalto', 'playwright.config.js') | list)
      }}
  delegate_to: localhost
  become: false
  changed_when: false

- name: βœ… Ensure the shared personas dir exists
  ansible.builtin.file:
    path: "{{ TEST_E2E_PLAYWRIGHT_SHARED_PERSONAS }}"
    state: directory
    mode: "0755"

- name: πŸ“‹ Stage the persona flows once for every role of this run
  ansible.builtin.unarchive:
    src: "{{ TEST_E2E_PLAYWRIGHT_PERSONAS_ARCHIVE }}"
    dest: "{{ TEST_E2E_PLAYWRIGHT_SHARED_PERSONAS }}/"

- name: πŸ” Probe shared install stamp
  ansible.builtin.stat:
    path: "{{ TEST_E2E_PLAYWRIGHT_SHARED_STAMP }}"
  register: _playwright_shared_stamp_stat

- name: πŸ“– Read shared install stamp
  ansible.builtin.slurp:
    src: "{{ TEST_E2E_PLAYWRIGHT_SHARED_STAMP }}"
  register: _playwright_shared_stamp_content
  when: _playwright_shared_stamp_stat.stat.exists

- name: πŸ€” Decide whether the shared install is up to date
  ansible.builtin.set_fact:
    _playwright_shared_install_needed: >-
      {{
        (not _playwright_shared_stamp_stat.stat.exists)
        or ((_playwright_shared_stamp_content.content | default('') | b64decode | trim)
            != TEST_E2E_PLAYWRIGHT_INSTALL_STAMP)
      }}

- name: ⬇️ Pull the Playwright image once for every role of this run
  ansible.builtin.command:
    argv:
      - timeout
      - -k
      - "60"
      - "{{ lookup('timeout', 1800) | int }}"
      - container
      - pull
      - "{{ TEST_E2E_PLAYWRIGHT_IMAGE }}"
  register: _playwright_shared_pull
  changed_when: false
  failed_when: false
  retries: 3
  delay: 5
  until: _playwright_shared_pull.rc == 0

- name: πŸ”§ Provision the shared Playwright install (npm install + stamp)
  when: _playwright_shared_install_needed | bool
  block:
    - name: πŸ“¦ Install @playwright/test and @axe-core/playwright into the shared dir
      ansible.builtin.command:
        argv:
          - container
          - run
          - --rm
          - -v
          - "{{ TEST_E2E_PLAYWRIGHT_SHARED_DIR }}:/shared"
          - -w
          - /shared
          - "{{ TEST_E2E_PLAYWRIGHT_IMAGE }}"
          - /bin/bash
          - -lc
          - >-
            npm install --no-fund --no-audit --prefer-offline
            --fetch-retries 5
            --fetch-retry-mintimeout 10000
            --fetch-retry-maxtimeout 60000
      register: _playwright_shared_install
      changed_when: _playwright_shared_install.rc == 0
      retries: 3
      delay: 5
      until: _playwright_shared_install.rc == 0

    - name: ✏️ Write shared install stamp
      ansible.builtin.copy:
        dest: "{{ TEST_E2E_PLAYWRIGHT_SHARED_STAMP }}"
        content: "{{ TEST_E2E_PLAYWRIGHT_INSTALL_STAMP }}"
        mode: "0644"