File: construct-release-environments-versions.rb

package info (click to toggle)
gitlab 17.6.5-19
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 629,368 kB
  • sloc: ruby: 1,915,304; javascript: 557,307; sql: 60,639; xml: 6,509; sh: 4,567; makefile: 1,239; python: 406
file content (82 lines) | stat: -rwxr-xr-x 2,471 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#!/usr/bin/env ruby
# frozen_string_literal: true

require 'json'

class ReleaseEnvironmentsModel
  COMPONENTS = %w[gitaly registry kas mailroom pages gitlab shell praefect].freeze

  # Will generate a json object that has a key for every component and a value which is the environment combined with
  # short sha
  # Example:
  # {
  #  "gitaly": "15-10-stable-c7c5131c",
  #  "registry": "15-10-stable-c7c5131c",
  #  "kas": "15-10-stable-c7c5131c",
  #  "mailroom": "15-10-stable-c7c5131c",
  #  "pages": "15-10-stable-c7c5131c",
  #  "gitlab": "15-10-stable-c7c5131c",
  #  "shell": "15-10-stable-c7c5131c"
  # }
  def generate_json
    output_json = {}
    COMPONENTS.each do |component|
      output_json[component.to_s] = image_tag.to_s
    end
    JSON.generate(output_json)
  end

  def set_required_env_vars?
    required_env_vars = %w[DEPLOY_ENV]

    required_env_vars.each do |var|
      if ENV.fetch(var, nil).to_s.empty?
        puts "Missing required environment variable: #{var}"
        return false
      end
    end
    true
  end

  def environment
    @environment ||= environment_base + (security_project? ? "-security" : "")
  end

  def image_tag
    @image_tag ||= "#{environment_base}-#{ENV['CI_COMMIT_SHORT_SHA']}"
  end

  private

  # This is to generate the environment name without "-security". It is used by the image tag
  def environment_base
    @environment_base ||= if release_tag_match
                            "#{release_tag_match[1]}-#{release_tag_match[2]}-stable"
                          else
                            ENV['CI_COMMIT_REF_NAME'].delete_suffix('-ee')
                          end
  end

  def release_tag_match
    @release_tag_match ||= ENV['CI_COMMIT_REF_NAME'].match(/^v?([\d]+)\.([\d]+)\.[\d]+[\d\w-]*-ee$/)
  end

  def security_project?
    ENV['CI_PROJECT_PATH'] == "gitlab-org/security/gitlab"
  end
end

# Outputs in `dotenv` format the ENVIRONMENT and VERSIONS to pass to release environments e.g.
# ENVIRONMENT=15-10-stable(-security)
# VERSIONS={"gitaly":"15-10-stable-c7c5131c","registry":"15-10-stable-c7c5131c","kas":"15-10-stable-c7c5131c", ...
if $PROGRAM_NAME == __FILE__
  model = ReleaseEnvironmentsModel.new
  raise "Missing required environment variable." unless model.set_required_env_vars?

  File.open(ENV['DEPLOY_ENV'], 'w') do |file|
    file.puts "ENVIRONMENT=#{model.environment}"
    file.puts "VERSIONS=#{model.generate_json}"
  end

  puts File.read(ENV['DEPLOY_ENV'])
end