Welcome to mirror list, hosted at ThFree Co, Russian Federation.

Dangerfile « changelog « danger - gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1a702976864b43bc142cb680382c8ed021c70ac3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# frozen_string_literal: true
require 'yaml'

NO_CHANGELOG_LABELS = [
  'tooling',
  'tooling::pipelines',
  'tooling::workflow',
  'ci-build',
  'meta',
  'documentation'
].freeze
SEE_DOC = "See the [changelog documentation](https://docs.gitlab.com/ee/development/changelog.html)."
CREATE_CHANGELOG_MESSAGE = <<~MSG
You can create one with:

```
_support/changelog -m %<mr_iid>s "%<mr_title>s"
```

If your merge request doesn't warrant a CHANGELOG entry,
consider adding any of the %<labels>s labels.
MSG

SUGGEST_MR_COMMENT = <<~SUGGEST_COMMENT
```suggestion
merge_request: %<mr_iid>s
```

#{SEE_DOC}
SUGGEST_COMMENT

CATEGORIES = YAML
  .load_file(File.expand_path('../../.gitlab/changelog_config.yml', __dir__))
  .fetch('categories')
  .keys
  .freeze

def check_changelog_trailer(commit)
  trailer = commit.message.match(/^Changelog:\s*(?<category>.+)$/)

  return :missing if trailer.nil? || trailer[:category].nil?

  category = trailer[:category]

  return :valid if CATEGORIES.include?(category)

  self.fail(
    "Commit #{commit.sha} uses an invalid changelog category: #{category}"
  )

  :invalid
end

def check_changelog(path)
  raw_file = File.read(path)
  yaml = YAML.safe_load(raw_file)

  fail "`title` should be set, in #{gitlab.html_link(path)}! #{SEE_DOC}" if yaml["title"].nil?
  fail "`type` should be set, in #{gitlab.html_link(path)}! #{SEE_DOC}" if yaml["type"].nil?

  if yaml["merge_request"].nil?
    mr_line = raw_file.lines.find_index { |l| l.start_with?("merge_request:") }

    if mr_line
      markdown(format(SUGGEST_MR_COMMENT, mr_iid: gitlab.mr_json["iid"]), file: path, line: mr_line.succ)
    else
      message "Consider setting `merge_request` to #{gitlab.mr_json["iid"]} in #{gitlab.html_link(path)}. #{SEE_DOC}"
    end
  elsif yaml["merge_request"] != gitlab.mr_json["iid"]
    fail "Merge request ID was not set to #{gitlab.mr_json["iid"]}! #{SEE_DOC}"
  end
rescue Psych::SyntaxError, Psych::DisallowedClass, Psych::BadAlias
  # YAML could not be parsed, fail the build.
  fail "#{gitlab.html_link(path)} isn't valid YAML! #{SEE_DOC}"
rescue StandardError => e
  warn "There was a problem trying to check the Changelog. Exception: #{e.name} - #{e.message}"
end

def presented_no_changelog_labels
  NO_CHANGELOG_LABELS.map { |label| %Q(~\\"#{label}\\") }.join(', ')
end

changelog_needed = (gitlab.mr_labels & NO_CHANGELOG_LABELS).empty?
changelog_found = git.added_files.find { |path| path =~ %r{\Achangelogs/unreleased/} }

mr_title = gitlab.mr_json["title"].gsub(/^WIP: */, '')

if git.modified_files.include?("CHANGELOG.md")
  fail "**CHANGELOG.md was edited.** Please remove the additions and create a CHANGELOG entry.\n\n" +
    format(CREATE_CHANGELOG_MESSAGE, mr_iid: gitlab.mr_json["iid"], mr_title: mr_title, labels: presented_no_changelog_labels)
end

if changelog_found
  check_changelog(changelog_found)
elsif changelog_needed
  warn "**[CHANGELOG missing](https://docs.gitlab.com/ce/development/changelog.html).**\n\n" +
    format(CREATE_CHANGELOG_MESSAGE, mr_iid: gitlab.mr_json["iid"], mr_title: mr_title, labels: presented_no_changelog_labels)
end

if changelog_needed
  checked = 0

  git.commits.each do |commit|
    case check_changelog_trailer(commit)
    when :valid, :invalid
      checked += 1
    end
  end

  if checked == 0
    message <<~MSG
      We are in the process of rolling out a new workflow for adding changelog entries. This new workflow uses Git commit subjects and Git trailers to generate changelogs. This new approach will soon replace the current YAML based approach.

      To ease the transition process, we recommend you start using both the old and new approach in parallel. This is not required at this time, but will make it easier to transition to the new approach in the future. To do so, pick the commit that should go in the changelog and add a `Changelog` trailer to it.  For example:

      ```
      This is my commit's subject line

      This is the optional commit body.

      Changelog: added
      ```

      The value of the `Changelog` trailer should be one of the following: added, fixed, changed, deprecated, removed, security, performance, other.

      For more information, take a look at the following resources:

      - `https://gitlab.com/gitlab-com/gl-infra/delivery/-/issues/1564`
      - https://docs.gitlab.com/ee/api/repositories.html#generate-changelog-data

      If you'd like to see the new approach in action, take a look at the commits in [the Omnibus repository](https://gitlab.com/gitlab-org/omnibus-gitlab/-/commits/master).
    MSG
  end
end

# vim: ft=ruby