Files
gitlab-foss/scripts/setup/generate-as-if-foss-env.rb
2025-04-16 09:08:32 +00:00

116 lines
4.1 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
# We need to take some precautions when using the `gitlab` gem in this project.
#
# See https://docs.gitlab.com/ee/development/pipelines/internals.html#using-the-gitlab-ruby-gem-in-the-canonical-project.
#
# In spec/scripts/setup/generate_as_if_foss_env_spec.rb we completely stub it
if Object.const_defined?(:RSpec)
# Ok, we're testing, we know we're going to stub `Gitlab`, so we just ignore
else
require 'gitlab'
if Gitlab.singleton_class.method_defined?(:com?)
abort 'lib/gitlab.rb is loaded, and this means we can no longer load the client and we cannot proceed'
end
end
class GenerateAsIfFossEnv
PARALLEL = %r{(?: \d+/\d+)}
PG_JOB = %r{\S+ pg\d+}
# Map job names to environment variables. One job can match multiple variables.
# For example: "rspec unit 1/2" returns `ENABLE_RSPEC` and `ENABLE_RSPEC_UNIT`.
JOB_VARIABLES = {
'build-qa-image' => 'ENABLE_BUILD_QA_IMAGE',
'compile-production-assets' => 'ENABLE_COMPILE_PRODUCTION_ASSETS',
'compile-storybook' => 'ENABLE_COMPILE_STORYBOOK',
'compile-test-assets' => 'ENABLE_COMPILE_TEST_ASSETS',
'detect-tests' => 'ENABLE_DETECT_TESTS',
'eslint' => 'ENABLE_ESLINT',
'generate-apollo-graphql-schema' => 'ENABLE_GENERATE_APOLLO_GRAPHQL_SCHEMA',
'graphql-schema-dump' => 'ENABLE_GRAPHQL_SCHEMA_DUMP',
'rspec-predictive:pipeline-generate' => 'ENABLE_RSPEC_PREDICTIVE_PIPELINE_GENERATE',
'rspec:predictive:trigger' => 'ENABLE_RSPEC_PREDICTIVE_TRIGGER',
'rspec:predictive:trigger single-db' => 'ENABLE_RSPEC_PREDICTIVE_TRIGGER_SINGLE_DB',
'rspec:predictive:trigger single-db-ci-connection' => 'ENABLE_RSPEC_PREDICTIVE_TRIGGER_SINGLE_DB_CI_CONNECTION',
'rubocop' => 'ENABLE_RUBOCOP',
'qa:internal' => 'ENABLE_QA_INTERNAL',
'qa:selectors' => 'ENABLE_QA_SELECTORS',
'static-analysis' => 'ENABLE_STATIC_ANALYSIS',
/^cache-assets\b/ => 'ENABLE_CACHE_ASSETS',
# Jest
/^jest#{PARALLEL}/ => 'ENABLE_JEST',
/^jest-integration/ => 'ENABLE_JEST_INTEGRATION',
/^jest predictive#{PARALLEL}/ => 'ENABLE_JEST_PREDICTIVE',
# RSpec
/^rspec/ => 'ENABLE_RSPEC',
/^rspec(?:-all)? frontend_fixture/ => 'ENABLE_RSPEC_FRONTEND_FIXTURE',
/^rspec unit/ => 'ENABLE_RSPEC_UNIT',
/^rspec fast_spec_helper/ => 'ENABLE_RSPEC_FAST_SPEC_HELPER',
/^rspec migration/ => 'ENABLE_RSPEC_MIGRATION',
/^rspec background_migration/ => 'ENABLE_RSPEC_BACKGROUND_MIGRATION',
/^rspec integration/ => 'ENABLE_RSPEC_INTEGRATION',
/^rspec system/ => 'ENABLE_RSPEC_SYSTEM',
/^rspec #{PG_JOB} praefect\b/ => 'ENABLE_RSPEC_PRAEFECT',
/^rspec #{PG_JOB} single-db\b/ => 'ENABLE_RSPEC_SINGLE_DB',
/^rspec #{PG_JOB} single-db-ci-connection\b/ => 'ENABLE_RSPEC_SINGLE_DB_CI_CONNECTION',
/^rspec #{PG_JOB} single-redis\b/ => 'ENABLE_RSPEC_SINGLE_REDIS'
}.freeze
def initialize
@client = Gitlab.client(
endpoint: ENV['CI_API_V4_URL'],
private_token: ENV['PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE'] || '')
end
def variables
@variables ||= generate_variables
end
def display
variables.each do |key, value|
puts "#{key}=#{value}"
end
end
private
attr_reader :client
def generate_variables
{
START_AS_IF_FOSS: 'true',
RUBY_VERSION: ENV['RUBY_VERSION'],
FIND_CHANGES_MERGE_REQUEST_PROJECT_PATH: ENV['CI_MERGE_REQUEST_PROJECT_PATH'],
FIND_CHANGES_MERGE_REQUEST_IID: ENV['CI_MERGE_REQUEST_IID'],
**variables_from_jobs
}
end
def variables_from_jobs
variable_set = Set.new
each_job do |job|
variable_set.merge(variables_from(job.name))
end
variable_set.to_h { |v| [v.to_sym, 'true'] }
end
def each_job
%i[pipeline_jobs pipeline_bridges].each do |kind|
client.public_send(kind, ENV['CI_PROJECT_ID'], ENV['CI_PIPELINE_ID']).auto_paginate do |job| # rubocop:disable GitlabSecurity/PublicSend -- We're sending with static values, no concerns
yield(job)
end
end
end
def variables_from(job_name)
JOB_VARIABLES.select { |match, _| match === job_name }.map(&:last)
end
end
GenerateAsIfFossEnv.new.display if $PROGRAM_NAME == __FILE__