lib/release_tools/update_paths/dynamic_pipeline.rb (123 lines of code) (raw):
# frozen_string_literal: true
module ReleaseTools
module UpdatePaths
class DynamicPipeline < DynamicPipelineBase
DEV_OMNIBUS_REGISTRY = 'dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee'
def initialize(version)
@version = ReleaseTools::Version.new(version)
end
private
attr_reader :version
def stages
{
'stages' => [
main_stage_name,
notification_stage_name
]
}
end
def jobs
{
job_name => main_job,
'notification_job_success' => notification_job_success,
'notification_job_failed' => notification_job_failed
}
end
def main_job
{
'stage' => main_stage_name,
'image' => 'registry.gitlab.com/gitlab-org/gitlab-build-images/debian-bookworm-ruby-3.2.5:docker-24.0.5',
'services' => ['docker:${DOCKER_VERSION}-dind'],
'variables' => {
'DOCKER_VERSION' => '24.0.5',
'DOCKER_HOST' => 'tcp://docker:2376',
'DOCKER_TLS_VERIFY' => '1',
'DOCKER_TLS_CERTDIR' => '/certs',
'DOCKER_CERT_PATH' => '/certs/client',
'GITLAB_QA_DEV_ACCESS_TOKEN' => '$RELEASE_BOT_DEV_TOKEN',
'QA_GENERATE_ALLURE_REPORT' => 'true',
'QA_CAN_TEST_PRAEFECT' => 'false',
'QA_INTERCEPT_REQUESTS' => 'true',
'QA_ARTIFACTS_DIR' => '$CI_PROJECT_DIR',
'QA_ALLOW_LOCAL_REQUESTS' => 'true',
'GITLAB_LICENSE_MODE' => 'test',
'FF_NETWORK_PER_BUILD' => 'true'
},
'tags' => %w[docker],
'script' => [
'git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/gitlab-org/gitlab-qa.git',
'cd gitlab-qa',
'bundle install',
"bundle exec gitlab-qa Test::Omnibus::UpdateFromPrevious #{target_image} #{source_version} #{test_type} -- --tag health_check"
],
'extends' => [
'.common-ci-tokens'
],
'artifacts' => {
'when' => 'always',
'expire_in' => '30d',
'paths' => ['gitlab-qa-run-*'],
'reports' => {
'junit' => 'gitlab-qa-run-*/**/rspec-*.xml'
}
}
}
end
def notification_job_base(status)
{
'image' => "$CI_REGISTRY_IMAGE/base:$CI_DEFAULT_BRANCH",
'stage' => notification_stage_name,
'script' => [
"source scripts/setup_ssh.sh",
"source scripts/setup_git.sh",
"bundle exec rake \"release:update_paths:finish_notification[#{previous_version},#{version},#{status}]\""
],
'extends' => [
'.with-bundle',
'.common-ci-tokens'
],
'when' => status == 'success' ? 'on_success' : 'on_failure'
}
end
def notification_job_success
notification_job_base('success')
end
def notification_job_failed
notification_job_base('failed')
end
def previous_version
@previous_version ||= ReleaseTools::Version.new(
if version.monthly?
GitlabReleasesGemClient.latest_patch_for_version(version.previous_minor)
else
# At the time of running, the tested version is not yet registered on
# version.gitlab.com, so the latest patch version is the previous version we want
# to test the update path from.
GitlabReleasesGemClient.latest_patch_for_version(version)
end
)
end
def main_stage_name
if version.monthly?
"patch-to-monthly"
elsif previous_version.monthly?
"monthly-to-patch"
else
"patch-to-patch"
end
end
def notification_stage_name
"finish_notification"
end
def job_name
"#{previous_version}-to-#{version}".tr('.', '-')
end
def test_type
return "minor" if version.monthly?
"patch"
end
# When updating from a patch version to a monthly version, we use a different scenario "minor" where the
# previous version is also the same as the target version:
# bundle exec gitlab-qa Test::Omnibus::UpdateFromPrevious dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee:17.10.0-ee.0 17.10.0 minor -- --tag health_check
def source_version
version.monthly? ? version : previous_version
end
# UpdatePaths testing is between tagging and publish, so the new version is not yet published to DockerHub,
# but only on the Dev Omnibus GitLab registry.
def target_image
"#{DEV_OMNIBUS_REGISTRY}:#{version.to_docker(ee: true)}"
end
end
end
end