Skip to content

Commit 8a63d32

Browse files
authored
Add config file support and dry run option (lucacome#299)
1 parent 396a5da commit 8a63d32

12 files changed

+112
-44
lines changed

.github/workflows/test-workflow.yml

+36
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,39 @@ jobs:
3939
echo "Release URL: ${{ steps.draft-release.outputs.release-url }}"
4040
echo "Release ID: ${{ steps.draft-release.outputs.release-id }}"
4141
echo "Release Sections: ${{ steps.draft-release.outputs.release-sections }}"
42+
43+
test-dry-run-config:
44+
runs-on: ubuntu-latest
45+
steps:
46+
- uses: actions/checkout@v4
47+
- uses: ./
48+
id: draft-release
49+
with:
50+
config-path: .github/release-notes.yml
51+
dry-run: true
52+
variables: |
53+
helm-chart=v0.1.1
54+
foo=bar
55+
my-variable=My Variable
56+
notes-header: |
57+
## Welcome to the {{version}} release of Draft Release
58+
The previous release was {{previous-version}}.
59+
This is some text to welcome you to the release {{version-number}}.
60+
## Helm Chart
61+
The Helm Chart version for this release is {{helm-chart}}.
62+
## My Variable
63+
The value of my variable is {{my-variable}}.
64+
notes-footer: |
65+
## Upgrade
66+
- For Docker, use the {{version}} image from Docker Hub.
67+
- For Binaries use the {{version-number}} release from GitHub.
68+
- For Helm Chart, use the {{helm-chart}} version.
69+
- For foo use the {{foo}} version.
70+
71+
- run: |
72+
echo "Version: ${{ steps.draft-release.outputs.version }}"
73+
echo "Previous Version: ${{ steps.draft-release.outputs.previous-version }}"
74+
echo "Release Notes: ${{ steps.draft-release.outputs.release-notes }}"
75+
echo "Release URL: ${{ steps.draft-release.outputs.release-url }}"
76+
echo "Release ID: ${{ steps.draft-release.outputs.release-id }}"
77+
echo "Release Sections: ${{ steps.draft-release.outputs.release-sections }}"

__tests__/notes.test.ts

+4
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ describe('generateReleaseNotes', () => {
8282
variables: ['foo=bar', 'baz=qux'],
8383
collapseAfter: 0,
8484
publish: false,
85+
configPath: '.github/release.yml',
86+
dryRun: false,
8587
}
8688
const releaseData = {
8789
releases: [],
@@ -119,6 +121,8 @@ describe('generateReleaseNotes', () => {
119121
variables: [],
120122
collapseAfter: 3,
121123
publish: false,
124+
configPath: '.github/release.yml',
125+
dryRun: false,
122126
}
123127

124128
const releaseData = {

__tests__/release.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ describe('createOrUpdateRelease', () => {
140140
variables: [],
141141
collapseAfter: 0,
142142
publish: false,
143+
configPath: '.github/release.yml',
144+
dryRun: false,
143145
}
144146
beforeEach(() => {
145147
jest.clearAllMocks()

__tests__/version.test.ts

+2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ describe('getVersionIncrease', () => {
1212
variables: [],
1313
collapseAfter: 0,
1414
publish: false,
15+
configPath: '.github/release.yml',
16+
dryRun: false,
1517
}
1618

1719
const releaseData = {

action.yml

+8
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ inputs:
3434
description: 'Whether to publish the release'
3535
default: 'false'
3636
required: false
37+
config-path:
38+
description: 'Path to the configuration file'
39+
default: '.github/release.yml'
40+
required: false
41+
dry-run:
42+
description: 'Whether to run the action without creating a release'
43+
default: 'false'
44+
required: false
3745
outputs:
3846
version:
3947
description: 'The version of the release'

dist/index.js

+22-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/context.ts

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export interface Inputs {
1010
variables: string[]
1111
collapseAfter: number
1212
publish: boolean
13+
configPath: string
14+
dryRun: boolean
1315
}
1416

1517
export function getInputs(): Inputs {
@@ -22,5 +24,7 @@ export function getInputs(): Inputs {
2224
variables: Util.getInputList('variables'),
2325
collapseAfter: parseInt(core.getInput('collapse-after'), 10),
2426
publish: core.getBooleanInput('publish'),
27+
configPath: core.getInput('config-path'),
28+
dryRun: core.getBooleanInput('dry-run'),
2529
}
2630
}

src/main.ts

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ async function run(): Promise<void> {
4646
core.setOutput('version', releaseData.nextRelease)
4747

4848
// create or update release
49+
4950
await createOrUpdateRelease(client, inputs, releaseData)
5051
} catch (error) {
5152
if (error instanceof Error) core.setFailed(error.message)

src/notes.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export async function generateReleaseNotes(
2121
const context = github.context
2222
const latestRelease = releaseData.latestRelease
2323
const nextRelease = releaseData.nextRelease
24+
const configPath = inputs.configPath
2425
let body = ''
2526
let sections: SectionData = {}
2627

@@ -30,6 +31,7 @@ export async function generateReleaseNotes(
3031
tag_name: nextRelease,
3132
previous_tag_name: semver.gt(latestRelease, '0.0.0') ? latestRelease : '',
3233
target_commitish: releaseData.branch,
34+
configuration_file_path: configPath,
3335
})
3436

3537
body = notes.data.body
@@ -49,7 +51,7 @@ export async function generateReleaseNotes(
4951
'previous-version-number': latestRelease.replace('v', ''),
5052
...variables,
5153
}
52-
const categories = await getCategories()
54+
const categories = await getCategories(inputs)
5355
sections = await splitMarkdownSections(body, categories)
5456

5557
body = await collapseSections(body, sections, categories, inputs.collapseAfter)

src/release.ts

+23-20
Original file line numberDiff line numberDiff line change
@@ -87,23 +87,26 @@ export async function createOrUpdateRelease(
8787
core.debug(`releaseData.branch: ${releaseData.branch}`)
8888
const newReleaseNotes = await generateReleaseNotes(client, inputs, releaseData)
8989

90-
const releaseParams = {
91-
...context.repo,
92-
tag_name: nextRelease,
93-
name: nextRelease,
94-
target_commitish: releaseData.branch,
95-
body: newReleaseNotes,
96-
draft: draft,
97-
}
90+
let response
91+
if (!inputs.dryRun) {
92+
const releaseParams = {
93+
...context.repo,
94+
tag_name: nextRelease,
95+
name: nextRelease,
96+
target_commitish: releaseData.branch,
97+
body: newReleaseNotes,
98+
draft: draft,
99+
}
98100

99-
const response = await (releaseDraft === undefined
100-
? client.rest.repos.createRelease({
101-
...releaseParams,
102-
})
103-
: client.rest.repos.updateRelease({
104-
...releaseParams,
105-
release_id: releaseDraft.id,
106-
}))
101+
response = await (releaseDraft === undefined
102+
? client.rest.repos.createRelease({
103+
...releaseParams,
104+
})
105+
: client.rest.repos.updateRelease({
106+
...releaseParams,
107+
release_id: releaseDraft.id,
108+
}))
109+
}
107110

108111
const separator = '----------------------------------'
109112
core.startGroup(`${releaseDraft === undefined ? 'Create' : 'Update'} release draft for ${nextRelease}`)
@@ -112,13 +115,13 @@ export async function createOrUpdateRelease(
112115
core.info(separator)
113116
core.info(`releaseNotes: ${newReleaseNotes}`)
114117
core.info(separator)
115-
core.info(`releaseURL: ${response.data?.html_url}`)
118+
core.info(`releaseURL: ${response?.data?.html_url}`)
116119
core.info(separator)
117120
core.debug(`releaseDraft: ${JSON.stringify(releaseDraft, null, 2)}`)
118-
core.debug(`${releaseDraft === undefined ? 'create' : 'update'}Release: ${JSON.stringify(response.data, null, 2)}`)
121+
core.debug(`${releaseDraft === undefined ? 'create' : 'update'}Release: ${JSON.stringify(response?.data, null, 2)}`)
119122
core.endGroup()
120123

121124
core.setOutput('release-notes', newReleaseNotes?.trim())
122-
core.setOutput('release-id', response.data?.id)
123-
core.setOutput('release-url', response.data?.html_url?.trim())
125+
core.setOutput('release-id', response?.data?.id)
126+
core.setOutput('release-url', response?.data?.html_url?.trim())
124127
}

src/version.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ export interface Category {
3838
labels: string[]
3939
}
4040

41-
export async function getCategories(): Promise<Category[]> {
42-
const content = await fsPromises.readFile('.github/release.yml', 'utf8')
41+
export async function getCategories(inputs: Inputs): Promise<Category[]> {
42+
const content = await fsPromises.readFile(inputs.configPath, 'utf8')
4343
const doc = yaml.load(content) as ReleaseYAML
4444
return doc.changelog.categories.map((category) => {
4545
return {
@@ -50,11 +50,11 @@ export async function getCategories(): Promise<Category[]> {
5050
}
5151

5252
// function that returns tile for matching label
53-
async function getTitleForLabel(label: string): Promise<string> {
53+
async function getTitleForLabel(inputs: Inputs, label: string): Promise<string> {
5454
if (label === '') {
5555
return ''
5656
}
57-
const categories = await getCategories()
57+
const categories = await getCategories(inputs)
5858
const category = categories.find((category) => category.labels.includes(label))
5959
if (category === undefined) {
6060
return ''
@@ -64,8 +64,8 @@ async function getTitleForLabel(label: string): Promise<string> {
6464

6565
// function getVersionIncrease returns the version increase based on the labels. Major, minor, patch
6666
export async function getVersionIncrease(releaseData: ReleaseData, inputs: Inputs, notes: string): Promise<string> {
67-
const majorTitle = await getTitleForLabel(inputs.majorLabel)
68-
const minorTitle = await getTitleForLabel(inputs.minorLabel)
67+
const majorTitle = await getTitleForLabel(inputs, inputs.majorLabel)
68+
const minorTitle = await getTitleForLabel(inputs, inputs.minorLabel)
6969
const version = parseNotes(notes, majorTitle, minorTitle) as semver.ReleaseType
7070

7171
return semver.inc(releaseData.latestRelease, version) || ''

0 commit comments

Comments
 (0)