From 431a1110b7aed77dd32ed128c1e70438e277c1d4 Mon Sep 17 00:00:00 2001 From: Dan Webb Date: Tue, 19 Nov 2024 11:19:42 +0000 Subject: [PATCH] Add support for new NodeSource repository Signed-off-by: Dan Webb --- .github/workflows/ci.yml | 6 +--- CHANGELOG.md | 4 +++ attributes/packages.rb | 2 +- attributes/repo.rb | 16 ++++----- recipes/nodejs_from_package.rb | 1 + recipes/nodejs_from_source.rb | 18 ++-------- recipes/repo.rb | 45 ++++++++++++++++++++----- spec/unit/recipes/default_spec.rb | 18 ++++++---- test/cookbooks/test/recipes/resource.rb | 12 +++++++ 9 files changed, 76 insertions(+), 46 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2e868c68..98cd71fb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,14 +23,12 @@ jobs: matrix: os: - "almalinux-9" + - "rockylinux-9" - "amazonlinux-2023" - "centos-stream-9" - "centos-stream-10" - "debian-11" - "debian-12" - - "fedora-latest" - - "opensuse-leap-15" - - "rockylinux-8" - "ubuntu-2204" - "ubuntu-2404" suite: @@ -43,8 +41,6 @@ jobs: suite: "source" - os: "fedora-latest" suite: "source" - - os: "opensuse-leap-15" - suite: "source" fail-fast: false steps: diff --git a/CHANGELOG.md b/CHANGELOG.md index df243de9..44b0e575 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Unreleased +- Add support for new NodeSource repository (Thanks to @stissot) +- Rework source install packages +- Update SUSE packages + ## 10.1.22 - *2024-11-19* - Update default version to current LTS diff --git a/attributes/packages.rb b/attributes/packages.rb index 4de51cac..1237ef04 100644 --- a/attributes/packages.rb +++ b/attributes/packages.rb @@ -4,7 +4,7 @@ default['nodejs']['packages'] = value_for_platform_family( 'debian' => node['nodejs']['install_repo'] ? ['nodejs'] : %w(nodejs npm nodejs-dev), %w(rhel fedora amazon) => node['nodejs']['install_repo'] ? %w(nodejs nodejs-devel) : %w(nodejs npm nodejs-dev), - 'suse' => node['platform_version'].to_i < 42 ? %w(nodejs10 npm10 nodejs10-devel) : %w(nodejs4 npm4 nodejs4-devel), + 'suse' => %w(nodejs npm nodejs-devel), 'mac_os_x' => ['node'], 'freebsd' => %w(node npm), 'default' => ['nodejs'] diff --git a/attributes/repo.rb b/attributes/repo.rb index b4cc4f82..ae98dac6 100644 --- a/attributes/repo.rb +++ b/attributes/repo.rb @@ -2,15 +2,11 @@ when 'debian' default['nodejs']['install_repo'] = true default['nodejs']['repo'] = 'https://deb.nodesource.com/node_20.x' - default['nodejs']['keyserver'] = 'keyserver.ubuntu.com' - default['nodejs']['key'] = '1655a0ab68576280' -when 'rhel', 'amazon' + default['nodejs']['distribution'] = 'nodistro' + default['nodejs']['key'] = 'https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key' +when 'rhel', 'amazon', 'fedora' default['nodejs']['install_repo'] = true - release_ver = platform?('amazon') ? 7 : node['platform_version'].to_i - default['nodejs']['repo'] = "https://rpm.nodesource.com/pub_20.x/el/#{release_ver}/$basearch" - default['nodejs']['key'] = 'https://rpm.nodesource.com/pub/el/NODESOURCE-GPG-SIGNING-KEY-EL' -when 'fedora' - default['nodejs']['install_repo'] = true - default['nodejs']['repo'] = 'https://rpm.nodesource.com/pub_20.x/el/9/$basearch' - default['nodejs']['key'] = 'https://rpm.nodesource.com/pub/el/NODESOURCE-GPG-SIGNING-KEY-EL' + node_version = platform?('amazon') ? '17.x' : '20.x' + default['nodejs']['repo'] = "https://rpm.nodesource.com/pub_#{node_version}/nodistro/nodejs/$basearch" + default['nodejs']['key'] = 'https://rpm.nodesource.com/gpgkey/ns-operations-public.key' end diff --git a/recipes/nodejs_from_package.rb b/recipes/nodejs_from_package.rb index d68149a8..b5c3ae80 100644 --- a/recipes/nodejs_from_package.rb +++ b/recipes/nodejs_from_package.rb @@ -31,6 +31,7 @@ if platform_family?('rhel', 'fedora') && node['platform_version'].to_i >= 8 && !node['nodejs']['dnf_module'] dnf_module 'nodejs' do action :disable + only_if 'dnf module list nodejs' end end diff --git a/recipes/nodejs_from_source.rb b/recipes/nodejs_from_source.rb index 8bb1033a..19bc2f10 100644 --- a/recipes/nodejs_from_source.rb +++ b/recipes/nodejs_from_source.rb @@ -22,25 +22,13 @@ build_essential 'install build tools' -case node['platform'] +case node['platform_family'] when 'rhel', 'fedora', 'amazon' - # The ark resource uses and requires python2 for builds package %w(openssl-devel python3 tar) -# debian-12 & ubuntu 2204 need python 3 when 'debian' - if node['platform_version'].to_i >= 12 - package %w(libssl-dev python3) - else - package %w(libssl-dev python) - end -when 'ubuntu' - if node['platform_version'].to_f >= 22.04 - package %w(libssl-dev python3) - else - package %w(libssl-dev python) - end + package %w(libssl-dev python3) else - package %w(python) + package %w(python3) end version = "v#{node['nodejs']['version']}/" diff --git a/recipes/repo.rb b/recipes/repo.rb index 14b98e4e..7c9d484b 100644 --- a/recipes/repo.rb +++ b/recipes/repo.rb @@ -1,19 +1,48 @@ case node['platform_family'] when 'debian' - package 'nodejs-apt-transport-https' do - package_name 'apt-transport-https' + # Install necessary packages for downloading and verifying new repository information + package %w(ca-certificates curl gnupg apt-transport-https) + + # Create a directory for the new repository's keyring, if it doesn't exist + directory '/etc/apt/keyrings' + + # Download the new repository's GPG key and save it in the keyring directory + execute 'add nodejs gpg key' do + command "curl -fsSL #{node['nodejs']['key']} | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg" + not_if { ::File.exist? '/etc/apt/keyrings/nodesource.gpg' } end - apt_repository 'node.js' do - uri node['nodejs']['repo'] - components ['main'] - keyserver node['nodejs']['keyserver'] - key node['nodejs']['key'] + # Prefer nodesource over Ubuntu universe packages by giving a higher priority (default 500) + apt_preference 'nodesource' do + glob '*' + pin 'origin deb.nodesource.com' + pin_priority '600' end + + if Chef::VERSION >= Gem::Version.new('18.3.0') + apt_repository 'nodesource' do + uri node['nodejs']['repo'] + components ['main'] + options ['signed-by=/etc/apt/keyrings/nodesource.gpg'] + distribution node['nodejs']['distribution'] + end + else + # Chef Infra < 18.3 doesn't support options attribute, fallback to (deprecated) apt-key method + apt_repository 'nodesource' do + uri node['nodejs']['repo'] + components ['main'] + key '2F59B5F99B1BE0B4' + keyserver 'keyserver.ubuntu.com' + distribution node['nodejs']['distribution'] + end + end + when 'rhel', 'fedora', 'amazon' - yum_repository 'node.js' do + yum_repository 'nodesource-nodejs' do description 'nodesource.com nodejs repository' baseurl node['nodejs']['repo'] gpgkey node['nodejs']['key'] + priority '9' + options(module_hotfixes: 1) end end diff --git a/spec/unit/recipes/default_spec.rb b/spec/unit/recipes/default_spec.rb index cdb307ab..2a2f25ac 100644 --- a/spec/unit/recipes/default_spec.rb +++ b/spec/unit/recipes/default_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' -describe 'default recipe on ubuntu 20.04' do - let(:runner) { ChefSpec::ServerRunner.new(platform: 'ubuntu', version: '20.04') } +describe 'default recipe on ubuntu 22.04' do + let(:runner) { ChefSpec::ServerRunner.new(platform: 'ubuntu', version: '22.04') } let(:chef_run) { runner.converge('nodejs::default') } it 'includes the package install recipes' do @@ -14,11 +14,12 @@ end end -describe 'default recipe on centos 7' do - let(:runner) { ChefSpec::ServerRunner.new(platform: 'centos', version: '7') } +describe 'default recipe on centos 8' do + let(:runner) { ChefSpec::ServerRunner.new(platform: 'centos', version: '8') } let(:chef_run) { runner.converge('nodejs::default') } it 'includes the package install recipes' do + stub_command('dnf module list nodejs').and_return(0) expect(chef_run).to include_recipe('nodejs::nodejs_from_package') expect(chef_run).to include_recipe('nodejs::npm_packages') end @@ -28,8 +29,8 @@ end end -describe 'default recipe on debian 10' do - let(:runner) { ChefSpec::ServerRunner.new(platform: 'debian', version: '10') } +describe 'default recipe on debian 12' do + let(:runner) { ChefSpec::ServerRunner.new(platform: 'debian', version: '12') } let(:chef_run) { runner.converge('nodejs::default') } it 'includes the package install recipes' do @@ -58,7 +59,10 @@ describe 'default recipe on fedora' do let(:runner) { ChefSpec::ServerRunner.new(platform: 'fedora') } - let(:chef_run) { runner.converge('nodejs::default') } + let(:chef_run) do + stub_command('dnf module list nodejs').and_return(0) + runner.converge('nodejs::default') + end it 'includes the package install recipes' do expect(chef_run).to include_recipe('nodejs::nodejs_from_package') diff --git a/test/cookbooks/test/recipes/resource.rb b/test/cookbooks/test/recipes/resource.rb index 36565fb5..8fb7a1f7 100644 --- a/test/cookbooks/test/recipes/resource.rb +++ b/test/cookbooks/test/recipes/resource.rb @@ -57,6 +57,10 @@ user 'random2' end +directory '/home/random2/.npm' do + owner 'random2' +end + npm_package 'Install the grunt package' do path '/home/random2' package 'grunt' @@ -71,6 +75,10 @@ user 'random2' end +directory '/home/random/.npm' do + owner 'random' +end + # Create a package.json file for the test user template '/home/random/package.json' do source 'package.json' @@ -94,6 +102,10 @@ node_env 'staging' # Test node_env usage end +directory '/home/random1/.npm' do + owner 'random1' +end + # Create an .npmrc file for the test user file '/home/random1/.npmrc' do content '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'