286 lines
13 KiB
Ruby
286 lines
13 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require 'spec_helper'
|
|
|
|
RSpec.describe Gitlab::Ci::Build::Releaser, feature_category: :continuous_integration do
|
|
let(:job) { build(:ci_build, options: { release: config[:release] }) }
|
|
|
|
subject(:releaser) { described_class.new(job: job) }
|
|
|
|
describe '#script' do
|
|
subject(:script) { releaser.script }
|
|
|
|
context 'all nodes' do
|
|
let(:config) do
|
|
{
|
|
release: {
|
|
name: 'Release $CI_COMMIT_SHA',
|
|
description: 'Created using the release-cli $EXTRA_DESCRIPTION',
|
|
tag_name: 'release-$CI_COMMIT_SHA',
|
|
tag_message: 'Annotated tag message',
|
|
ref: '$CI_COMMIT_SHA',
|
|
milestones: %w[m1 m2 m3],
|
|
released_at: '2020-07-15T08:00:00Z',
|
|
assets: {
|
|
links: [
|
|
{ name: 'asset1', url: 'https://example.com/assets/1', link_type: 'other', filepath: '/pretty/asset/1' },
|
|
{ name: 'asset2', url: 'https://example.com/assets/2' }
|
|
]
|
|
}
|
|
}
|
|
}
|
|
end
|
|
|
|
assets_link1 = '{\"name\":\"asset1\",\"url\":\"https://example.com/assets/1\",\"link_type\":\"other\",\"filepath\":\"/pretty/asset/1\"}'
|
|
assets_link2 = '{\"name\":\"asset2\",\"url\":\"https://example.com/assets/2\"}'
|
|
glab_assets_links = "--assets-links \"[#{assets_link1},#{assets_link2}]\""
|
|
release_cli_assets_links = "--assets-link \"#{assets_link1}\" --assets-link \"#{assets_link2}\""
|
|
|
|
release_cli_command = 'release-cli create --name "Release $CI_COMMIT_SHA" --description "Created using the release-cli $EXTRA_DESCRIPTION" --tag-name "release-$CI_COMMIT_SHA" --tag-message "Annotated tag message" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z" --milestone "m1" --milestone "m2" --milestone "m3"'
|
|
result_for_release_cli_without_catalog_publish = "#{release_cli_command} #{release_cli_assets_links}"
|
|
|
|
glab_create_unix = 'glab release create -R $CI_PROJECT_PATH'
|
|
glab_create_windows = 'glab release create -R $$env:CI_PROJECT_PATH'
|
|
glab_command = "\"release-$CI_COMMIT_SHA\" #{glab_assets_links} --milestone \"m1,m2,m3\" --name \"Release $CI_COMMIT_SHA\" --experimental-notes-text-or-file \"Created using the release-cli $EXTRA_DESCRIPTION\" --ref \"$CI_COMMIT_SHA\" --tag-message \"Annotated tag message\" --released-at \"2020-07-15T08:00:00Z\" --no-update --no-close-milestone"
|
|
|
|
warning_message = "Warning: release-cli will not be supported after 19.0. Please use glab version >= #{described_class::GLAB_REQUIRED_VERSION}. Troubleshooting: http://localhost/help/user/project/releases/_index.md#gitlab-cli-version-requirement"
|
|
|
|
unix_result_for_glab_or_release_cli_without_catalog_publish = <<~BASH
|
|
if command -v glab &> /dev/null; then
|
|
if [ "$(printf "%s\\n%s" "#{described_class::GLAB_REQUIRED_VERSION}" "$(glab --version | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')" | sort -V | head -n1)" = "#{described_class::GLAB_REQUIRED_VERSION}" ]; then
|
|
#{described_class::GLAB_ENV_SET_UNIX}
|
|
#{described_class::GLAB_CA_CERT_CONFIG_UNIX}
|
|
#{described_class::GLAB_LOGIN_UNIX}
|
|
#{glab_create_unix} #{glab_command}
|
|
#{described_class::GLAB_CA_CERT_CLEANUP_UNIX}
|
|
else
|
|
echo "#{warning_message}"
|
|
|
|
#{release_cli_command} #{release_cli_assets_links}
|
|
fi
|
|
else
|
|
echo "#{warning_message}"
|
|
|
|
#{release_cli_command} #{release_cli_assets_links}
|
|
fi
|
|
BASH
|
|
windows_result_for_glab_or_release_cli_without_catalog_publish = <<~POWERSHELL
|
|
if (Get-Command glab -ErrorAction SilentlyContinue) {
|
|
$$glabVersionOutput = (glab --version | Select-Object -First 1) -as [string]
|
|
|
|
if ($$glabVersionOutput -match 'glab (\\\d+\\\.\\\d+\\\.\\\d+)') {
|
|
if ([version]$$matches[1] -ge [version]"#{described_class::GLAB_REQUIRED_VERSION}") {
|
|
#{described_class::GLAB_ENV_SET_WINDOWS}
|
|
#{described_class::GLAB_CA_CERT_CONFIG_WINDOWS}
|
|
#{described_class::GLAB_LOGIN_WINDOWS}
|
|
#{glab_create_windows} #{glab_command}
|
|
#{described_class::GLAB_CA_CERT_CLEANUP_WINDOWS}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links}
|
|
}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links}
|
|
}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links}
|
|
}
|
|
POWERSHELL
|
|
|
|
context 'on different scenarios' do
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
where(:cli_ff, :runner_platform, :result) do
|
|
false | 'irrelevant' | result_for_release_cli_without_catalog_publish
|
|
true | 'linux' | unix_result_for_glab_or_release_cli_without_catalog_publish
|
|
true | 'windows' | windows_result_for_glab_or_release_cli_without_catalog_publish
|
|
end
|
|
|
|
with_them do
|
|
let(:runner_manager) { build(:ci_runner_machine, platform: runner_platform) }
|
|
|
|
let(:job) do
|
|
build(:ci_build,
|
|
options: { release: config[:release] },
|
|
runner: runner_manager.runner, runner_manager: runner_manager)
|
|
end
|
|
|
|
before do
|
|
stub_feature_flags(ci_glab_for_release: cli_ff)
|
|
end
|
|
|
|
it { is_expected.to eq([result]) }
|
|
end
|
|
end
|
|
|
|
context 'when project is a catalog resource' do
|
|
let_it_be(:project) { create(:project, :catalog_resource_with_components) }
|
|
let_it_be(:ci_catalog_resource) { create(:ci_catalog_resource, project: project) }
|
|
let_it_be(:pipeline) { create(:ci_pipeline, project: project) }
|
|
|
|
result_for_release_cli_with_catalog_publish = "#{result_for_release_cli_without_catalog_publish} --catalog-publish"
|
|
unix_result_for_glab_or_release_cli_with_catalog_publish = <<~BASH
|
|
if command -v glab &> /dev/null; then
|
|
if [ "$(printf "%s\\n%s" "#{described_class::GLAB_REQUIRED_VERSION}" "$(glab --version | grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+')" | sort -V | head -n1)" = "#{described_class::GLAB_REQUIRED_VERSION}" ]; then
|
|
#{described_class::GLAB_ENV_SET_UNIX}
|
|
#{described_class::GLAB_CA_CERT_CONFIG_UNIX}
|
|
#{described_class::GLAB_LOGIN_UNIX}
|
|
#{glab_create_unix} #{glab_command} --publish-to-catalog
|
|
#{described_class::GLAB_CA_CERT_CLEANUP_UNIX}
|
|
else
|
|
echo "#{warning_message}"
|
|
|
|
#{release_cli_command} #{release_cli_assets_links} --catalog-publish
|
|
fi
|
|
else
|
|
echo "#{warning_message}"
|
|
|
|
#{release_cli_command} #{release_cli_assets_links} --catalog-publish
|
|
fi
|
|
BASH
|
|
windows_result_for_glab_or_release_cli_with_catalog_publish = <<~POWERSHELL
|
|
if (Get-Command glab -ErrorAction SilentlyContinue) {
|
|
$$glabVersionOutput = (glab --version | Select-Object -First 1) -as [string]
|
|
|
|
if ($$glabVersionOutput -match 'glab (\\\d+\\\.\\\d+\\\.\\\d+)') {
|
|
if ([version]$$matches[1] -ge [version]"#{described_class::GLAB_REQUIRED_VERSION}") {
|
|
#{described_class::GLAB_ENV_SET_WINDOWS}
|
|
#{described_class::GLAB_CA_CERT_CONFIG_WINDOWS}
|
|
#{described_class::GLAB_LOGIN_WINDOWS}
|
|
#{glab_create_windows} #{glab_command} --publish-to-catalog
|
|
#{described_class::GLAB_CA_CERT_CLEANUP_WINDOWS}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links} --catalog-publish
|
|
}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links} --catalog-publish
|
|
}
|
|
}
|
|
else {
|
|
Write-Output "#{warning_message}"
|
|
#{release_cli_command} #{release_cli_assets_links} --catalog-publish
|
|
}
|
|
POWERSHELL
|
|
|
|
context 'on different scenarios' do
|
|
using RSpec::Parameterized::TableSyntax
|
|
|
|
where(:cli_ff, :catalog_publish_ff, :runner_platform, :result) do
|
|
false | false | 'irrelevant' | result_for_release_cli_without_catalog_publish
|
|
false | true | 'irrelevant' | result_for_release_cli_with_catalog_publish
|
|
true | false | 'linux' | unix_result_for_glab_or_release_cli_without_catalog_publish
|
|
true | true | 'linux' | unix_result_for_glab_or_release_cli_with_catalog_publish
|
|
true | false | 'windows' | windows_result_for_glab_or_release_cli_without_catalog_publish
|
|
true | true | 'windows' | windows_result_for_glab_or_release_cli_with_catalog_publish
|
|
end
|
|
|
|
with_them do
|
|
let(:runner_manager) { build(:ci_runner_machine, platform: runner_platform) }
|
|
|
|
let(:job) do
|
|
build(:ci_build, pipeline: pipeline,
|
|
options: { release: config[:release] },
|
|
runner: runner_manager.runner, runner_manager: runner_manager)
|
|
end
|
|
|
|
before do
|
|
stub_feature_flags(ci_glab_for_release: cli_ff)
|
|
stub_feature_flags(ci_release_cli_catalog_publish_option: catalog_publish_ff)
|
|
end
|
|
|
|
it { is_expected.to eq([result]) }
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'with runner information' do
|
|
let(:runner) { create(:ci_runner, :with_runner_manager) }
|
|
let(:runner_manager) { runner.runner_managers.first }
|
|
let(:job) { create(:ci_build, options: { release: config[:release] }, runner: runner, runner_manager: runner_manager) }
|
|
|
|
it 'logs the runner information' do
|
|
expect(Gitlab::AppJsonLogger).to receive(:info).with(
|
|
class: described_class.to_s,
|
|
message: 'The release script for the release build is being prepared.',
|
|
runner_id: runner&.id,
|
|
runner_type: runner&.runner_type,
|
|
runner_platform: runner_manager&.platform
|
|
)
|
|
|
|
script
|
|
end
|
|
end
|
|
end
|
|
|
|
context 'individual nodes' do
|
|
using RSpec::Parameterized::TableSyntax
|
|
links = { links: [{ name: 'asset1', url: 'https://example.com/assets/1', link_type: 'other', filepath: '/pretty/asset/1' }] }
|
|
|
|
where(:node_name, :node_value, :result) do
|
|
:name | 'Release $CI_COMMIT_SHA' | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --name "Release $CI_COMMIT_SHA" --ref "$CI_COMMIT_SHA"'
|
|
:description | 'Release-cli $EXTRA_DESCRIPTION' | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --experimental-notes-text-or-file "Release-cli $EXTRA_DESCRIPTION" --ref "$CI_COMMIT_SHA"'
|
|
:tag_name | 'release-$CI_COMMIT_SHA' | 'glab release create -R $CI_PROJECT_PATH "release-$CI_COMMIT_SHA" --ref "$CI_COMMIT_SHA"'
|
|
:tag_message | 'Annotated tag message' | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --ref "$CI_COMMIT_SHA" --tag-message "Annotated tag message"'
|
|
:ref | '$CI_COMMIT_SHA' | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --ref "$CI_COMMIT_SHA"'
|
|
:milestones | %w[m1 m2 m3] | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --milestone "m1,m2,m3" --ref "$CI_COMMIT_SHA"'
|
|
:released_at | '2020-07-15T08:00:00Z' | 'glab release create -R $CI_PROJECT_PATH "$CI_COMMIT_TAG" --ref "$CI_COMMIT_SHA" --released-at "2020-07-15T08:00:00Z"'
|
|
:assets | links | "glab release create -R $CI_PROJECT_PATH \"$CI_COMMIT_TAG\" --assets-links #{links[:links].to_json.to_json} --ref \"$CI_COMMIT_SHA\""
|
|
end
|
|
|
|
with_them do
|
|
let(:config) do
|
|
{
|
|
release: {
|
|
node_name => node_value
|
|
}
|
|
}
|
|
end
|
|
|
|
it 'generates the script' do
|
|
expect(script).to match([a_string_including(result)])
|
|
end
|
|
end
|
|
|
|
context 'when the FF ci_glab_for_release is disabled' do
|
|
before do
|
|
stub_feature_flags(ci_glab_for_release: false)
|
|
end
|
|
|
|
where(:node_name, :node_value, :result) do
|
|
:name | 'Release $CI_COMMIT_SHA' | 'release-cli create --name "Release $CI_COMMIT_SHA"'
|
|
:description | 'Release-cli $EXTRA_DESCRIPTION' | 'release-cli create --description "Release-cli $EXTRA_DESCRIPTION"'
|
|
:tag_name | 'release-$CI_COMMIT_SHA' | 'release-cli create --tag-name "release-$CI_COMMIT_SHA"'
|
|
:tag_message | 'Annotated tag message' | 'release-cli create --tag-message "Annotated tag message"'
|
|
:ref | '$CI_COMMIT_SHA' | 'release-cli create --ref "$CI_COMMIT_SHA"'
|
|
:milestones | %w[m1 m2 m3] | 'release-cli create --milestone "m1" --milestone "m2" --milestone "m3"'
|
|
:released_at | '2020-07-15T08:00:00Z' | 'release-cli create --released-at "2020-07-15T08:00:00Z"'
|
|
:assets | links | "release-cli create --assets-link #{links[:links][0].to_json.to_json}"
|
|
end
|
|
|
|
with_them do
|
|
let(:config) do
|
|
{
|
|
release: {
|
|
node_name => node_value
|
|
}
|
|
}
|
|
end
|
|
|
|
it 'generates the script' do
|
|
expect(script).to eq([result])
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|