From dd72134eba178d36f274e92f2cf83c9221bb86b0 Mon Sep 17 00:00:00 2001
From: Marin Jankovski <maxlazio@gmail.com>
Date: Thu, 14 Jun 2018 13:05:16 +0200
Subject: [PATCH] Move the trigger-build script into one location to serve both
 omnibus and cloud-native triggers.

---
 .gitlab-ci.yml                     |   4 +-
 .rubocop_todo.yml                  |   2 +-
 scripts/trigger-build              | 181 +++++++++++++++++++++++++++++
 scripts/trigger-build-cloud-native |  61 ----------
 scripts/trigger-build-omnibus      | 108 -----------------
 5 files changed, 184 insertions(+), 172 deletions(-)
 create mode 100755 scripts/trigger-build
 delete mode 100755 scripts/trigger-build-cloud-native
 delete mode 100755 scripts/trigger-build-omnibus

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9a0102c65fde..e7304b9c0573 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -264,10 +264,10 @@ package-and-qa:
   <<: *single-script-job
   variables:
     <<: *single-script-job-variables
-    SCRIPT_NAME: trigger-build-omnibus
+    SCRIPT_NAME: trigger-build
   retry: 0
   script:
-    - ./$SCRIPT_NAME
+    - ./$SCRIPT_NAME omnibus
   when: manual
   only:
     - //@gitlab-org/gitlab-ce
diff --git a/.rubocop_todo.yml b/.rubocop_todo.yml
index 1fb352306d76..ccf301e6c78f 100644
--- a/.rubocop_todo.yml
+++ b/.rubocop_todo.yml
@@ -487,7 +487,7 @@ Style/EmptyLiteral:
     - 'lib/gitlab/fogbugz_import/importer.rb'
     - 'lib/gitlab/git/diff_collection.rb'
     - 'lib/gitlab/gitaly_client.rb'
-    - 'scripts/trigger-build-omnibus'
+    - 'scripts/trigger-build'
     - 'spec/features/merge_requests/versions_spec.rb'
     - 'spec/helpers/merge_requests_helper_spec.rb'
     - 'spec/lib/gitlab/request_context_spec.rb'
diff --git a/scripts/trigger-build b/scripts/trigger-build
new file mode 100755
index 000000000000..526f5164edec
--- /dev/null
+++ b/scripts/trigger-build
@@ -0,0 +1,181 @@
+#!/usr/bin/env ruby
+
+require 'net/http'
+require 'json'
+require 'cgi'
+
+module Trigger
+  OMNIBUS_PROJECT_PATH = 'gitlab-org/omnibus-gitlab'.freeze
+  CNG_PROJECT_PATH = 'gitlab-org/build/CNG'.freeze
+  TOKEN = ENV['BUILD_TRIGGER_TOKEN']
+
+  def self.ee?
+    ENV['CI_PROJECT_NAME'] == 'gitlab-ee' || File.exist?('CHANGELOG-EE.md')
+  end
+
+  class Omnibus
+    def initialize
+      @uri = URI("https://gitlab.com/api/v4/projects/#{CGI.escape(Trigger::OMNIBUS_PROJECT_PATH)}/trigger/pipeline")
+      @params = env_params.merge(file_params).merge(token: Trigger::TOKEN)
+    end
+
+    def invoke!
+      res = Net::HTTP.post_form(@uri, @params)
+      id = JSON.parse(res.body)['id']
+      project = Trigger::OMNIBUS_PROJECT_PATH
+
+      if id
+        puts "Triggered https://gitlab.com/#{project}/pipelines/#{id}"
+        puts "Waiting for downstream pipeline status"
+      else
+        raise "Trigger failed! The response from the trigger is: #{res.body}"
+      end
+
+      Trigger::Pipeline.new(project, id)
+    end
+
+    private
+
+    def env_params
+      {
+        "ref" => ENV["OMNIBUS_BRANCH"] || "master",
+        "variables[GITLAB_VERSION]" => ENV["CI_COMMIT_SHA"],
+        "variables[ALTERNATIVE_SOURCES]" => true,
+        "variables[ee]" => Trigger.ee? ? 'true' : 'false',
+        "variables[TRIGGERED_USER]" => ENV["GITLAB_USER_NAME"],
+        "variables[TRIGGER_SOURCE]" => "https://gitlab.com/gitlab-org/#{ENV['CI_PROJECT_NAME']}/-/jobs/#{ENV['CI_JOB_ID']}"
+      }
+    end
+
+    def file_params
+      Hash.new.tap do |params|
+        Dir.glob("*_VERSION").each do |version_file|
+          params["variables[#{version_file}]"] = File.read(version_file).strip
+        end
+      end
+    end
+  end
+
+  class CNG
+    def initialize
+      @uri = URI("https://gitlab.com/api/v4/projects/#{CGI.escape(Trigger::CNG_PROJECT_PATH)}/trigger/pipeline")
+      @ref_name = ENV['CI_COMMIT_REF_NAME']
+      @username = ENV['GITLAB_USER_NAME']
+      @project_name = ENV['CI_PROJECT_NAME']
+      @job_id = ENV['CI_JOB_ID']
+      @params = env_params.merge(file_params).merge(token: Trigger::TOKEN)
+    end
+
+    #
+    # Trigger a pipeline
+    #
+    def invoke!
+      res = Net::HTTP.post_form(@uri, @params)
+      id = JSON.parse(res.body)['id']
+      project = Trigger::CNG_PROJECT_PATH
+
+      if id
+        puts "Triggered https://gitlab.com/#{project}/pipelines/#{id}"
+        puts "Waiting for downstream pipeline status"
+      else
+        raise "Trigger failed! The response from the trigger is: #{res.body}"
+      end
+
+      Trigger::Pipeline.new(project, id)
+    end
+
+    private
+
+    def env_params
+      params = {
+        "ref" => ENV["CNG_BRANCH"] || "master",
+        "variables[TRIGGERED_USER]" => @username,
+        "variables[TRIGGER_SOURCE]" => "https://gitlab.com/gitlab-org/#{@project_name}/-/jobs/#{@job_id}"
+      }
+
+      if Trigger.ee?
+        params["variables[GITLAB_EE_VERSION]"] = @ref_name
+        params["variables[EE_PIPELINE]"] = 'true'
+      else
+        params["variables[GITLAB_CE_VERSION]"] = @ref_name
+        params["variables[CE_PIPELINE]"] = 'true'
+      end
+
+      params
+    end
+
+    # Read version files from all components
+    def file_params
+      Dir.glob("*_VERSION").each_with_object({}) do |version_file, params|
+        raw_version = File.read(version_file).strip
+        # if the version matches semver format, treat it as a tag and prepend `v`
+        version = if raw_version =~ Regexp.compile(/^\d+\.\d+\.\d+(-rc\d+)?(-ee)?$/)
+                    "v#{raw_version}"
+                  else
+                    raw_version
+                  end
+
+        params["variables[#{version_file}]"] = version
+      end
+    end
+  end
+
+  class Pipeline
+    INTERVAL = 60 # seconds
+    MAX_DURATION = 3600 * 3 # 3 hours
+
+    def initialize(project, id)
+      @start = Time.now.to_i
+      @uri = URI("https://gitlab.com/api/v4/projects/#{CGI.escape(project)}/pipelines/#{id}")
+    end
+
+    def wait!
+      loop do
+        raise "Pipeline timed out after waiting for #{duration} minutes!" if timeout?
+
+        case status
+        when :created, :pending, :running
+          print "."
+          sleep INTERVAL
+        when :success
+          puts "Pipeline succeeded in #{duration} minutes!"
+          break
+        else
+          raise "Pipeline did not succeed!"
+        end
+
+        STDOUT.flush
+      end
+    end
+
+    def timeout?
+      Time.now.to_i > (@start + MAX_DURATION)
+    end
+
+    def duration
+      (Time.now.to_i - @start) / 60
+    end
+
+    def status
+      req = Net::HTTP::Get.new(@uri)
+      req['PRIVATE-TOKEN'] = ENV['GITLAB_QA_ACCESS_TOKEN']
+
+      res = Net::HTTP.start(@uri.hostname, @uri.port, use_ssl: true) do |http|
+        http.request(req)
+      end
+
+      JSON.parse(res.body)['status'].to_s.to_sym
+    end
+  end
+end
+
+case ARGV[0]
+when 'omnibus'
+  Trigger::Omnibus.new.invoke!.wait!
+when 'cng'
+  Trigger::CNG.new.invoke!.wait!
+else
+  puts "Please provide a valid option:
+  omnibus - Triggers a pipeline that builds the omnibus-gitlab package
+  cng - Triggers a pipeline that builds images used by the GitLab helm chart"
+end
diff --git a/scripts/trigger-build-cloud-native b/scripts/trigger-build-cloud-native
deleted file mode 100755
index b6ca75a588d2..000000000000
--- a/scripts/trigger-build-cloud-native
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'gitlab'
-
-#
-# Configure credentials to be used with gitlab gem
-#
-Gitlab.configure do |config|
-  config.endpoint = 'https://gitlab.com/api/v4'
-end
-
-#
-# The remote project
-#
-GITLAB_CNG_REPO = 'gitlab-org/build/CNG'.freeze
-
-def ee?
-  ENV['CI_PROJECT_NAME'] == 'gitlab-ee' || File.exist?('CHANGELOG-EE.md')
-end
-
-def read_file_version(filename)
-  raw_version = File.read(filename).strip
-
-  # if the version matches semver format, treat it as a tag and prepend `v`
-  if raw_version =~ Regexp.compile(/^\d+\.\d+\.\d+(-rc\d+)?(-ee)?$/)
-    "v#{raw_version}"
-  else
-    raw_version
-  end
-end
-
-def params
-  params = {
-    'GITLAB_SHELL_VERSION' => read_file_version('GITLAB_SHELL_VERSION'),
-    'GITALY_VERSION' => read_file_version('GITALY_SERVER_VERSION'),
-    'TRIGGERED_USER' => ENV['GITLAB_USER_NAME'],
-    'TRIGGER_SOURCE' => "https://gitlab.com/gitlab-org/#{ENV['CI_PROJECT_NAME']}/-/jobs/#{ENV['CI_JOB_ID']}"
-  }
-
-  if ee?
-    params['EE_PIPELINE'] = 'true'
-    params['GITLAB_EE_VERSION'] = ENV['CI_COMMIT_REF_NAME']
-  else
-    params['CE_PIPELINE'] = 'true'
-    params['GITLAB_CE_VERSION'] = ENV['CI_COMMIT_REF_NAME']
-  end
-
-  params
-end
-
-#
-# Trigger a pipeline
-#
-def trigger_pipeline
-  # Create the cross project pipeline using CI_JOB_TOKEN
-  pipeline = Gitlab.run_trigger(GITLAB_CNG_REPO, ENV['CI_JOB_TOKEN'], 'master', params)
-
-  puts "Triggered https://gitlab.com/#{GITLAB_CNG_REPO}/pipelines/#{pipeline.id}"
-end
-
-trigger_pipeline
diff --git a/scripts/trigger-build-omnibus b/scripts/trigger-build-omnibus
deleted file mode 100755
index 95f35b44f5af..000000000000
--- a/scripts/trigger-build-omnibus
+++ /dev/null
@@ -1,108 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'net/http'
-require 'json'
-require 'cgi'
-
-module Omnibus
-  PROJECT_PATH = 'gitlab-org/omnibus-gitlab'.freeze
-
-  class Trigger
-    TOKEN = ENV['BUILD_TRIGGER_TOKEN']
-    TRIGGERER = ENV['CI_PROJECT_NAME']
-
-    def initialize
-      @uri = URI("https://gitlab.com/api/v4/projects/#{CGI.escape(Omnibus::PROJECT_PATH)}/trigger/pipeline")
-      @params = env_params.merge(file_params).merge(token: TOKEN)
-    end
-
-    def invoke!
-      res = Net::HTTP.post_form(@uri, @params)
-      id = JSON.parse(res.body)['id']
-
-      if id
-        puts "Triggered https://gitlab.com/#{Omnibus::PROJECT_PATH}/pipelines/#{id}"
-        puts "Waiting for downstream pipeline status"
-      else
-        raise "Trigger failed! The response from the trigger is: #{res.body}"
-      end
-
-      Omnibus::Pipeline.new(id)
-    end
-
-    private
-
-    def ee?
-      TRIGGERER == 'gitlab-ee' || File.exist?('CHANGELOG-EE.md')
-    end
-
-    def env_params
-      {
-        "ref" => ENV["OMNIBUS_BRANCH"] || "master",
-        "variables[GITLAB_VERSION]" => ENV["CI_COMMIT_SHA"],
-        "variables[ALTERNATIVE_SOURCES]" => true,
-        "variables[ee]" => ee? ? 'true' : 'false',
-        "variables[TRIGGERED_USER]" => ENV["GITLAB_USER_NAME"],
-        "variables[TRIGGER_SOURCE]" => "https://gitlab.com/gitlab-org/#{ENV['CI_PROJECT_NAME']}/-/jobs/#{ENV['CI_JOB_ID']}"
-      }
-    end
-
-    def file_params
-      Hash.new.tap do |params|
-        Dir.glob("*_VERSION").each do |version_file|
-          params["variables[#{version_file}]"] = File.read(version_file).strip
-        end
-      end
-    end
-  end
-
-  class Pipeline
-    INTERVAL = 60 # seconds
-    MAX_DURATION = 3600 * 3 # 3 hours
-
-    def initialize(id)
-      @start = Time.now.to_i
-      @uri = URI("https://gitlab.com/api/v4/projects/#{CGI.escape(Omnibus::PROJECT_PATH)}/pipelines/#{id}")
-    end
-
-    def wait!
-      loop do
-        raise "Pipeline timed out after waiting for #{duration} minutes!" if timeout?
-
-        case status
-        when :created, :pending, :running
-          print "."
-          sleep INTERVAL
-        when :success
-          puts "Omnibus pipeline succeeded in #{duration} minutes!"
-          break
-        else
-          raise "Omnibus pipeline did not succeed!"
-        end
-
-        STDOUT.flush
-      end
-    end
-
-    def timeout?
-      Time.now.to_i > (@start + MAX_DURATION)
-    end
-
-    def duration
-      (Time.now.to_i - @start) / 60
-    end
-
-    def status
-      req = Net::HTTP::Get.new(@uri)
-      req['PRIVATE-TOKEN'] = ENV['GITLAB_QA_ACCESS_TOKEN']
-
-      res = Net::HTTP.start(@uri.hostname, @uri.port, use_ssl: true) do |http|
-        http.request(req)
-      end
-
-      JSON.parse(res.body)['status'].to_s.to_sym
-    end
-  end
-end
-
-Omnibus::Trigger.new.invoke!.wait!
-- 
GitLab