robopigeon 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +1 -3
- data/.version +1 -1
- data/CHANGELOG.md +18 -0
- data/LICENSE.txt +7 -0
- data/README.md +34 -131
- data/lib/robopigeon/dsl/base.rb +8 -0
- data/lib/robopigeon/dsl/initial_jobs.rb +9 -0
- data/lib/robopigeon/dsl/job.rb +10 -0
- data/lib/robopigeon/dsl.rb +6 -4
- data/lib/robopigeon/extend/cli.rb +34 -0
- data/lib/robopigeon/extend/template.rb +53 -0
- data/lib/robopigeon/extend/templates/default/.gitignore +16 -0
- data/lib/robopigeon/extend/templates/default/.gitlab-ci.yml +27 -0
- data/lib/robopigeon/extend/templates/default/.rubocop.yml +50 -0
- data/lib/robopigeon/extend/templates/default/.version +1 -0
- data/lib/robopigeon/extend/templates/default/Gemfile +6 -0
- data/lib/robopigeon/extend/templates/default/README.erb.md +35 -0
- data/lib/robopigeon/extend/templates/default/lib/robopigeon-extension/dsl.erb.rb +39 -0
- data/lib/robopigeon/extend/templates/default/lib/robopigeon-extension/helper_dsl.erb.rb +18 -0
- data/lib/robopigeon/extend/templates/default/lib/robopigeon-extension/version.erb.rb +5 -0
- data/lib/robopigeon/extend/templates/default/lib/robopigeon-extension.erb.rb +25 -0
- data/lib/robopigeon/extend/templates/default/robopigeon-extension.erb.gemspec +41 -0
- data/lib/robopigeon/extend/templates/default/spec/robopigeon-extension/dsl_spec.erb.rb +33 -0
- data/lib/robopigeon/extend/templates/default/spec/robopigeon-extension/helper_dsl_spec.erb.rb +14 -0
- data/lib/robopigeon/extend/templates/default/spec/spec_helper.erb.rb +18 -0
- data/lib/robopigeon/extend.rb +2 -0
- data/lib/robopigeon/gitlab/commit.rb +31 -0
- data/lib/robopigeon/gitlab/commit_dsl.rb +67 -0
- data/lib/robopigeon/gitlab/dsl.rb +11 -7
- data/lib/robopigeon/gitlab.rb +2 -0
- data/lib/robopigeon/jenkins/client.rb +18 -0
- data/lib/robopigeon/jenkins/dsl.rb +98 -0
- data/lib/robopigeon/jenkins/job.rb +69 -0
- data/lib/robopigeon/jenkins.rb +22 -0
- data/lib/robopigeon/jira/dsl.rb +7 -10
- data/lib/robopigeon/jira/helper_dsl.rb +13 -0
- data/lib/robopigeon/resources/initial_robopigeon.rb +55 -0
- data/lib/robopigeon/slack/attachments_dsl.rb +2 -2
- data/lib/robopigeon/slack/dsl.rb +1 -7
- data/lib/robopigeon.rb +2 -0
- data/robopigeon.gemspec +19 -15
- data/robopigeon.rb +55 -0
- metadata +121 -47
- data/lib/robopigeon/gitlab/jira.rb +0 -0
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'robopigeon-<%= extension_name_lower %>/helper_dsl'
|
2
|
+
require 'robopigeon-<%= extension_name_lower %>/dsl'
|
3
|
+
require 'robopigeon-<%= extension_name_lower %>/version'
|
4
|
+
|
5
|
+
module RoboPigeon::Dsl
|
6
|
+
module Helpers
|
7
|
+
include RoboPigeon::Dsl::Helpers::<%= extension_name_upper %>
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
module RoboPigeon::Dsl
|
12
|
+
class Root
|
13
|
+
def <%= extension_name_lower %>(&block)
|
14
|
+
RoboPigeon::Dsl::<%= extension_name_upper %>Root.run(&block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module RoboPigeon::Dsl
|
20
|
+
class Job
|
21
|
+
def <%= extension_name_lower %>(&block)
|
22
|
+
RoboPigeon::Dsl::<%= extension_name_upper %>.run(&block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
lib = File.expand_path('../lib', __FILE__)
|
2
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
+
require 'robopigeon-<%= extension_name_lower %>/version'
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = 'robopigeon-<%= extension_name_lower %>'
|
7
|
+
spec.version = RoboPigeon::<%= extension_name_upper %>::VERSION
|
8
|
+
spec.authors = ['<%= user_name %>']
|
9
|
+
spec.email = ['<%= user_email %>']
|
10
|
+
|
11
|
+
spec.summary = 'An extension for RoboPigeon for <%= extension_name_upper %>'
|
12
|
+
spec.description = 'TODO: Add a description'
|
13
|
+
spec.homepage = 'TODO: Add a homepage'
|
14
|
+
|
15
|
+
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
16
|
+
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
17
|
+
if spec.respond_to?(:metadata)
|
18
|
+
spec.metadata['homepage_uri'] = spec.homepage
|
19
|
+
spec.metadata['source_code_uri'] = 'TODO: Add source repo link'
|
20
|
+
else
|
21
|
+
raise 'RubyGems 2.0 or newer is required to protect against ' \
|
22
|
+
'public gem pushes.'
|
23
|
+
end
|
24
|
+
|
25
|
+
# Specify which files should be added to the gem when it is released.
|
26
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
27
|
+
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
28
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
29
|
+
end
|
30
|
+
spec.bindir = 'exe'
|
31
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
32
|
+
spec.require_paths = ['lib']
|
33
|
+
|
34
|
+
spec.add_dependency 'robopigeon'
|
35
|
+
|
36
|
+
spec.add_development_dependency 'bundler'
|
37
|
+
spec.add_development_dependency 'pry'
|
38
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
39
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
+
spec.add_development_dependency 'rubocop'
|
41
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RoboPigeon::Dsl::GitLabRoot do
|
4
|
+
subject { RoboPigeon::Dsl::Root }
|
5
|
+
|
6
|
+
context 'do_some_global_thing' do
|
7
|
+
it 'does some global thing' do
|
8
|
+
expect do
|
9
|
+
subject.run do
|
10
|
+
<%= extension_name_lower %> do
|
11
|
+
do_some_global_thing
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end.not_to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe RoboPigeon::Dsl::GitLab do
|
20
|
+
subject { RoboPigeon::Dsl::Job }
|
21
|
+
|
22
|
+
context 'do_something' do
|
23
|
+
it 'does some global thing' do
|
24
|
+
expect do
|
25
|
+
subject.run do
|
26
|
+
<%= extension_name_lower %> do
|
27
|
+
do_something
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end.not_to raise_error
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RoboPigeon::Dsl::Helpers::<%= extension_name_upper %> do
|
4
|
+
class <%= extension_name_upper %>HelperTest
|
5
|
+
include RoboPigeon::Dsl::Helpers::<%= extension_name_upper %>
|
6
|
+
end
|
7
|
+
subject { <%= extension_name_upper %>HelperTest.new }
|
8
|
+
|
9
|
+
context 'some_helper_dsl' do
|
10
|
+
it 'does something really cool!' do
|
11
|
+
expect(subject.some_helper_dsl).to eq('nothing happens here yet')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'bundler/setup'
|
3
|
+
require 'robopigeon'
|
4
|
+
require 'robopigeon-<%= extension_name_lower %>'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
# Enable flags like --only-failures and --next-failure
|
9
|
+
config.example_status_persistence_file_path = '.rspec_status'
|
10
|
+
|
11
|
+
config.expect_with :rspec do |c|
|
12
|
+
c.syntax = :expect
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def file_fixture(path)
|
17
|
+
File.join(Dir.pwd, 'spec', 'fixtures', path)
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module RoboPigeon::GitLab
|
2
|
+
class Commit
|
3
|
+
attr_accessor :files, :branch, :message, :author_name, :author_email
|
4
|
+
def initialize
|
5
|
+
self.files = []
|
6
|
+
self.author_name = ENV['GITLAB_USER_NAME']
|
7
|
+
self.author_email = ENV['GITLAB_USER_EMAIL']
|
8
|
+
self.branch = RoboPigeon::GitLab::Client.branch
|
9
|
+
end
|
10
|
+
|
11
|
+
def add_file(file, content=nil, method='update')
|
12
|
+
content ||= File.read(file)
|
13
|
+
files.push(action: method, file_path: file, content: content)
|
14
|
+
end
|
15
|
+
|
16
|
+
def client
|
17
|
+
RoboPigeon::GitLab::Client.client
|
18
|
+
end
|
19
|
+
|
20
|
+
def commit!
|
21
|
+
client.create_commit(
|
22
|
+
RoboPigeon::GitLab::Client.project,
|
23
|
+
branch,
|
24
|
+
message,
|
25
|
+
files,
|
26
|
+
author_name: author_name,
|
27
|
+
author_email: author_email
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'gitlab'
|
2
|
+
module RoboPigeon::Dsl
|
3
|
+
class GitLabCommit
|
4
|
+
attr_accessor :commit
|
5
|
+
def initialize
|
6
|
+
self.commit = RoboPigeon::GitLab::Commit.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.run(&block)
|
10
|
+
instance = new
|
11
|
+
instance.instance_eval(&block)
|
12
|
+
instance.commit.commit!
|
13
|
+
end
|
14
|
+
|
15
|
+
RoboPigeon::Documentarian.add_command(
|
16
|
+
'file',
|
17
|
+
block: %w[job gitlab commit],
|
18
|
+
params: [
|
19
|
+
{ name: 'path', type: 'String', desc: 'repo path of the file to add', example: 'app/config.rb' },
|
20
|
+
{ name: 'contents', type: 'Text', desc: 'the content of the file to add (optional)', example: 'here is the contents of my file', default: 'on disk contents of file' }
|
21
|
+
],
|
22
|
+
desc: 'add a file to the commit'
|
23
|
+
)
|
24
|
+
def file(path, content=nil)
|
25
|
+
method = File.exist?(path) ? 'update' : 'create'
|
26
|
+
commit.add_file(path, content, method)
|
27
|
+
end
|
28
|
+
|
29
|
+
RoboPigeon::Documentarian.add_command(
|
30
|
+
'message',
|
31
|
+
block: %w[job gitlab commit],
|
32
|
+
params: [
|
33
|
+
{ name: 'message', type: 'string', desc: 'message to use in the commit', example: 'A commit to end all commits!' }
|
34
|
+
],
|
35
|
+
desc: 'Set the message for the commit'
|
36
|
+
)
|
37
|
+
def message(message)
|
38
|
+
commit.message = message
|
39
|
+
end
|
40
|
+
|
41
|
+
RoboPigeon::Documentarian.add_command(
|
42
|
+
'author',
|
43
|
+
block: %w[job gitlab commit],
|
44
|
+
params: [
|
45
|
+
{ name: 'name', type: 'String', desc: 'name of the user who is making the commit', example: 'Robo Pigeon', default: "ENV['GITLAB_USER_NAME']" },
|
46
|
+
{ name: 'email', type: 'String', desc: 'email of the user who is making the commit', example: 'robo.pigeon@example.com', default: "ENV['GITLAB_USER_EMAIL']" }
|
47
|
+
],
|
48
|
+
desc: 'set the author name and email address.'
|
49
|
+
)
|
50
|
+
def author(name, email)
|
51
|
+
commit.author_email = email
|
52
|
+
commit.author_name = name
|
53
|
+
end
|
54
|
+
|
55
|
+
RoboPigeon::Documentarian.add_command(
|
56
|
+
'branch',
|
57
|
+
block: %w[job gitlab commit],
|
58
|
+
params: [
|
59
|
+
{ name: 'name', type: 'String', desc: 'name of the branch to commit to', example: 'master', defautl: "ENV['CI_COMMIT_REF_NAME']" }
|
60
|
+
],
|
61
|
+
desc: 'Set the branch to commit to'
|
62
|
+
)
|
63
|
+
def branch(name)
|
64
|
+
commit.branch = name
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -1,11 +1,6 @@
|
|
1
1
|
require 'gitlab'
|
2
2
|
module RoboPigeon::Dsl
|
3
|
-
class GitLabRoot
|
4
|
-
def self.run(&block)
|
5
|
-
gitlab = RoboPigeon::Dsl::GitLabRoot.new
|
6
|
-
gitlab.instance_eval(&block)
|
7
|
-
end
|
8
|
-
|
3
|
+
class GitLabRoot < RoboPigeon::Dsl::Base
|
9
4
|
RoboPigeon::Documentarian.add_command(
|
10
5
|
'enabled',
|
11
6
|
block: ['gitlab'],
|
@@ -81,7 +76,6 @@ module RoboPigeon::Dsl
|
|
81
76
|
|
82
77
|
class GitLab < GitLabRoot
|
83
78
|
attr_accessor :merge_request
|
84
|
-
include RoboPigeon::Dsl::Helpers
|
85
79
|
|
86
80
|
def self.run(&block)
|
87
81
|
if RoboPigeon::GitLab::Client.enabled
|
@@ -170,5 +164,15 @@ module RoboPigeon::Dsl
|
|
170
164
|
def merge_merge_request
|
171
165
|
merge_request.merge!
|
172
166
|
end
|
167
|
+
|
168
|
+
RoboPigeon::Documentarian.add_block(
|
169
|
+
'commit',
|
170
|
+
helpers: true,
|
171
|
+
block: %w[job gitlab],
|
172
|
+
desc: 'Create a commit on a branch'
|
173
|
+
)
|
174
|
+
def commit(&block)
|
175
|
+
RoboPigeon::GitLab::Commit.run(&block)
|
176
|
+
end
|
173
177
|
end
|
174
178
|
end
|
data/lib/robopigeon/gitlab.rb
CHANGED
@@ -3,8 +3,10 @@ RoboPigeon::Documentarian.add_block('gitlab', helpers: true, block: ['job'], des
|
|
3
3
|
|
4
4
|
require 'robopigeon/gitlab/dsl'
|
5
5
|
require 'robopigeon/gitlab/client'
|
6
|
+
require 'robopigeon/gitlab/commit'
|
6
7
|
require 'robopigeon/gitlab/merge_request'
|
7
8
|
require 'robopigeon/gitlab/helper_dsl'
|
9
|
+
require 'robopigeon/gitlab/commit_dsl'
|
8
10
|
|
9
11
|
module RoboPigeon::Dsl
|
10
12
|
module Helpers
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'jenkins_api_client'
|
2
|
+
|
3
|
+
module RoboPigeon::Jenkins
|
4
|
+
class Client
|
5
|
+
@enabled = true
|
6
|
+
|
7
|
+
class << self
|
8
|
+
attr_accessor :url, :user, :token, :enabled
|
9
|
+
def client
|
10
|
+
@client ||= JenkinsApi::Client.new(
|
11
|
+
server_url: url,
|
12
|
+
username: user,
|
13
|
+
password: token
|
14
|
+
)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module RoboPigeon::Dsl
|
2
|
+
class JenkinsRoot
|
3
|
+
def self.run(&block)
|
4
|
+
instance = new
|
5
|
+
instance.instance_eval(&block)
|
6
|
+
end
|
7
|
+
|
8
|
+
RoboPigeon::Documentarian.add_command(
|
9
|
+
'enabled',
|
10
|
+
block: ['jenkins'],
|
11
|
+
params: [
|
12
|
+
{ name: 'enabled', type: 'boolean', desc: 'should it run Jenkins commands', example: 'false', default: 'true' }
|
13
|
+
],
|
14
|
+
desc: 'Set whether or not to run Jenkins commands, defaults to true'
|
15
|
+
)
|
16
|
+
def enabled(bool)
|
17
|
+
RoboPigeon::Jenkins::Client.enabled = bool
|
18
|
+
end
|
19
|
+
|
20
|
+
RoboPigeon::Documentarian.add_command(
|
21
|
+
'api_url',
|
22
|
+
block: ['jenkins'],
|
23
|
+
params: [
|
24
|
+
{ name: 'url', type: 'String', desc: 'jenkins server url', example: 'https://jenkins.example.com' }
|
25
|
+
],
|
26
|
+
desc: 'Set the url for your jenkins server'
|
27
|
+
)
|
28
|
+
def api_url(url)
|
29
|
+
RoboPigeon::Jenkins::Client.url = url
|
30
|
+
end
|
31
|
+
|
32
|
+
RoboPigeon::Documentarian.add_command(
|
33
|
+
'api_user',
|
34
|
+
block: ['jenkins'],
|
35
|
+
params: [
|
36
|
+
{ name: 'user', type: 'String', desc: 'jenkins server user', example: 'pigeon' }
|
37
|
+
],
|
38
|
+
desc: 'Set the user for your jenkins server'
|
39
|
+
)
|
40
|
+
def api_user(user)
|
41
|
+
RoboPigeon::Jenkins::Client.user = user
|
42
|
+
end
|
43
|
+
|
44
|
+
RoboPigeon::Documentarian.add_command(
|
45
|
+
'api_key',
|
46
|
+
block: ['jenkins'],
|
47
|
+
params: [
|
48
|
+
{ name: 'token', type: 'String', desc: 'jenkins server token', example: '9eNVDMWuY3zf0DZ5yxLH9Q' }
|
49
|
+
],
|
50
|
+
desc: 'Set the token for your jenkins server'
|
51
|
+
)
|
52
|
+
def api_key(token)
|
53
|
+
RoboPigeon::Jenkins::Client.token = token
|
54
|
+
end
|
55
|
+
end
|
56
|
+
class Jenkins
|
57
|
+
attr_accessor :job
|
58
|
+
def initialize
|
59
|
+
self.job = RoboPigeon::Jenkins::Job.new
|
60
|
+
end
|
61
|
+
|
62
|
+
def self.run(run_now = true, &block)
|
63
|
+
if RoboPigeon::Jenkins::Client.enabled
|
64
|
+
instance = new
|
65
|
+
instance.instance_eval(&block)
|
66
|
+
instance.job.build_and_watch! if run_now
|
67
|
+
instance.job
|
68
|
+
else
|
69
|
+
puts 'Jenkins is disabled, please remove `enabled false` from your global jenkins config'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
RoboPigeon::Documentarian.add_command(
|
74
|
+
'param',
|
75
|
+
block: ['jenkins'],
|
76
|
+
params: [
|
77
|
+
{ name: 'key', type: 'String', desc: 'the key for the parameter to set', example: 'BUILD_PARAM' },
|
78
|
+
{ name: 'value', type: 'String', desc: 'the value for the parameter to set', example: '42' }
|
79
|
+
],
|
80
|
+
desc: 'Add a parameter to the job'
|
81
|
+
)
|
82
|
+
def param(key, value)
|
83
|
+
job.params[key] = value
|
84
|
+
end
|
85
|
+
|
86
|
+
def start_timeout(seconds)
|
87
|
+
job.start_timeout = seconds
|
88
|
+
end
|
89
|
+
|
90
|
+
def name(name)
|
91
|
+
job.name = name
|
92
|
+
end
|
93
|
+
|
94
|
+
def completion_timeout(seconds)
|
95
|
+
job.build_timeout = seconds
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module RoboPigeon::Jenkins
|
2
|
+
class Failure < StandardError; end
|
3
|
+
class Job
|
4
|
+
DEFAULT_START_TIMEOUT = (45 * 60) # 45 minutes
|
5
|
+
attr_accessor :build_timeout, :name, :params, :poll_interval, :build_opts, :logs, :jid
|
6
|
+
def initialize
|
7
|
+
self.build_timeout = 60 * 60 # 60 minutes in seconds
|
8
|
+
self.params = {}
|
9
|
+
self.poll_interval = 10
|
10
|
+
self.build_opts = {
|
11
|
+
'build_start_timeout' => DEFAULT_START_TIMEOUT,
|
12
|
+
'cancel_on_build_start_timeout' => true
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def client
|
17
|
+
RoboPigeon::Jenkins::Client.client
|
18
|
+
end
|
19
|
+
|
20
|
+
def start_timeout=(timeout)
|
21
|
+
build_opts['build_start_timeout'] = timeout
|
22
|
+
end
|
23
|
+
|
24
|
+
def job_url(jid)
|
25
|
+
"#{RoboPigeon::Jenkins::Client.url}/jobs/#{name}/#{jid}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_and_watch!
|
29
|
+
self.jid = client.job.build(name, params.to_h, build_opts)
|
30
|
+
puts "Created jenkins job: #{job_url(jid)}"
|
31
|
+
|
32
|
+
watch_build
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def watch_build(iteration=0)
|
38
|
+
if iteration * poll_interval > build_timeout
|
39
|
+
output_logs(jid)
|
40
|
+
raise Timeout::Error, "Build timed out, see logs or look at #{job_url(jid)}" unless job_success?(jid)
|
41
|
+
elsif job_complete?(jid)
|
42
|
+
output_logs(jid)
|
43
|
+
raise RoboPigeon::Jenkins::Failure, "Build did not complete successfully, see logs or look at #{job_url(jid)}" unless job_success?(jid)
|
44
|
+
|
45
|
+
return
|
46
|
+
end
|
47
|
+
|
48
|
+
puts "Job not yet complete, Run time: #{(iteration * poll_interval / 60.0).round(2)} minutes"
|
49
|
+
sleep poll_interval
|
50
|
+
watch_build(iteration + 1)
|
51
|
+
end
|
52
|
+
|
53
|
+
def job_complete?(jid)
|
54
|
+
return true if client.job.get_build_details(name, jid)['result'] == 'SUCCESS'
|
55
|
+
return true if client.job.get_build_details(name, jid)['result'] == 'FAILURE'
|
56
|
+
|
57
|
+
false
|
58
|
+
end
|
59
|
+
|
60
|
+
def output_logs(jid)
|
61
|
+
self.logs = client.api_get_request("/job/#{name}/#{jid}/consoleText", nil, '')
|
62
|
+
puts logs
|
63
|
+
end
|
64
|
+
|
65
|
+
def job_success?(jid)
|
66
|
+
client.job.get_build_details(name, jid)['result'] == 'SUCCESS'
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
RoboPigeon::Documentarian.add_block('jenkins', helpers: true, block: [], desc: 'a configuration block for jenkins')
|
2
|
+
RoboPigeon::Documentarian.add_block('jenkins', helpers: true, block: ['job'], desc: 'configure a jenkins job to create, run, and watch')
|
3
|
+
|
4
|
+
require 'robopigeon/jenkins/client'
|
5
|
+
require 'robopigeon/jenkins/job'
|
6
|
+
require 'robopigeon/jenkins/dsl'
|
7
|
+
|
8
|
+
module RoboPigeon::Dsl
|
9
|
+
class Root
|
10
|
+
def jenkins(&block)
|
11
|
+
RoboPigeon::Dsl::JenkinsRoot.run(&block)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
module RoboPigeon::Dsl
|
17
|
+
class Job
|
18
|
+
def jenkins(&block)
|
19
|
+
RoboPigeon::Dsl::Jenkins.run(&block)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/robopigeon/jira/dsl.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
module RoboPigeon::Dsl
|
2
|
-
class JiraRoot
|
3
|
-
def self.run(&block)
|
4
|
-
jira = RoboPigeon::Dsl::JiraRoot.new
|
5
|
-
jira.instance_eval(&block)
|
6
|
-
end
|
7
|
-
|
2
|
+
class JiraRoot < RoboPigeon::Dsl::Base
|
8
3
|
RoboPigeon::Documentarian.add_command(
|
9
4
|
'enabled',
|
10
5
|
block: ['jira'],
|
@@ -43,11 +38,13 @@ module RoboPigeon::Dsl
|
|
43
38
|
end
|
44
39
|
|
45
40
|
class Jira < JiraRoot
|
46
|
-
include RoboPigeon::Dsl::Helpers
|
47
|
-
|
48
41
|
def self.run(&block)
|
49
|
-
|
50
|
-
|
42
|
+
if RoboPigeon::Jira::Client.enabled
|
43
|
+
jira = RoboPigeon::Dsl::Jira.new
|
44
|
+
jira.instance_eval(&block)
|
45
|
+
else
|
46
|
+
puts 'Jira is disabled, please remove `enabled false` from your global jira config'
|
47
|
+
end
|
51
48
|
end
|
52
49
|
|
53
50
|
RoboPigeon::Documentarian.add_block(
|
@@ -19,6 +19,19 @@ module RoboPigeon::Dsl
|
|
19
19
|
jira_url = RoboPigeon::Jira::Client.api_url
|
20
20
|
"<#{issue_id}|#{jira_url}/browse/#{issue_id}>"
|
21
21
|
end
|
22
|
+
|
23
|
+
RoboPigeon::Documentarian.add_command(
|
24
|
+
'jira_issue_slack_link',
|
25
|
+
params: [
|
26
|
+
{ name: 'issue_id', type: 'String', desc: 'Issue to link to', example: 'TICK-1234' }
|
27
|
+
],
|
28
|
+
block: ['helpers'],
|
29
|
+
desc: 'Returns a slack formatted link to the last created ticket.'
|
30
|
+
)
|
31
|
+
def jira_slack_link(issue_id)
|
32
|
+
jira_url = RoboPigeon::Jira::Client.api_url
|
33
|
+
"<#{issue_id}|#{jira_url}/browse/#{issue_id}>"
|
34
|
+
end
|
22
35
|
end
|
23
36
|
end
|
24
37
|
end
|
@@ -31,6 +31,56 @@ jira do
|
|
31
31
|
api_key ENV['JIRA_API_TOKEN'] # Always use an envrionment variable, don't check in secrets.
|
32
32
|
end
|
33
33
|
|
34
|
+
jenkins do
|
35
|
+
# Jira is currently disabled, make sure you have a valid api token with acces to
|
36
|
+
# to your repo, then remove the following line
|
37
|
+
enabled false
|
38
|
+
# This is where you configure your global jenkins settings, like api url and api token
|
39
|
+
# always keep your api key either in an environment variable or encrypted with
|
40
|
+
# something like `encryptatron` or rails secrets.
|
41
|
+
api_url 'https://jenkins.example.com'
|
42
|
+
api_user ENV['JENKINS_USER']
|
43
|
+
api_key ENV['JENKINS_TOKEN']
|
44
|
+
end
|
45
|
+
|
46
|
+
# This job is an example of updating and tagging a new version of your project
|
47
|
+
job 'update_version', 'Used to update the version to a new one!' do
|
48
|
+
gitlab do
|
49
|
+
# Creates a commit
|
50
|
+
commit do
|
51
|
+
# Check in updated report file that helps split tests.
|
52
|
+
file 'spec/knapsack_report.json'
|
53
|
+
# Check in this version file with the contents of a new verison number
|
54
|
+
file '.version', ENV['NEW_VERSION_NUMBER']
|
55
|
+
|
56
|
+
# You can configure a message for the commit too
|
57
|
+
message "Updating version to #{ENV['NEW_VERSION_NUMBER']}"
|
58
|
+
# And the author's name and email address (also can be auto-pulled from git)
|
59
|
+
author 'Deployment Pigeon', 'pigeon@ives.dev'
|
60
|
+
# What branch to commit to
|
61
|
+
branch 'master'
|
62
|
+
end
|
63
|
+
|
64
|
+
# Now, tag that commit with the new version!
|
65
|
+
create_tag('master', ENV['NEW_VERSION_NUMBER'], "Updating version to #{ENV['NEW_VERSION_NUMBER']}")
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# Here's an example job that runs something in jenkins.
|
70
|
+
job 'run_in_jenkins', 'Run a job in jenkins and make sure it passes' do
|
71
|
+
# The jenkins block takes arguments to configure an existing job, you have
|
72
|
+
# to at least specify a job name, and then everything else should be
|
73
|
+
# configured through parameters.
|
74
|
+
jenkins do
|
75
|
+
# This tells the job to run a job in jenkins named 'robopigoen-test'
|
76
|
+
name 'robopigeon-test'
|
77
|
+
# This tells it to set a parameter called 'BRANCH' to the branch from gitlab ci
|
78
|
+
param 'BRANCH', ENV['CI_COMMIT_REF_NAME']
|
79
|
+
end
|
80
|
+
# At this point the job will execute and then output the log to standard out so
|
81
|
+
# so you can keep a consistent log
|
82
|
+
end
|
83
|
+
|
34
84
|
job 'deploy_complete', 'Notify slack and comment in gitlab that a deploy is complete' do
|
35
85
|
# This configures a slack notification, at the end of the block it sends to
|
36
86
|
# the users and channels in the body. Un-comment the channels and fill in the
|
@@ -109,11 +159,16 @@ job 'create ticket' do
|
|
109
159
|
# Print out the ticket number for logging/deubgging
|
110
160
|
puts 'Created ticket:'
|
111
161
|
print_id
|
162
|
+
|
163
|
+
# This transitions the ticket using a transition called 'Start Work'
|
164
|
+
transition 'Start Work'
|
112
165
|
end
|
113
166
|
end
|
114
167
|
|
168
|
+
# Then it sends a notification in slack wit the link to the ticket
|
115
169
|
slack do
|
116
170
|
user ENV['GITLAB_USER_EMAIL']
|
171
|
+
# That helper gives you a slack formatted link for the jira ticket
|
117
172
|
message "Created #{jira_last_created_ticket_slack_link}"
|
118
173
|
end
|
119
174
|
end
|
@@ -25,7 +25,7 @@ module RoboPigeon::Dsl
|
|
25
25
|
attachment[:title] = title
|
26
26
|
end
|
27
27
|
|
28
|
-
RoboPigeon::Documentarian.add_command('title_linke', block: %w[job slack attachment], params: [{ name: 'link', type: 'String', desc: 'a url', example: 'https://gitlab.com/
|
28
|
+
RoboPigeon::Documentarian.add_command('title_linke', block: %w[job slack attachment], params: [{ name: 'link', type: 'String', desc: 'a url', example: 'https://gitlab.com/pigeons/robopigeon/pipelines' }], desc: 'Add a link to the title so that users can click on it')
|
29
29
|
def title_link(title_link)
|
30
30
|
attachment[:title_link] = title_link
|
31
31
|
end
|
@@ -46,7 +46,7 @@ module RoboPigeon::Dsl
|
|
46
46
|
params: [
|
47
47
|
{ name: 'type', type: 'String', desc: 'Currently only supports `button`', example: 'button' },
|
48
48
|
{ name: 'text', type: 'String', desc: 'Field label', example: 'Pipeline' },
|
49
|
-
{ name: 'url', type: 'String', desc: 'Url to link to', example: 'https://gitlab.com/
|
49
|
+
{ name: 'url', type: 'String', desc: 'Url to link to', example: 'https://gitlab.com/pigeons/robopigeon/pipelines' },
|
50
50
|
{ name: 'style', type: 'String', desc: 'button style, can be danger or primary', example: 'danger', defaut: 'nil' }
|
51
51
|
],
|
52
52
|
desc: 'Add a Url linked button to your bot'
|
data/lib/robopigeon/slack/dsl.rb
CHANGED
@@ -1,10 +1,5 @@
|
|
1
1
|
module RoboPigeon::Dsl
|
2
|
-
class SlackRoot
|
3
|
-
def self.run(&block)
|
4
|
-
slack = RoboPigeon::Dsl::SlackRoot.new
|
5
|
-
slack.instance_eval(&block)
|
6
|
-
end
|
7
|
-
|
2
|
+
class SlackRoot < RoboPigeon::Dsl::Base
|
8
3
|
RoboPigeon::Documentarian.add_command(
|
9
4
|
'enabled',
|
10
5
|
block: ['slack'],
|
@@ -34,7 +29,6 @@ module RoboPigeon::Dsl
|
|
34
29
|
end
|
35
30
|
|
36
31
|
class Slack < SlackRoot
|
37
|
-
include RoboPigeon::Dsl::Helpers
|
38
32
|
attr_accessor :message
|
39
33
|
|
40
34
|
def self.run(&block)
|
data/lib/robopigeon.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
require 'robopigeon/documentarian'
|
2
2
|
require 'robopigeon/dsl'
|
3
|
+
require 'robopigeon/extend'
|
3
4
|
require 'robopigeon/git'
|
4
5
|
require 'robopigeon/gitlab'
|
6
|
+
require 'robopigeon/jenkins'
|
5
7
|
require 'robopigeon/jira'
|
6
8
|
require 'robopigeon/markdown'
|
7
9
|
require 'robopigeon/slack'
|