Class: Danger::Jenkins

Inherits:
CI
  • Object
show all
Defined in:
lib/danger/ci_source/jenkins.rb

Overview

CI Setup

Ah Jenkins, so many memories. So, if you're using Jenkins, you're hosting your own environment.

GitHub

You will want to be using the GitHub pull request builder plugin in order to ensure that you have the build environment set up for PR integration.

With that set up, you can edit your job to add bundle exec danger at the build action.

Pipeline

If your're using pipelines you should be using the GitHub branch source plugin for easy setup and handling of PRs.

After you've set up the plugin, add a sh 'bundle exec danger' line in your pipeline script and make sure that build PRs is enabled.

GitLab

You will want to be using the GitLab Plugin in order to ensure that you have the build environment set up for MR integration.

With that set up, you can edit your job to add bundle exec danger at the build action.

General

People occasionally see issues with Danger not classing your CI runs as a PR, to give you visibility the Jenkins side of Danger expects to see one of these env vars:

  • ghprbPullId
  • CHANGE_ID
  • gitlabMergeRequestIid
  • gitlabMergeRequestId

Token Setup

GitHub

As you own the machine, it's up to you to add the environment variable for the DANGER_GITHUB_API_TOKEN.

GitLab

As you own the machine, it's up to you to add the environment variable for the DANGER_GITLAB_API_TOKEN.

Defined Under Namespace

Classes: EnvNotFound

Instance Attribute Summary collapse

Attributes inherited from CI

#pull_request_id, #repo_slug, #repo_url

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from CI

available_ci_sources, inherited, #supports?

Constructor Details

#initialize(env) ⇒ Jenkins

Returns a new instance of Jenkins.

Raises:



78
79
80
81
82
83
84
85
# File 'lib/danger/ci_source/jenkins.rb', line 78

def initialize(env)
  raise EnvNotFound.new if env.nil? || env.empty?

  self.repo_url = self.class.repo_url(env)
  self.pull_request_id = self.class.pull_request_id(env)
  self.repo_slug = self.class.repo_slug(self.repo_url)
  self.project_url = env["CI_MERGE_REQUEST_PROJECT_URL"] || env["CI_PROJECT_URL"]
end

Instance Attribute Details

#project_urlObject

Returns the value of attribute project_url.



52
53
54
# File 'lib/danger/ci_source/jenkins.rb', line 52

def project_url
  @project_url
end

Class Method Details

.pull_request_id(env) ⇒ Object



115
116
117
118
119
120
121
122
123
124
125
# File 'lib/danger/ci_source/jenkins.rb', line 115

def self.pull_request_id(env)
  if env["ghprbPullId"]
    env["ghprbPullId"]
  elsif env["CHANGE_ID"]
    env["CHANGE_ID"]
  elsif env["gitlabMergeRequestIid"]
    env["gitlabMergeRequestIid"]
  else
    env["gitlabMergeRequestId"]
  end
end

.repo_slug(repo_url) ⇒ Object



87
88
89
90
91
92
93
# File 'lib/danger/ci_source/jenkins.rb', line 87

def self.repo_slug(repo_url)
  slug = self.slug_ssh(repo_url)
  slug ||= self.slug_http(repo_url)
  slug ||= self.slug_bitbucket(repo_url)
  slug ||= self.slug_fallback(repo_url)
  return slug.gsub(/\.git$/, "") unless slug.nil?
end

.repo_url(env) ⇒ Object



127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/danger/ci_source/jenkins.rb', line 127

def self.repo_url(env)
  if env["GIT_URL_1"]
    env["GIT_URL_1"]
  elsif env["CHANGE_URL"]
    change_url = env["CHANGE_URL"]
    case change_url
    when %r{/pull/} # GitHub
      matches = change_url.match(%r{(.+)/pull/[0-9]+})
      matches[1] unless matches.nil?
    when %r{/merge_requests/} # GitLab
      matches = change_url.match(%r{(.+?)(/-)?/merge_requests/[0-9]+})
      matches[1] unless matches.nil?
    when %r{/pull-requests/} # Bitbucket
      matches = change_url.match(%r{(.+)/pull-requests/[0-9]+})
      matches[1] unless matches.nil?
    else
      change_url
    end
  else
    env["GIT_URL"]
  end
end

.slug_bitbucket(repo_url) ⇒ Object



95
96
97
98
# File 'lib/danger/ci_source/jenkins.rb', line 95

def self.slug_bitbucket(repo_url)
  repo_matches = repo_url.match(%r{(?:[/:])projects/([^/.]+)/repos/([^/.]+)})
  return "#{repo_matches[1]}/#{repo_matches[2]}" if repo_matches
end

.slug_fallback(repo_url) ⇒ Object



110
111
112
113
# File 'lib/danger/ci_source/jenkins.rb', line 110

def self.slug_fallback(repo_url)
  repo_matches = repo_url.match(%r{([/:])([^/]+/[^/]+)$})
  return repo_matches[2]
end

.slug_http(repo_url) ⇒ Object



105
106
107
108
# File 'lib/danger/ci_source/jenkins.rb', line 105

def self.slug_http(repo_url)
  repo_matches = repo_url.match(%r{^https?.+(?>\.\w*\d*/)(.+.git$)})
  return repo_matches[1] if repo_matches
end

.slug_ssh(repo_url) ⇒ Object



100
101
102
103
# File 'lib/danger/ci_source/jenkins.rb', line 100

def self.slug_ssh(repo_url)
  repo_matches = repo_url.match(/^git@.+:(.+)/)
  return repo_matches[1] if repo_matches
end

.validates_as_ci?(env) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'lib/danger/ci_source/jenkins.rb', line 60

def self.validates_as_ci?(env)
  env.key? "JENKINS_URL"
end

.validates_as_pr?(env) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
67
# File 'lib/danger/ci_source/jenkins.rb', line 64

def self.validates_as_pr?(env)
  id = pull_request_id(env)
  !id.nil? && !id.empty? && !!id.match(/^\d+$/)
end

Instance Method Details

#supported_request_sourcesObject



69
70
71
72
73
74
75
76
# File 'lib/danger/ci_source/jenkins.rb', line 69

def supported_request_sources
  @supported_request_sources ||= [
    Danger::RequestSources::GitHub,
    Danger::RequestSources::GitLab,
    Danger::RequestSources::BitbucketServer,
    Danger::RequestSources::BitbucketCloud
  ]
end