danger 8.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +94 -0
  4. data/bin/danger +5 -0
  5. data/lib/assets/DangerfileTemplate +13 -0
  6. data/lib/danger.rb +44 -0
  7. data/lib/danger/ci_source/appcenter.rb +55 -0
  8. data/lib/danger/ci_source/appveyor.rb +60 -0
  9. data/lib/danger/ci_source/azure_pipelines.rb +44 -0
  10. data/lib/danger/ci_source/bamboo.rb +41 -0
  11. data/lib/danger/ci_source/bitbucket_pipelines.rb +37 -0
  12. data/lib/danger/ci_source/bitrise.rb +65 -0
  13. data/lib/danger/ci_source/buddybuild.rb +62 -0
  14. data/lib/danger/ci_source/buildkite.rb +51 -0
  15. data/lib/danger/ci_source/ci_source.rb +37 -0
  16. data/lib/danger/ci_source/circle.rb +94 -0
  17. data/lib/danger/ci_source/circle_api.rb +51 -0
  18. data/lib/danger/ci_source/cirrus.rb +31 -0
  19. data/lib/danger/ci_source/code_build.rb +57 -0
  20. data/lib/danger/ci_source/codefresh.rb +53 -0
  21. data/lib/danger/ci_source/codeship.rb +44 -0
  22. data/lib/danger/ci_source/dotci.rb +52 -0
  23. data/lib/danger/ci_source/drone.rb +71 -0
  24. data/lib/danger/ci_source/github_actions.rb +43 -0
  25. data/lib/danger/ci_source/gitlab_ci.rb +86 -0
  26. data/lib/danger/ci_source/jenkins.rb +149 -0
  27. data/lib/danger/ci_source/local_git_repo.rb +119 -0
  28. data/lib/danger/ci_source/local_only_git_repo.rb +47 -0
  29. data/lib/danger/ci_source/screwdriver.rb +47 -0
  30. data/lib/danger/ci_source/semaphore.rb +37 -0
  31. data/lib/danger/ci_source/support/commits.rb +17 -0
  32. data/lib/danger/ci_source/support/find_repo_info_from_logs.rb +35 -0
  33. data/lib/danger/ci_source/support/find_repo_info_from_url.rb +42 -0
  34. data/lib/danger/ci_source/support/local_pull_request.rb +14 -0
  35. data/lib/danger/ci_source/support/no_pull_request.rb +7 -0
  36. data/lib/danger/ci_source/support/no_repo_info.rb +5 -0
  37. data/lib/danger/ci_source/support/pull_request_finder.rb +179 -0
  38. data/lib/danger/ci_source/support/remote_pull_request.rb +15 -0
  39. data/lib/danger/ci_source/support/repo_info.rb +10 -0
  40. data/lib/danger/ci_source/surf.rb +37 -0
  41. data/lib/danger/ci_source/teamcity.rb +159 -0
  42. data/lib/danger/ci_source/travis.rb +51 -0
  43. data/lib/danger/ci_source/vsts.rb +73 -0
  44. data/lib/danger/ci_source/xcode_server.rb +48 -0
  45. data/lib/danger/clients/rubygems_client.rb +14 -0
  46. data/lib/danger/commands/dangerfile/gem.rb +43 -0
  47. data/lib/danger/commands/dangerfile/init.rb +30 -0
  48. data/lib/danger/commands/dry_run.rb +54 -0
  49. data/lib/danger/commands/init.rb +297 -0
  50. data/lib/danger/commands/init_helpers/interviewer.rb +92 -0
  51. data/lib/danger/commands/local.rb +83 -0
  52. data/lib/danger/commands/local_helpers/http_cache.rb +36 -0
  53. data/lib/danger/commands/local_helpers/local_setup.rb +46 -0
  54. data/lib/danger/commands/local_helpers/pry_setup.rb +31 -0
  55. data/lib/danger/commands/plugins/plugin_json.rb +46 -0
  56. data/lib/danger/commands/plugins/plugin_lint.rb +54 -0
  57. data/lib/danger/commands/plugins/plugin_readme.rb +45 -0
  58. data/lib/danger/commands/pr.rb +92 -0
  59. data/lib/danger/commands/runner.rb +94 -0
  60. data/lib/danger/commands/staging.rb +53 -0
  61. data/lib/danger/commands/systems.rb +43 -0
  62. data/lib/danger/comment_generators/bitbucket_server.md.erb +20 -0
  63. data/lib/danger/comment_generators/bitbucket_server_inline.md.erb +15 -0
  64. data/lib/danger/comment_generators/bitbucket_server_message_group.md.erb +12 -0
  65. data/lib/danger/comment_generators/github.md.erb +55 -0
  66. data/lib/danger/comment_generators/github_inline.md.erb +26 -0
  67. data/lib/danger/comment_generators/gitlab.md.erb +40 -0
  68. data/lib/danger/comment_generators/gitlab_inline.md.erb +26 -0
  69. data/lib/danger/comment_generators/vsts.md.erb +20 -0
  70. data/lib/danger/core_ext/file_list.rb +18 -0
  71. data/lib/danger/core_ext/string.rb +20 -0
  72. data/lib/danger/danger_core/dangerfile.rb +341 -0
  73. data/lib/danger/danger_core/dangerfile_dsl.rb +29 -0
  74. data/lib/danger/danger_core/dangerfile_generator.rb +11 -0
  75. data/lib/danger/danger_core/environment_manager.rb +123 -0
  76. data/lib/danger/danger_core/executor.rb +92 -0
  77. data/lib/danger/danger_core/message_aggregator.rb +49 -0
  78. data/lib/danger/danger_core/message_group.rb +68 -0
  79. data/lib/danger/danger_core/messages/base.rb +56 -0
  80. data/lib/danger/danger_core/messages/markdown.rb +42 -0
  81. data/lib/danger/danger_core/messages/violation.rb +54 -0
  82. data/lib/danger/danger_core/plugins/dangerfile_bitbucket_cloud_plugin.rb +144 -0
  83. data/lib/danger/danger_core/plugins/dangerfile_bitbucket_server_plugin.rb +211 -0
  84. data/lib/danger/danger_core/plugins/dangerfile_danger_plugin.rb +248 -0
  85. data/lib/danger/danger_core/plugins/dangerfile_git_plugin.rb +158 -0
  86. data/lib/danger/danger_core/plugins/dangerfile_github_plugin.rb +254 -0
  87. data/lib/danger/danger_core/plugins/dangerfile_gitlab_plugin.rb +240 -0
  88. data/lib/danger/danger_core/plugins/dangerfile_local_only_plugin.rb +42 -0
  89. data/lib/danger/danger_core/plugins/dangerfile_messaging_plugin.rb +218 -0
  90. data/lib/danger/danger_core/plugins/dangerfile_vsts_plugin.rb +191 -0
  91. data/lib/danger/danger_core/standard_error.rb +143 -0
  92. data/lib/danger/helpers/array_subclass.rb +61 -0
  93. data/lib/danger/helpers/comment.rb +32 -0
  94. data/lib/danger/helpers/comments_helper.rb +178 -0
  95. data/lib/danger/helpers/comments_parsing_helper.rb +70 -0
  96. data/lib/danger/helpers/emoji_mapper.rb +41 -0
  97. data/lib/danger/helpers/find_max_num_violations.rb +31 -0
  98. data/lib/danger/helpers/message_groups_array_helper.rb +31 -0
  99. data/lib/danger/plugin_support/gems_resolver.rb +77 -0
  100. data/lib/danger/plugin_support/plugin.rb +49 -0
  101. data/lib/danger/plugin_support/plugin_file_resolver.rb +30 -0
  102. data/lib/danger/plugin_support/plugin_linter.rb +161 -0
  103. data/lib/danger/plugin_support/plugin_parser.rb +199 -0
  104. data/lib/danger/plugin_support/templates/readme_table.html.erb +26 -0
  105. data/lib/danger/request_sources/bitbucket_cloud.rb +171 -0
  106. data/lib/danger/request_sources/bitbucket_cloud_api.rb +181 -0
  107. data/lib/danger/request_sources/bitbucket_server.rb +105 -0
  108. data/lib/danger/request_sources/bitbucket_server_api.rb +117 -0
  109. data/lib/danger/request_sources/github/github.rb +530 -0
  110. data/lib/danger/request_sources/github/github_review.rb +126 -0
  111. data/lib/danger/request_sources/github/github_review_resolver.rb +19 -0
  112. data/lib/danger/request_sources/github/github_review_unsupported.rb +25 -0
  113. data/lib/danger/request_sources/gitlab.rb +525 -0
  114. data/lib/danger/request_sources/local_only.rb +53 -0
  115. data/lib/danger/request_sources/request_source.rb +85 -0
  116. data/lib/danger/request_sources/support/get_ignored_violation.rb +17 -0
  117. data/lib/danger/request_sources/vsts.rb +118 -0
  118. data/lib/danger/request_sources/vsts_api.rb +138 -0
  119. data/lib/danger/scm_source/git_repo.rb +181 -0
  120. data/lib/danger/version.rb +4 -0
  121. metadata +339 -0
@@ -0,0 +1,62 @@
1
+ module Danger
2
+ # ### CI Setup
3
+ #
4
+ # Read how you can setup Danger on the buddybuild blog:
5
+ # https://www.buddybuild.com/blog/using-danger-with-buddybuild/
6
+ #
7
+ # ### Token Setup
8
+ #
9
+ # Login to buddybuild and select your app. Go to your *App Settings* and
10
+ # in the *Build Settings* menu on the left, choose *Environment Variables*.
11
+ # http://docs.buddybuild.com/docs/environment-variables
12
+ #
13
+ # #### GitHub
14
+ # Add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV.
15
+ #
16
+ # #### GitLab
17
+ # Add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV.
18
+ #
19
+ # #### Bitbucket Cloud
20
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
21
+ # to your build user's ENV.
22
+ #
23
+ # #### Bitbucket server
24
+ # Add the `DANGER_BITBUCKETSERVER_USERNAME`, `DANGER_BITBUCKETSERVER_PASSWORD`
25
+ # and `DANGER_BITBUCKETSERVER_HOST` to your build user's ENV.
26
+ #
27
+ # ### Running Danger
28
+ #
29
+ # Once the environment variables are all available, create a custom build step
30
+ # to run Danger as part of your build process:
31
+ # http://docs.buddybuild.com/docs/custom-prebuild-and-postbuild-steps
32
+ class Buddybuild < CI
33
+ #######################################################################
34
+ def self.validates_as_ci?(env)
35
+ value = env["BUDDYBUILD_BUILD_ID"]
36
+ return !value.nil? && !env["BUDDYBUILD_BUILD_ID"].empty?
37
+ end
38
+
39
+ #######################################################################
40
+ def self.validates_as_pr?(env)
41
+ value = env["BUDDYBUILD_PULL_REQUEST"]
42
+ return !value.nil? && !env["BUDDYBUILD_PULL_REQUEST"].empty?
43
+ end
44
+
45
+ #######################################################################
46
+ def supported_request_sources
47
+ @supported_request_sources ||= [
48
+ Danger::RequestSources::GitHub,
49
+ Danger::RequestSources::GitLab,
50
+ Danger::RequestSources::BitbucketServer,
51
+ Danger::RequestSources::BitbucketCloud
52
+ ]
53
+ end
54
+
55
+ #######################################################################
56
+ def initialize(env)
57
+ self.repo_slug = env["BUDDYBUILD_REPO_SLUG"]
58
+ self.pull_request_id = env["BUDDYBUILD_PULL_REQUEST"]
59
+ self.repo_url = GitRepo.new.origins # Buddybuild doesn't provide a repo url env variable for now
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,51 @@
1
+ # https://buildkite.com/docs/agent/osx
2
+ # https://buildkite.com/docs/guides/environment-variables
3
+ require "danger/request_sources/github/github"
4
+ require "danger/request_sources/gitlab"
5
+
6
+ module Danger
7
+ # ### CI Setup
8
+ #
9
+ # With BuildKite you run the server yourself, so you will want to run it as a part of your build process.
10
+ # It is common to have build steps, so we would recommend adding this to your scrip:
11
+ #
12
+ # ``` shell
13
+ # echo "--- Running Danger"
14
+ # bundle exec danger
15
+ # ```
16
+ #
17
+ # ### Token Setup
18
+ #
19
+ # #### GitHub
20
+ #
21
+ # As this is self-hosted, you will need to add the `DANGER_GITHUB_API_TOKEN` to your build user's ENV. The alternative
22
+ # is to pass in the token as a prefix to the command `DANGER_GITHUB_API_TOKEN="123" bundle exec danger`.
23
+ #
24
+ # #### GitLab
25
+ #
26
+ # As this is self-hosted, you will need to add the `DANGER_GITLAB_API_TOKEN` to your build user's ENV. The alternative
27
+ # is to pass in the token as a prefix to the command `DANGER_GITLAB_API_TOKEN="123" bundle exec danger`.
28
+ #
29
+ class Buildkite < CI
30
+ def self.validates_as_ci?(env)
31
+ env.key? "BUILDKITE"
32
+ end
33
+
34
+ def self.validates_as_pr?(env)
35
+ exists = ["BUILDKITE_PULL_REQUEST_REPO", "BUILDKITE_PULL_REQUEST"].all? { |x| env[x] }
36
+ exists && !env["BUILDKITE_PULL_REQUEST_REPO"].empty?
37
+ end
38
+
39
+ def initialize(env)
40
+ self.repo_url = env["BUILDKITE_REPO"]
41
+ self.pull_request_id = env["BUILDKITE_PULL_REQUEST"]
42
+
43
+ repo_matches = self.repo_url.match(%r{([\/:])([^\/]+\/[^\/]+?)(\.git$|$)})
44
+ self.repo_slug = repo_matches[2] unless repo_matches.nil?
45
+ end
46
+
47
+ def supported_request_sources
48
+ @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::GitLab]
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,37 @@
1
+ require "set"
2
+
3
+ module Danger
4
+ # "abstract" CI class
5
+ class CI
6
+ attr_accessor :repo_slug, :pull_request_id, :repo_url, :supported_request_sources
7
+
8
+ def self.inherited(child_class)
9
+ available_ci_sources.add child_class
10
+ super
11
+ end
12
+
13
+ def self.available_ci_sources
14
+ @available_ci_sources ||= Set.new
15
+ end
16
+
17
+ def supported_request_sources
18
+ raise "CISource subclass must specify the supported request sources"
19
+ end
20
+
21
+ def supports?(request_source)
22
+ supported_request_sources.include?(request_source)
23
+ end
24
+
25
+ def self.validates_as_ci?(_env)
26
+ abort "You need to include a function for #{self} for validates_as_ci?"
27
+ end
28
+
29
+ def self.validates_as_pr?(_env)
30
+ abort "You need to include a function for #{self} for validates_as_pr?"
31
+ end
32
+
33
+ def initialize(_env)
34
+ raise "Subclass and overwrite initialize"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,94 @@
1
+ # https://circleci.com/docs/environment-variables
2
+ require "uri"
3
+ require "danger/ci_source/circle_api"
4
+ require "danger/request_sources/github/github"
5
+
6
+ module Danger
7
+ # ### CI Setup
8
+ #
9
+ # For setting up CircleCI, we recommend turning on "Only build pull requests" in "Advanced Settings." Without this enabled,
10
+ # it's trickier for Danger to determine whether you're in a pull request or not, as the environment metadata
11
+ # isn't as reliable.
12
+ #
13
+ # A common scenario is when CircleCI begins building a commit before the commit becomes associated with a PR
14
+ # (e.g. a developer pushes their branch to the remote repo for the first time. CircleCI spins up and begins building.
15
+ # Moments later the developer creates a PR on GitHub. Since the build process started before the PR existed,
16
+ # Danger won't be able to use the Circle-provided environment variables to retrieve PR metadata.)
17
+ #
18
+ # With "Only build pull requests" enabled, you can add `bundle exec danger` to your `config.yml` (Circle 2.0).
19
+ #
20
+ # e.g.
21
+ #
22
+ # ``` yaml
23
+ # - run: bundle exec danger --verbose
24
+ # ```
25
+ #
26
+ # And that should be it!
27
+ #
28
+ # ### Token Setup
29
+ #
30
+ # If "Only build pull requests" can't be enabled for your project, Danger _can_ still work by relying on CircleCI's API
31
+ # to retrieve PR metadata, which will require an API token.
32
+ #
33
+ # 1. Go to your project > Settings > API Permissions. Create a token with scope "view-builds" and a label like "DANGER_CIRCLE_CI_API_TOKEN".
34
+ # 2. Settings > Environement Variables. Add the token as a CircleCI environment variable, which exposes it to the Danger process.
35
+ #
36
+ # There is no difference here for OSS vs Closed, both scenarios will need this environment variable.
37
+ #
38
+ # With these pieces in place, Danger should be able to work as expected.
39
+ #
40
+ class CircleCI < CI
41
+ # Side note: CircleCI is complicated. The env vars for PRs are not guaranteed to exist
42
+ # if the build was triggered from a commit, to look at examples of the different types
43
+ # of CI states, see this repo: https://github.com/orta/show_circle_env
44
+
45
+ def self.validates_as_ci?(env)
46
+ env.key? "CIRCLE_BUILD_NUM"
47
+ end
48
+
49
+ def self.validates_as_pr?(env)
50
+ # This will get used if it's available, instead of the API faffing.
51
+ return true if env["CI_PULL_REQUEST"] && !env["CI_PULL_REQUEST"].empty?
52
+ return true if env["CIRCLE_PULL_REQUEST"] && !env["CIRCLE_PULL_REQUEST"].empty?
53
+
54
+ # Real-world talk, it should be worrying if none of these are in the environment
55
+ return false unless ["DANGER_CIRCLE_CI_API_TOKEN", "CIRCLE_PROJECT_USERNAME", "CIRCLE_PROJECT_REPONAME", "CIRCLE_BUILD_NUM"].all? { |x| env[x] && !env[x].empty? }
56
+
57
+ # Uses the Circle API to determine if it's a PR otherwise
58
+ api = CircleAPI.new
59
+ api.pull_request?(env)
60
+ end
61
+
62
+ def supported_request_sources
63
+ @supported_request_sources ||= [Danger::RequestSources::GitHub, Danger::RequestSources::BitbucketCloud]
64
+ end
65
+
66
+ def initialize(env)
67
+ self.repo_url = env["CIRCLE_REPOSITORY_URL"]
68
+ pr_url = env["CI_PULL_REQUEST"] || env["CIRCLE_PULL_REQUEST"]
69
+
70
+ # If it's not a real URL, use the Circle API
71
+ unless pr_url && URI.parse(pr_url).kind_of?(URI::HTTP)
72
+ api = CircleAPI.new
73
+ pr_url = api.pull_request_url(env)
74
+ end
75
+
76
+ # We should either have got it via the API, or
77
+ # an ENV var.
78
+ pr_path = URI.parse(pr_url).path.split("/")
79
+ if pr_path.count == 5
80
+ # The first one is an extra slash, ignore it
81
+ self.repo_slug = pr_path[1] + "/" + pr_path[2]
82
+ self.pull_request_id = pr_path[4]
83
+
84
+ else
85
+ message = "Danger::Circle.rb considers this a PR, " \
86
+ "but did not get enough information to get a repo slug" \
87
+ "and PR id.\n\n" \
88
+ "PR path: #{pr_url}\n" \
89
+ "Keys: #{env.keys}"
90
+ raise message.red
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,51 @@
1
+ require "faraday"
2
+
3
+ module Danger
4
+ class CircleAPI
5
+ # Determine if there's a PR attached to this commit,
6
+ # and return a bool
7
+ def pull_request?(env)
8
+ url = pull_request_url(env)
9
+ return !url.nil?
10
+ end
11
+
12
+ # Determine if there's a PR attached to this commit,
13
+ # and return the url if so
14
+ def pull_request_url(env)
15
+ url = env["CI_PULL_REQUEST"]
16
+
17
+ if url.nil? && !env["CIRCLE_PROJECT_USERNAME"].nil? && !env["CIRCLE_PROJECT_REPONAME"].nil?
18
+ repo_slug = env["CIRCLE_PROJECT_USERNAME"] + "/" + env["CIRCLE_PROJECT_REPONAME"]
19
+ if !env["CIRCLE_PR_NUMBER"].nil?
20
+ host = env["DANGER_GITHUB_HOST"] || "github.com"
21
+ url = "https://" + host + "/" + repo_slug + "/pull/" + env["CIRCLE_PR_NUMBER"]
22
+ else
23
+ token = env["DANGER_CIRCLE_CI_API_TOKEN"]
24
+ url = fetch_pull_request_url(repo_slug, env["CIRCLE_BUILD_NUM"], token)
25
+ end
26
+ end
27
+ url
28
+ end
29
+
30
+ def client
31
+ @client ||= Faraday.new(url: "https://circleci.com/api/v1")
32
+ end
33
+
34
+ # Ask the API if the commit is inside a PR
35
+ def fetch_pull_request_url(repo_slug, build_number, token)
36
+ build_json = fetch_build(repo_slug, build_number, token)
37
+ pull_requests = build_json[:pull_requests]
38
+ return nil unless pull_requests && pull_requests.first
39
+ pull_requests.first[:url]
40
+ end
41
+
42
+ # Make the API call, and parse the JSON
43
+ def fetch_build(repo_slug, build_number, token)
44
+ url = "project/#{repo_slug}/#{build_number}"
45
+ params = { "circle-token" => token }
46
+ response = client.get url, params, accept: "application/json"
47
+ json = JSON.parse(response.body, symbolize_names: true)
48
+ json
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,31 @@
1
+ require "danger/request_sources/github/github"
2
+
3
+ module Danger
4
+ # ### CI Setup
5
+ # You need to edit your `.cirrus.yml` to include `bundler exec danger`.
6
+ #
7
+ # Adding this to your `.cirrus.yml` allows Danger to fail your build, both on the Cirrus CI website and within your Pull Request.
8
+ # With that set up, you can edit your task to add `bundler exec danger` in any script instruction.
9
+ class Cirrus < CI
10
+ def self.validates_as_ci?(env)
11
+ env.key? "CIRRUS_CI"
12
+ end
13
+
14
+ def self.validates_as_pr?(env)
15
+ exists = ["CIRRUS_PR", "CIRRUS_REPO_FULL_NAME"].all? { |x| env[x] && !env[x].empty? }
16
+ exists && env["CIRRUS_PR"].to_i > 0
17
+ end
18
+
19
+ def supported_request_sources
20
+ @supported_request_sources ||= [Danger::RequestSources::GitHub]
21
+ end
22
+
23
+ def initialize(env)
24
+ self.repo_slug = env["CIRRUS_REPO_FULL_NAME"]
25
+ if env["CIRRUS_PR"].to_i > 0
26
+ self.pull_request_id = env["CIRRUS_PR"]
27
+ end
28
+ self.repo_url = env["CIRRUS_GIT_CLONE_URL"]
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,57 @@
1
+ # https://docs.aws.amazon.com/codebuild/latest/userguide/build-env-ref-env-vars.html
2
+ require "danger/request_sources/github/github"
3
+
4
+ module Danger
5
+ # ### CI Setup
6
+ #
7
+ # In CodeBuild, make sure to correctly forward CODEBUILD_BUILD_ID, CODEBUILD_SOURCE_VERSION, CODEBUILD_SOURCE_REPO_URL and DANGER_GITHUB_API_TOKEN.
8
+ #
9
+ # ### Token Setup
10
+ #
11
+ # Add your `DANGER_GITHUB_API_TOKEN` to your project. Edit -> Environment -> Additional configuration -> Create a parameter
12
+ #
13
+ class CodeBuild < CI
14
+ def self.validates_as_ci?(env)
15
+ env.key? "CODEBUILD_BUILD_ID"
16
+ end
17
+
18
+ def self.validates_as_pr?(env)
19
+ !!self.extract_pr_url(env)
20
+ end
21
+
22
+ def supported_request_sources
23
+ @supported_request_sources ||= [Danger::RequestSources::GitHub]
24
+ end
25
+
26
+ def initialize(env)
27
+ self.repo_slug = self.class.extract_repo_slug(env)
28
+ self.pull_request_id = env["CODEBUILD_SOURCE_VERSION"].split("/")[1].to_i
29
+ self.repo_url = self.class.extract_repo_url(env)
30
+ end
31
+
32
+ def self.extract_repo_slug(env)
33
+ return nil unless env.key? "CODEBUILD_SOURCE_REPO_URL"
34
+
35
+ gh_host = env["DANGER_GITHUB_HOST"] || "github.com"
36
+
37
+ env["CODEBUILD_SOURCE_REPO_URL"].gsub(%r{^.*?#{Regexp.escape(gh_host)}\/(.*?)(\.git)?$}, '\1')
38
+ end
39
+
40
+ def self.extract_repo_url(env)
41
+ return nil unless env.key? "CODEBUILD_SOURCE_REPO_URL"
42
+
43
+ env["CODEBUILD_SOURCE_REPO_URL"].gsub(/\.git$/, "")
44
+ end
45
+
46
+ def self.extract_pr_url(env)
47
+ return nil unless env.key? "CODEBUILD_SOURCE_VERSION"
48
+ return nil unless env.key? "CODEBUILD_SOURCE_REPO_URL"
49
+ return nil unless env["CODEBUILD_SOURCE_VERSION"].split("/").length == 2
50
+
51
+ _source_origin, pr_number = env["CODEBUILD_SOURCE_VERSION"].split("/")
52
+ github_repo_url = env["CODEBUILD_SOURCE_REPO_URL"].gsub(/\.git$/, "")
53
+
54
+ "#{github_repo_url}/pull/#{pr_number}"
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,53 @@
1
+ # https://semaphoreci.com/docs/available-environment-variables.html
2
+ require "danger/request_sources/github/github"
3
+
4
+ module Danger
5
+ # ### CI Setup
6
+ #
7
+ # To set up Danger on Codefresh, create a freestyle step in your Codefresh yaml configuration:
8
+ #
9
+ # ```yml
10
+ # Danger:
11
+ # title: Run Danger
12
+ # image: alpine/bundle
13
+ # working_directory: ${{main_clone}}
14
+ # commands:
15
+ # - bundle install --deployment
16
+ # - bundle exec danger --verbose
17
+ # ```
18
+ #
19
+ # Don't forget to add the `DANGER_GITHUB_API_TOKEN` variable to your pipeline settings so that Danger can properly post comments to your pull request.
20
+ #
21
+ class Codefresh < CI
22
+ def self.validates_as_ci?(env)
23
+ env.key?("CF_BUILD_ID") && env.key?("CF_BUILD_URL")
24
+ end
25
+
26
+ def self.validates_as_pr?(env)
27
+ return !env["CF_PULL_REQUEST_NUMBER"].to_s.empty?
28
+ end
29
+
30
+ def supported_request_sources
31
+ @supported_request_sources ||= [Danger::RequestSources::GitHub]
32
+ end
33
+
34
+ def repo_slug
35
+ return "" if @env["CF_REPO_OWNER"].to_s.empty?
36
+ return "" if @env["CF_REPO_NAME"].to_s.empty?
37
+ "#{@env['CF_REPO_OWNER']}/#{@env['CF_REPO_NAME']}".downcase!
38
+ end
39
+
40
+ def repo_url
41
+ return "" if @env["CF_COMMIT_URL"].to_s.empty?
42
+ @env["CF_COMMIT_URL"].gsub(/\/commit.+$/, "")
43
+ end
44
+
45
+ def pull_request_id
46
+ @env["CF_PULL_REQUEST_NUMBER"]
47
+ end
48
+
49
+ def initialize(env)
50
+ @env = env
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,44 @@
1
+ # https://semaphoreci.com/docs/available-environment-variables.html
2
+ require "danger/request_sources/github/github"
3
+
4
+ module Danger
5
+ # ### CI Setup
6
+ #
7
+ # In Codeship, go to your "Project Settings", then add `bundle exec danger` as a test step inside
8
+ # one of your pipelines.
9
+ #
10
+ # ### Token Setup
11
+ #
12
+ # Add your `DANGER_GITHUB_API_TOKEN` to "Environment" section in "Project Settings".
13
+ #
14
+ class Codeship < CI
15
+ def self.validates_as_ci?(env)
16
+ env["CI_NAME"] == "codeship"
17
+ end
18
+
19
+ def self.validates_as_pr?(env)
20
+ return false unless env["CI_BRANCH"] && !env["CI_BRANCH"].empty?
21
+
22
+ !pr_from_env(env).nil?
23
+ end
24
+
25
+ def self.owner_for_github(env)
26
+ env["CI_REPO_NAME"].split("/").first
27
+ end
28
+
29
+ # this is fairly hacky, see https://github.com/danger/danger/pull/892#issuecomment-329030616 for why
30
+ def self.pr_from_env(env)
31
+ Danger::RequestSources::GitHub.new(nil, env).get_pr_from_branch(env["CI_REPO_NAME"], env["CI_BRANCH"], owner_for_github(env))
32
+ end
33
+
34
+ def supported_request_sources
35
+ @supported_request_sources ||= [Danger::RequestSources::GitHub]
36
+ end
37
+
38
+ def initialize(env)
39
+ self.repo_slug = env["CI_REPO_NAME"]
40
+ self.pull_request_id = self.class.pr_from_env(env)
41
+ self.repo_url = GitRepo.new.origins
42
+ end
43
+ end
44
+ end