197 lines
5.8 KiB
YAML
197 lines
5.8 KiB
YAML
---
|
|
- name: Detect packaged offline installation
|
|
ansible.builtin.set_fact:
|
|
nodejs_offline_active: "{{ lookup('ansible.builtin.env', 'AI_WORKSPACE_OFFLINE_ACTIVE') | default('false', true) | bool }}"
|
|
|
|
- name: Check Node.js version
|
|
command: node --version
|
|
register: node_version_check
|
|
changed_when: false
|
|
failed_when: false
|
|
check_mode: false
|
|
|
|
- name: Get Node.js version number
|
|
set_fact:
|
|
nodejs_installed_version: "{{ node_version_check.stdout | regex_replace('v', '') | default('') }}"
|
|
when: node_version_check.rc == 0
|
|
|
|
- name: Normalize Node.js version inputs
|
|
set_fact:
|
|
nodejs_version_major: "{{ nodejs_version | regex_replace('^([0-9]+).*', '\\1') }}"
|
|
nodejs_version_pin: "{{ nodejs_version if nodejs_version is match('^\\d+\\.\\d+\\.\\d+$') else '' }}"
|
|
|
|
- name: Get installed Node.js major version
|
|
set_fact:
|
|
nodejs_installed_major: "{{ nodejs_installed_version | regex_replace('^([0-9]+).*', '\\1') }}"
|
|
when: node_version_check.rc == 0
|
|
|
|
- name: Decide if Node.js installation is required
|
|
set_fact:
|
|
nodejs_needs_install: "{{ (nodejs_version_pin != '' and (nodejs_installed_version | default('')) != nodejs_version_pin) or (nodejs_version_pin == '' and (nodejs_installed_major | default('')) != nodejs_version_major) }}"
|
|
|
|
- name: Install prerequisites
|
|
apt:
|
|
name:
|
|
- curl
|
|
- wget
|
|
- gnupg
|
|
- ca-certificates
|
|
state: present
|
|
when: ansible_os_family != 'Darwin'
|
|
|
|
- name: Ensure apt keyrings directory exists
|
|
file:
|
|
path: /etc/apt/keyrings
|
|
state: directory
|
|
mode: '0755'
|
|
when: ansible_os_family != 'Darwin'
|
|
|
|
- name: Remove old NodeSource repository list files
|
|
file:
|
|
path: "{{ item }}"
|
|
state: absent
|
|
loop:
|
|
- /etc/apt/sources.list.d/nodesource.list
|
|
- "/etc/apt/sources.list.d/nodesource-node{{ nodejs_version_major }}.list"
|
|
- /etc/apt/keyrings/nodesource.gpg
|
|
when:
|
|
- nodejs_needs_install | default(true)
|
|
- not nodejs_offline_active
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Add NodeSource GPG key
|
|
get_url:
|
|
url: "https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key"
|
|
dest: /etc/apt/keyrings/nodesource.asc
|
|
mode: '0644'
|
|
register: nodesource_key
|
|
when:
|
|
- nodejs_needs_install | default(true)
|
|
- not nodejs_offline_active
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Add NodeSource repository
|
|
apt_repository:
|
|
repo: "deb [signed-by=/etc/apt/keyrings/nodesource.asc arch=amd64,arm64] https://deb.nodesource.com/node_{{ nodejs_version_major }}.x nodistro main"
|
|
state: present
|
|
filename: nodesource
|
|
register: nodesource_repo
|
|
when:
|
|
- nodejs_needs_install | default(true)
|
|
- not nodejs_offline_active
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Update apt cache for NodeSource repository
|
|
apt:
|
|
update_cache: yes
|
|
cache_valid_time: 3600
|
|
when:
|
|
- nodejs_needs_install | default(true)
|
|
- not nodejs_offline_active
|
|
- nodesource_key.changed or nodesource_repo.changed
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Install Node.js (exact version)
|
|
apt:
|
|
name:
|
|
- "{{ 'nodejs' if nodejs_offline_active else ('nodejs=' + nodejs_version_pin + '-1nodesource1' if nodejs_version_pin != '' else 'nodejs') }}"
|
|
state: present
|
|
allow_downgrade: true
|
|
update_cache: yes
|
|
when:
|
|
- nodejs_needs_install | default(true)
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Verify npm is available
|
|
command: npm --version
|
|
register: npm_version_check
|
|
changed_when: false
|
|
failed_when: false
|
|
check_mode: false
|
|
|
|
- name: Get current Yarn version
|
|
command: yarn --version
|
|
register: yarn_version_check
|
|
changed_when: false
|
|
failed_when: false
|
|
check_mode: false
|
|
when: install_yarn | default(true)
|
|
|
|
- name: Normalize desired Yarn version
|
|
set_fact:
|
|
yarn_desired_version: "{{ yarn_version | default('') }}"
|
|
when: install_yarn | default(true)
|
|
|
|
- name: Add Yarn GPG key
|
|
get_url:
|
|
url: https://dl.yarnpkg.com/debian/pubkey.gpg
|
|
dest: /etc/apt/keyrings/yarn.asc
|
|
mode: '0644'
|
|
when:
|
|
- install_yarn | default(true)
|
|
- yarn_desired_version | length == 0
|
|
- not nodejs_offline_active
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Add Yarn repository
|
|
apt_repository:
|
|
repo: "deb [signed-by=/etc/apt/keyrings/yarn.asc] https://dl.yarnpkg.com/debian/ stable main"
|
|
state: present
|
|
filename: yarn
|
|
when:
|
|
- install_yarn | default(true)
|
|
- yarn_desired_version | length == 0
|
|
- not nodejs_offline_active
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Install Yarn
|
|
apt:
|
|
name: yarn
|
|
state: present
|
|
update_cache: yes
|
|
when:
|
|
- install_yarn | default(true)
|
|
- yarn_desired_version | length == 0
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Enable Corepack
|
|
command: corepack enable
|
|
changed_when: false
|
|
when:
|
|
- install_yarn | default(true)
|
|
- yarn_desired_version | length > 0
|
|
|
|
- name: Install Yarn via Corepack
|
|
command: "corepack prepare yarn@{{ yarn_desired_version }} --activate"
|
|
when:
|
|
- install_yarn | default(true)
|
|
- yarn_desired_version | length > 0
|
|
- yarn_version_check.stdout != yarn_desired_version
|
|
|
|
- name: Set npm to use version tags by default
|
|
shell: npm config set save-exact true
|
|
args:
|
|
creates: "{{ ansible_env.HOME }}/.npmrc"
|
|
|
|
- name: Create npm global directory
|
|
file:
|
|
path: "{{ npm_config_prefix }}"
|
|
state: directory
|
|
mode: '0755'
|
|
|
|
- name: Add npm global bin to PATH
|
|
template:
|
|
src: npm_global.sh.j2
|
|
dest: /etc/profile.d/npm_global.sh
|
|
mode: '0644'
|
|
when:
|
|
- add_npm_to_path | default(true)
|
|
- ansible_os_family != 'Darwin'
|
|
|
|
- name: Verify installations
|
|
debug:
|
|
msg: |
|
|
Node.js version: {{ nodejs_installed_version | default('Not installed') }}
|
|
NPM version: {{ npm_version_check.stdout if npm_version_check.rc == 0 else 'N/A' }}
|
|
Yarn version: {{ yarn_version_check.stdout if yarn_version_check.rc == 0 and install_yarn | default(true) else 'Not installed' }}
|