diff --git a/CHANGELOG.md b/CHANGELOG.md index df243de..f354ece 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +- Add support for new NodeSource repository (Thanks to @stissot) + ## 10.1.22 - *2024-11-19* - Update default version to current LTS diff --git a/attributes/repo.rb b/attributes/repo.rb index b4cc4f8..9e888e2 100644 --- a/attributes/repo.rb +++ b/attributes/repo.rb @@ -2,15 +2,12 @@ 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 + node_version = platform?('amazon') ? '17.x' : '20.x' 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' + 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 d68149a..b5c3ae8 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/repo.rb b/recipes/repo.rb index 14b98e4..7c9d484 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 cdb307a..332fa06 100644 --- a/spec/unit/recipes/default_spec.rb +++ b/spec/unit/recipes/default_spec.rb @@ -58,7 +58,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 36565fb..8fb7a1f 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}'