diff options
author | Grzegorz Bizon <grzegorz@gitlab.com> | 2017-11-24 15:54:35 +0000 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2017-11-24 15:54:35 +0000 |
commit | 2998b88603ef8e173f07c475f381f814f83e8497 (patch) | |
tree | 8e35b5f243c7e4a94f95e623b3a50de725431d3b | |
parent | 7c1e54d58d7ee0308b865d9563f1dfeb54568e16 (diff) | |
download | gitlab-ce-2998b88603ef8e173f07c475f381f814f83e8497.tar.gz |
Add a feedback mechanism to `package-qa` manual action
-rw-r--r-- | .gitlab-ci.yml | 4 | ||||
-rwxr-xr-x | scripts/trigger-build-omnibus | 107 |
2 files changed, 91 insertions, 20 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2f149ef9a35..52e21152dd2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -152,8 +152,10 @@ stages: - master@gitlab/gitlabhq - master@gitlab/gitlab-ee +## # Trigger a package build in omnibus-gitlab repository -build-package: +# +package-qa: image: ruby:2.4-alpine before_script: [] stage: build diff --git a/scripts/trigger-build-omnibus b/scripts/trigger-build-omnibus index dcda70d7ed8..0c662ac19d2 100755 --- a/scripts/trigger-build-omnibus +++ b/scripts/trigger-build-omnibus @@ -2,26 +2,95 @@ require 'net/http' require 'json' +require 'cgi' -uri = URI('https://gitlab.com/api/v4/projects/20699/trigger/pipeline') -params = { - "ref" => ENV["OMNIBUS_BRANCH"] || "master", - "token" => ENV["BUILD_TRIGGER_TOKEN"], - "variables[GITLAB_VERSION]" => ENV["CI_COMMIT_SHA"], - "variables[ALTERNATIVE_SOURCES]" => true, - "variables[ee]" => ENV["EE_PACKAGE"] || "false" -} - -Dir.glob("*_VERSION").each do |version_file| - params["variables[#{version_file}]"] = File.read(version_file).strip -end +module Omnibus + PROJECT_PATH = 'gitlab-org/omnibus-gitlab'.freeze + + class Trigger + TOKEN = ENV['BUILD_TRIGGER_TOKEN'] + + 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}" + else + raise "Trigger failed! The response from the trigger is: #{res.body}" + end + + Omnibus::Pipeline.new(id) + end + + private + + def env_params + { + "ref" => ENV["OMNIBUS_BRANCH"] || "master", + "variables[GITLAB_VERSION]" => ENV["CI_COMMIT_SHA"], + "variables[ALTERNATIVE_SOURCES]" => true, + "variables[ee]" => ENV["EE_PACKAGE"] || "false" + } + 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 -res = Net::HTTP.post_form(uri, params) -pipeline_id = JSON.parse(res.body)['id'] + class Pipeline + INTERVAL = 60 # seconds + MAX_DURATION = 3600 * 3 # 3 hours -unless pipeline_id.nil? - puts "Triggered pipeline can be found at https://gitlab.com/gitlab-org/omnibus-gitlab/pipelines/#{pipeline_id}" -else - puts "Trigger failed. The response from trigger is: " - puts res.body + 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 timeout!' if timeout? + + case status + when :pending, :running + puts "Waiting another #{INTERVAL} seconds ..." + sleep INTERVAL + when :success + puts "Omnibus pipeline succeeded!" + break + else + raise "Omnibus pipeline did not succeed!" + end + + STDOUT.flush + end + end + + def timeout? + Time.now.to_i > (@start + MAX_DURATION) + 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! |