diff --git a/ansible/inventory.yml b/ansible/inventory.yml index 3247e5247..b24ed10e9 100644 --- a/ansible/inventory.yml +++ b/ansible/inventory.yml @@ -152,6 +152,9 @@ hosts: rhel7-s390x-2: {ip: 148.100.86.117, user: linux1, build_test_v8: yes} rhel7-s390x-3: {ip: 148.100.86.28, user: linux1, build_test_v8: yes} rhel7-s390x-4: {ip: 148.100.86.94, user: linux1, build_test_v8: yes} + rhel8-s390x-1: {ip: 148.100.84.112, user: linux1, build_test_v8: yes} + rhel8-s390x-2: {ip: 148.100.84.240, user: linux1, build_test_v8: yes} + rhel8-s390x-3: {ip: 148.100.84.56, user: linux1, build_test_v8: yes} ubuntu1804-x64-1: {ip: 52.117.26.14, alias: jenkins-workspace-6} ubuntu1804-x64-2: {ip: 50.97.245.9} diff --git a/ansible/roles/baselayout/tasks/main.yml b/ansible/roles/baselayout/tasks/main.yml index f7cb77c01..7e74b2d55 100644 --- a/ansible/roles/baselayout/tasks/main.yml +++ b/ansible/roles/baselayout/tasks/main.yml @@ -141,6 +141,16 @@ state: link src: "/usr/local/bin/python2" +# Required for V8 builds +- name: rhel8 | update python package alternatives + community.general.alternatives: + link: /usr/bin/python + name: python + path: /usr/bin/python2 + when: + - os == "rhel8" + - build_test_v8|default(False) + - name: smartos17 | update gcc symlinks when: os == "smartos17" file: diff --git a/ansible/roles/baselayout/tasks/partials/repo/rhel8.yml b/ansible/roles/baselayout/tasks/partials/repo/rhel8.yml new file mode 100644 index 000000000..094696678 --- /dev/null +++ b/ansible/roles/baselayout/tasks/partials/repo/rhel8.yml @@ -0,0 +1,14 @@ +--- + +# Red Hat Enterprise Linux 8 + +- name: install GPG key for EPEL 8 + become: yes + ansible.builtin.rpm_key: + key: https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8 + state: present + +- name: install EPEL 8 + ansible.builtin.dnf: + name: https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm + state: present diff --git a/ansible/roles/baselayout/vars/main.yml b/ansible/roles/baselayout/vars/main.yml index fb7ef11e2..9ba2cfd12 100644 --- a/ansible/roles/baselayout/vars/main.yml +++ b/ansible/roles/baselayout/vars/main.yml @@ -144,6 +144,14 @@ packages: { 'gcc-c++,sudo,git,zip,unzip,iptables-services,GConf2-devel,openssl-devel,python3', ], + rhel8_s390x: [ + 'GConf2-devel,python2' # Needed for V8 builds + ], + + rhel8: [ + 'ccache,cmake,gcc-c++,gcc-toolset-11,git,make,python3', + ], + smartos: [ 'gccmakedep', 'git', diff --git a/ansible/roles/bootstrap/handlers/main.yml b/ansible/roles/bootstrap/handlers/main.yml new file mode 100644 index 000000000..1aa2ad684 --- /dev/null +++ b/ansible/roles/bootstrap/handlers/main.yml @@ -0,0 +1,4 @@ +- name: restart iptables + ansible.builtin.service: + name: iptables + state: restarted diff --git a/ansible/roles/bootstrap/tasks/main.yml b/ansible/roles/bootstrap/tasks/main.yml index c10e878a5..f457a43f4 100644 --- a/ansible/roles/bootstrap/tasks/main.yml +++ b/ansible/roles/bootstrap/tasks/main.yml @@ -10,6 +10,7 @@ loop_var: bootstrap_include with_first_found: - files: + - "{{ role_path }}/tasks/partials/{{ os }}-{{ arch }}.yml" - "{{ role_path }}/tasks/partials/{{ os }}.yml" - "{{ role_path }}/tasks/partials/{{ os|stripversion }}.yml" skip: true diff --git a/ansible/roles/bootstrap/tasks/partials/rhel8-s390x.yml b/ansible/roles/bootstrap/tasks/partials/rhel8-s390x.yml new file mode 100644 index 000000000..42fb155f6 --- /dev/null +++ b/ansible/roles/bootstrap/tasks/partials/rhel8-s390x.yml @@ -0,0 +1,42 @@ +--- + +# Red Hat Enterprise Linux 8 on s390x (LinuxONE) + +- name: run common RHEL 8 tasks + ansible.builtin.include_tasks: rhel8.yml + +- name: Firewall | install iptables-services + ansible.builtin.dnf: + name: iptables-services + state: present + +- name: Firewall | enable iptables + ansible.builtin.systemd: + enabled: yes + name: iptables + +- name: Firewall | remove firewalld + ansible.builtin.dnf: + name: firewalld + state: absent + +- name: Firewall | add rule to allow accepting multicast + lineinfile: + dest: /etc/sysconfig/iptables + insertafter: ":OUTPUT ACCEPT.*]" + line: "-A INPUT -m pkttype --pkt-type multicast -j ACCEPT" + notify: restart iptables + +- name: Firewall | add basic rule to allow communication locally + lineinfile: + dest: /etc/sysconfig/iptables + insertafter: ":OUTPUT ACCEPT.*]" + line: "-A INPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -j ACCEPT" + notify: restart iptables + +- name: Firewall | add additional rule to allow communication from 127.0.0.2 + lineinfile: + dest: /etc/sysconfig/iptables + insertafter: ":OUTPUT ACCEPT.*]" + line: "-A INPUT -s 127.0.0.2/32 -d 127.0.0.1/32 -j ACCEPT" + notify: restart iptables diff --git a/ansible/roles/bootstrap/tasks/partials/rhel8.yml b/ansible/roles/bootstrap/tasks/partials/rhel8.yml new file mode 100644 index 000000000..2be829594 --- /dev/null +++ b/ansible/roles/bootstrap/tasks/partials/rhel8.yml @@ -0,0 +1,9 @@ +--- + +# Red Hat Enterprise Linux 8 + +- name: register Red Hat subscription + community.general.redhat_subscription: + activationkey: "{{ type }}" + org_id: "{{ rh_org }}" + state: present diff --git a/ansible/roles/gn/tasks/main.yml b/ansible/roles/gn/tasks/main.yml index d1f8337e8..875aaa964 100644 --- a/ansible/roles/gn/tasks/main.yml +++ b/ansible/roles/gn/tasks/main.yml @@ -8,6 +8,7 @@ ansible.builtin.git: dest: "{{ gn_git_dir }}" repo: "https://gn.googlesource.com/gn" + version: "{{ gn_version|default(omit) }}" become: "{{ gn_user|default(omit)|bool }}" become_user: "{{ gn_user|default(omit) }}" register: gn_git @@ -23,7 +24,7 @@ - name: build gn ansible.builtin.shell: | python3 build/gen.py && \ - . /opt/rh/devtoolset-8/enable && \ + {{ gn_select_compiler }} && \ {{ gn_dest_dir }}/ninja -C out && \ out/gn_unittests args: diff --git a/ansible/roles/gn/vars/main.yml b/ansible/roles/gn/vars/main.yml new file mode 100644 index 000000000..909a5bd19 --- /dev/null +++ b/ansible/roles/gn/vars/main.yml @@ -0,0 +1,12 @@ +--- + +compiler: { + 'centos7': '. /opt/rh/devtoolset-8/enable', + 'rhel7': '. /opt/rh/devtoolset-8/enable', + 'rhel8': '. /opt/rh/gcc-toolset-11/enable' +} + +gn_select_compiler: "{{ compiler[os]|default(compiler[os|stripversion])|default('true') }}" +# Pin gn for now so we can still build older versions of V8 in Node.js 14. +# Refs: https://github.com/nodejs/node/pull/40689#issuecomment-956303875 +gn_version: 69ec4fc diff --git a/ansible/roles/java-base/tasks/main.yml b/ansible/roles/java-base/tasks/main.yml index d84716440..bc1fe57c4 100644 --- a/ansible/roles/java-base/tasks/main.yml +++ b/ansible/roles/java-base/tasks/main.yml @@ -31,6 +31,7 @@ # as appropriate -- try to use generic os family if available. - name: Check if java is already installed + changed_when: no check_mode: no raw: "{{ java_path[os] | default(\"java\") }} -version" register: java diff --git a/ansible/roles/java-base/vars/main.yml b/ansible/roles/java-base/vars/main.yml index cf29e156b..4949f8247 100644 --- a/ansible/roles/java-base/vars/main.yml +++ b/ansible/roles/java-base/vars/main.yml @@ -15,6 +15,7 @@ packages: { 'ibmi': 'openjdk-11-ea', 'macos': 'adoptopenjdk8', 'rhel7': 'java-1.8.0-openjdk', + 'rhel8': 'java-17-openjdk', 'smartos': 'openjdk8', 'ubuntu': 'openjdk-8-jre-headless', 'ubuntu1404': 'oracle-java8-installer', diff --git a/ansible/roles/jenkins-worker/handlers/main.yml b/ansible/roles/jenkins-worker/handlers/main.yml new file mode 100644 index 000000000..8c9454f4a --- /dev/null +++ b/ansible/roles/jenkins-worker/handlers/main.yml @@ -0,0 +1,15 @@ +--- + +# +# generic handlers for baselayout stuff +# + +- name: restart Jenkins + ansible.builtin.service: + name: jenkins + state: restarted + when: + - not os|startswith("aix") + - not os|startswith("ibmi") + - not os|startswith("macos") + - not os|startswith("zos") diff --git a/ansible/roles/jenkins-worker/tasks/main.yml b/ansible/roles/jenkins-worker/tasks/main.yml index 28ab3f188..2e4e38357 100644 --- a/ansible/roles/jenkins-worker/tasks/main.yml +++ b/ansible/roles/jenkins-worker/tasks/main.yml @@ -131,6 +131,7 @@ mode: 0644 timeout: 60 force: yes + notify: restart Jenkins - name: Resolver | ipnodes needs to be present on zos, similar to hosts file when: os|startswith("zos") @@ -208,6 +209,7 @@ shell: "sh {{ home }}/{{ server_user }}/gen_runAsciiBash.sh" - name: render init script into place + notify: restart Jenkins template: src: "{{ jenkins.src }}" dest: "{{ jenkins.dest }}" @@ -329,17 +331,38 @@ when: os|startswith("zos13") command: "chown -R {{ server_user }} {{ home }}/{{ server_user }}/gyp" +# Referenced by CI jobs ("Path of the reference repo to use during clone"). +# This should probably be done on all hosts but the mirrored clone is 1.2G +# so for now restricted to places we know have enough space. +- name: create git reference repository + file: + path: "{{ home }}/{{ server_user }}/git/io.js.reference" + state: directory + owner: "{{ server_user }}" + group: "{{ server_user }}" + mode: 0755 + register: gitreference + when: os == 'rhel8' + +- name: populate git reference repository + become: yes + become_user: "{{ server_user }}" + command: "git clone https://github.com/nodejs/node.git --mirror {{ home }}/{{ server_user }}/git/io.js.reference" + when: gitreference.changed + # This has to be done before the `service` (and similar) commands because # java is needed to start the service - name: enable jenkins at startup - general + ansible.builtin.service: + name: jenkins + enabled: yes when: - not os|startswith("aix") - not os|startswith("ibmi") - not os|startswith("macos") - not os|startswith("zos") - service: name=jenkins state=restarted enabled=yes - name: Unload org.nodejs.osx.jenkins.plist from launchctl when: os|startswith("macos") diff --git a/ansible/roles/jenkins-worker/vars/main.yml b/ansible/roles/jenkins-worker/vars/main.yml index 9c12d88f4..b9fe350cb 100644 --- a/ansible/roles/jenkins-worker/vars/main.yml +++ b/ansible/roles/jenkins-worker/vars/main.yml @@ -12,7 +12,7 @@ init: { ibmi: 'ibmi73', macos: 'macos', rhel7: 'rhel7', - systemd: ['centos7', 'debian8', 'debian9', 'debian10', 'fedora', 'ubuntu1604', 'ubuntu1804'], + systemd: ['centos7', 'debian8', 'debian9', 'debian10', 'fedora', 'rhel8', 'ubuntu1604', 'ubuntu1804'], svc: 'smartos', upstart: ['ubuntu12', 'ubuntu1404'], zos_start: 'zos' diff --git a/ansible/roles/package-upgrade/vars/main.yml b/ansible/roles/package-upgrade/vars/main.yml index 186cfcb34..592441387 100644 --- a/ansible/roles/package-upgrade/vars/main.yml +++ b/ansible/roles/package-upgrade/vars/main.yml @@ -7,7 +7,7 @@ pm: { 'yum': ['centos', 'rhel7', 'aix', 'ibmi'], 'apt': ['debian', 'ubuntu'], - 'dnf': 'fedora', + 'dnf': ['fedora', 'rhel8'], 'pkg': 'freebsd', 'pkgin': 'smartos', 'chocolatey': 'win', diff --git a/jenkins/scripts/VersionSelectorScript.groovy b/jenkins/scripts/VersionSelectorScript.groovy index ba20598b6..cf43db153 100644 --- a/jenkins/scripts/VersionSelectorScript.groovy +++ b/jenkins/scripts/VersionSelectorScript.groovy @@ -30,6 +30,9 @@ def buildExclusions = [ [ /debian8-x86/, anyType, gte(10) ], // 32-bit linux for <10 only [ /debian8/, anyType, gte(13) ], [ /debian9/, anyType, gte(16) ], + [ /rhel7/, releaseType, gte(18) ], + [ /rhel8/, releaseType, lt(18) ], + [ /rhel8/, anyType, lt(14) ], [ /^ubuntu1804/, anyType, lt(10) ], // probably temporary [ /^ubuntu1404-32/, anyType, gte(10) ], // 32-bit linux for <10 only [ /^ubuntu1404-64/, anyType, gte(12) ], diff --git a/jenkins/scripts/select-compiler.sh b/jenkins/scripts/select-compiler.sh index 927c15141..325fe9a1c 100644 --- a/jenkins/scripts/select-compiler.sh +++ b/jenkins/scripts/select-compiler.sh @@ -32,6 +32,17 @@ if [ -z ${NODEJS_MAJOR_VERSION+x} ]; then NODEJS_MAJOR_VERSION="$(echo "$NODE_VERSION" | cut -d . -f 1)" fi +# Linux distros should be arch agnostic +case $NODE_NAME in + *rhel8*) + # TODO: add LTO + echo "Setting compiler for Node.js $NODEJS_MAJOR_VERSION on " `cat /etc/redhat-release` + # Default gcc on RHEL 8 is gcc 8 + echo "Compiler left as system default:" `g++ -dumpversion` + return + ;; +esac + if [ "$SELECT_ARCH" = "PPC64LE" ]; then # Set default export COMPILER_LEVEL="4.8"