summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzegorz@gitlab.com>2017-11-24 15:54:35 +0000
committerRémy Coutable <remy@rymai.me>2017-11-24 15:54:35 +0000
commit2998b88603ef8e173f07c475f381f814f83e8497 (patch)
tree8e35b5f243c7e4a94f95e623b3a50de725431d3b
parent7c1e54d58d7ee0308b865d9563f1dfeb54568e16 (diff)
downloadgitlab-ce-2998b88603ef8e173f07c475f381f814f83e8497.tar.gz
Add a feedback mechanism to `package-qa` manual action
-rw-r--r--.gitlab-ci.yml4
-rwxr-xr-xscripts/trigger-build-omnibus107
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!