2020-07-21 12:09:30 +00:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module QA
|
2022-01-18 18:11:20 +00:00
|
|
|
RSpec.describe 'Package Registry', :orchestrated, :packages, :object_storage do
|
2021-10-29 03:12:09 +00:00
|
|
|
describe 'npm instance level endpoint' do
|
2021-09-13 09:11:26 +00:00
|
|
|
using RSpec::Parameterized::TableSyntax
|
2020-07-21 12:09:30 +00:00
|
|
|
include Runtime::Fixtures
|
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
let!(:registry_scope) { Runtime::Namespace.sandbox_name }
|
2021-09-13 09:11:26 +00:00
|
|
|
let!(:personal_access_token) do
|
2020-07-21 12:09:30 +00:00
|
|
|
unless Page::Main::Menu.perform(&:signed_in?)
|
|
|
|
Flow::Login.sign_in
|
|
|
|
end
|
|
|
|
|
2021-03-09 12:08:52 +00:00
|
|
|
Resource::PersonalAccessToken.fabricate!.token
|
2020-07-21 12:09:30 +00:00
|
|
|
end
|
2020-08-06 18:09:41 +00:00
|
|
|
|
2021-09-13 09:11:26 +00:00
|
|
|
let(:project_deploy_token) do
|
2021-12-03 15:10:36 +00:00
|
|
|
Resource::ProjectDeployToken.fabricate_via_api! do |deploy_token|
|
2021-09-13 09:11:26 +00:00
|
|
|
deploy_token.name = 'npm-deploy-token'
|
|
|
|
deploy_token.project = project
|
2021-12-03 15:10:36 +00:00
|
|
|
deploy_token.scopes = %w[
|
|
|
|
read_repository
|
|
|
|
read_package_registry
|
|
|
|
write_package_registry
|
2021-11-15 06:10:30 +00:00
|
|
|
]
|
2021-09-13 09:11:26 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
let(:uri) { URI.parse(Runtime::Scenario.gitlab_address) }
|
|
|
|
let(:gitlab_address_with_port) { "#{uri.scheme}://#{uri.host}:#{uri.port}" }
|
|
|
|
let(:gitlab_host_with_port) { "#{uri.host}:#{uri.port}" }
|
|
|
|
|
2021-03-18 18:09:09 +00:00
|
|
|
let!(:project) do
|
2020-07-21 12:09:30 +00:00
|
|
|
Resource::Project.fabricate_via_api! do |project|
|
2021-10-29 03:12:09 +00:00
|
|
|
project.name = 'npm-instace-level-publish'
|
2020-07-21 12:09:30 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
let!(:another_project) do
|
|
|
|
Resource::Project.fabricate_via_api! do |another_project|
|
2021-10-29 03:12:09 +00:00
|
|
|
another_project.name = 'npm-instance-level-install'
|
2021-04-28 06:09:49 +00:00
|
|
|
another_project.template_name = 'express'
|
|
|
|
another_project.group = project.group
|
2021-03-18 18:09:09 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
let!(:runner) do
|
|
|
|
Resource::Runner.fabricate! do |runner|
|
|
|
|
runner.name = "qa-runner-#{Time.now.to_i}"
|
|
|
|
runner.tags = ["runner-for-#{project.group.name}"]
|
|
|
|
runner.executor = :docker
|
2021-05-24 15:10:27 +00:00
|
|
|
runner.token = project.group.runners_token
|
2021-04-28 06:09:49 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:gitlab_ci_deploy_yaml) do
|
|
|
|
{
|
|
|
|
file_path: '.gitlab-ci.yml',
|
|
|
|
content:
|
|
|
|
<<~YAML
|
2021-10-29 03:12:09 +00:00
|
|
|
image: node:latest
|
2021-04-28 06:09:49 +00:00
|
|
|
|
|
|
|
stages:
|
|
|
|
- deploy
|
2021-06-23 06:07:08 +00:00
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
deploy:
|
|
|
|
stage: deploy
|
|
|
|
script:
|
2021-10-29 03:12:09 +00:00
|
|
|
- echo "//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=#{auth_token}">.npmrc
|
2021-04-28 06:09:49 +00:00
|
|
|
- npm publish
|
|
|
|
only:
|
|
|
|
- "#{project.default_branch}"
|
|
|
|
tags:
|
|
|
|
- "runner-for-#{project.group.name}"
|
|
|
|
YAML
|
|
|
|
}
|
2021-03-18 18:09:09 +00:00
|
|
|
end
|
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
let(:gitlab_ci_install_yaml) do
|
|
|
|
{
|
|
|
|
file_path: '.gitlab-ci.yml',
|
|
|
|
content:
|
|
|
|
<<~YAML
|
|
|
|
image: node:latest
|
|
|
|
|
|
|
|
stages:
|
|
|
|
- install
|
2021-06-23 06:07:08 +00:00
|
|
|
|
2021-04-28 06:09:49 +00:00
|
|
|
install:
|
|
|
|
stage: install
|
|
|
|
script:
|
|
|
|
- "npm config set @#{registry_scope}:registry #{gitlab_address_with_port}/api/v4/packages/npm/"
|
|
|
|
- "npm install #{package.name}"
|
|
|
|
cache:
|
|
|
|
key: ${CI_BUILD_REF_NAME}
|
|
|
|
paths:
|
|
|
|
- node_modules/
|
|
|
|
artifacts:
|
|
|
|
paths:
|
|
|
|
- node_modules/
|
|
|
|
only:
|
|
|
|
- "#{another_project.default_branch}"
|
|
|
|
tags:
|
|
|
|
- "runner-for-#{another_project.group.name}"
|
|
|
|
YAML
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:package_json) do
|
|
|
|
{
|
2020-07-21 12:09:30 +00:00
|
|
|
file_path: 'package.json',
|
|
|
|
content: <<~JSON
|
|
|
|
{
|
2021-03-18 18:09:09 +00:00
|
|
|
"name": "#{package.name}",
|
2020-07-21 12:09:30 +00:00
|
|
|
"version": "1.0.0",
|
2021-02-19 12:11:06 +00:00
|
|
|
"description": "Example package for GitLab npm registry",
|
2020-07-21 12:09:30 +00:00
|
|
|
"publishConfig": {
|
|
|
|
"@#{registry_scope}:registry": "#{gitlab_address_with_port}/api/v4/projects/#{project.id}/packages/npm/"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
JSON
|
2021-04-28 06:09:49 +00:00
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
let(:package) do
|
2021-06-23 06:07:08 +00:00
|
|
|
Resource::Package.init do |package|
|
2021-11-16 18:12:21 +00:00
|
|
|
package.name = "@#{registry_scope}/#{project.name}-#{SecureRandom.hex(8)}"
|
2021-04-28 06:09:49 +00:00
|
|
|
package.project = project
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
after do
|
|
|
|
package.remove_via_api!
|
|
|
|
runner.remove_via_api!
|
|
|
|
project.remove_via_api!
|
|
|
|
another_project.remove_via_api!
|
|
|
|
end
|
|
|
|
|
2021-09-13 09:11:26 +00:00
|
|
|
where(:authentication_token_type, :token_name) do
|
|
|
|
:personal_access_token | 'Personal Access Token'
|
|
|
|
:ci_job_token | 'CI Job Token'
|
|
|
|
:project_deploy_token | 'Deploy Token'
|
|
|
|
end
|
2020-07-21 12:09:30 +00:00
|
|
|
|
2021-09-13 09:11:26 +00:00
|
|
|
with_them do
|
|
|
|
let(:auth_token) do
|
|
|
|
case authentication_token_type
|
|
|
|
when :personal_access_token
|
|
|
|
"\"#{personal_access_token}\""
|
|
|
|
when :ci_job_token
|
|
|
|
'${CI_JOB_TOKEN}'
|
|
|
|
when :project_deploy_token
|
2021-12-03 15:10:36 +00:00
|
|
|
"\"#{project_deploy_token.token}\""
|
2021-09-13 09:11:26 +00:00
|
|
|
end
|
2020-07-21 12:09:30 +00:00
|
|
|
end
|
|
|
|
|
2021-10-28 18:14:18 +00:00
|
|
|
it "push and pull a npm package via CI using a #{params[:token_name]}" do
|
2021-12-10 03:10:01 +00:00
|
|
|
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
|
|
|
|
Resource::Repository::Commit.fabricate_via_api! do |commit|
|
|
|
|
commit.project = project
|
|
|
|
commit.commit_message = 'Add .gitlab-ci.yml'
|
|
|
|
commit.add_files([
|
|
|
|
gitlab_ci_deploy_yaml,
|
|
|
|
package_json
|
|
|
|
])
|
|
|
|
end
|
2021-09-13 09:11:26 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
project.visit!
|
|
|
|
Flow::Pipeline.visit_latest_pipeline
|
|
|
|
|
|
|
|
Page::Project::Pipeline::Show.perform do |pipeline|
|
|
|
|
pipeline.click_job('deploy')
|
|
|
|
end
|
|
|
|
|
|
|
|
Page::Project::Job::Show.perform do |job|
|
|
|
|
expect(job).to be_successful(timeout: 800)
|
|
|
|
end
|
|
|
|
|
2021-12-10 03:10:01 +00:00
|
|
|
Support::Retrier.retry_on_exception(max_attempts: 3, sleep_interval: 2) do
|
|
|
|
Resource::Repository::Commit.fabricate_via_api! do |commit|
|
|
|
|
commit.project = another_project
|
|
|
|
commit.commit_message = 'Add .gitlab-ci.yml'
|
|
|
|
commit.add_files([
|
|
|
|
gitlab_ci_install_yaml
|
|
|
|
])
|
|
|
|
end
|
2021-09-13 09:11:26 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
another_project.visit!
|
|
|
|
Flow::Pipeline.visit_latest_pipeline
|
|
|
|
|
|
|
|
Page::Project::Pipeline::Show.perform do |pipeline|
|
|
|
|
pipeline.click_job('install')
|
|
|
|
end
|
|
|
|
|
|
|
|
Page::Project::Job::Show.perform do |job|
|
|
|
|
expect(job).to be_successful(timeout: 800)
|
|
|
|
job.click_browse_button
|
|
|
|
end
|
|
|
|
|
|
|
|
Page::Project::Artifact::Show.perform do |artifacts|
|
|
|
|
artifacts.go_to_directory('node_modules')
|
|
|
|
artifacts.go_to_directory("@#{registry_scope}")
|
2021-11-18 15:10:19 +00:00
|
|
|
expect(artifacts).to have_content("#{project.name}")
|
2021-09-13 09:11:26 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
project.visit!
|
|
|
|
Page::Project::Menu.perform(&:click_packages_link)
|
|
|
|
|
|
|
|
Page::Project::Packages::Index.perform do |index|
|
|
|
|
expect(index).to have_package(package.name)
|
|
|
|
|
|
|
|
index.click_package(package.name)
|
|
|
|
end
|
|
|
|
|
|
|
|
Page::Project::Packages::Show.perform do |show|
|
|
|
|
expect(show).to have_package_info(package.name, "1.0.0")
|
|
|
|
|
|
|
|
show.click_delete
|
|
|
|
end
|
|
|
|
|
|
|
|
Page::Project::Packages::Index.perform do |index|
|
|
|
|
expect(index).to have_content("Package deleted successfully")
|
|
|
|
expect(index).not_to have_package(package.name)
|
|
|
|
end
|
2020-07-21 12:09:30 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|