Files
gitlab-ce/scripts/release_environment/notification.rb
2024-07-04 15:28:22 +00:00

74 lines
2.2 KiB
Ruby
Executable File

#!/usr/bin/env ruby
# frozen_string_literal: true
require 'net/http'
require 'uri'
require 'json'
class ReleaseEnvironmentNotification
OPS_RELEASE_TOOLS_API_URL = "https://ops.gitlab.net/api/v4/projects/130"
def initialize
raise "Missing required environment variable." unless set_required_env_vars?
@version = fetch_version
end
def execute
response = trigger_notification
puts "Response body: #{response.body}"
return if response.is_a? Net::HTTPSuccess
raise "Something was wrong when triggering the notification pipeline. Response code: #{response.code}"
end
attr_reader :version
private
def set_required_env_vars?
# List of required environment variables.
# CI_PIPELINE_URL supposes to be set by the CI pipeline, so we don't check it.
required_env_vars = %w[ENVIRONMENT VERSIONS OPS_RELEASE_TOOLS_PIPELINE_TOKEN RELEASE_ENVIRONMENT_NOTIFICATION_TYPE]
required_env_vars.each do |var|
if ENV.fetch(var, nil).to_s.empty?
puts "Missing required environment variable: #{var}"
return false
end
end
end
# Get the version from the VERSIONS environment variable
# All components use the same version, so we can just get the version of gitlab
def fetch_version
versions_data.fetch('gitlab', nil)
end
def versions_data
JSON.parse(ENV.fetch('VERSIONS', '{}'))
end
def trigger_notification
uri = URI.parse("#{OPS_RELEASE_TOOLS_API_URL}/trigger/pipeline")
request = Net::HTTP::Post.new(uri)
data = {
"variables[RELEASE_ENVIRONMENT_PIPELINE]" => "true",
"variables[RELEASE_ENVIRONMENT_NOTIFICATION_TYPE]" => ENV.fetch('RELEASE_ENVIRONMENT_NOTIFICATION_TYPE', nil),
"variables[RELEASE_ENVIRONMENT_CI_PIPELINE_URL]" => ENV.fetch('CI_PIPELINE_URL', nil),
"variables[RELEASE_ENVIRONMENT_NAME]" => ENV.fetch('ENVIRONMENT', nil),
"variables[RELEASE_ENVIRONMENT_VERSION]" => version,
"token" => ENV.fetch('OPS_RELEASE_TOOLS_PIPELINE_TOKEN', nil),
"ref" => "master"
}
request.set_form_data(data)
Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
http.request(request)
end
end
end
ReleaseEnvironmentNotification.new.execute if $PROGRAM_NAME == __FILE__