forked from amiiit/merge-bump-release
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathindex.ts
138 lines (125 loc) · 6.92 KB
/
index.ts
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
137
138
import {bump, determineBumpType} from "./bump";
import type {Bump} from "./bump";
const core = require('@actions/core')
const github = require('@actions/github');
import { Base64 } from 'js-base64';
import commitMessageQuery from 'inline!./src/GetCommitMessageFromRepository.query.graphql'
import lastReleaseQuery from 'inline!./src/GetLastReleaseQuery.query.graphql'
import type {CommitMessageQueryResponse, LatestReleaseQueryResponse} from "./QueryTypes";
const repoDetails = {
repoName: github.context.repo.repo,
repoOwner: github.context.repo.owner,
changelogFile: "CHANGELOG.md"
}
const start = async () => {
try {
const octokit = github.getOctokit(core.getInput('github_token'))
const commitMessage: CommitMessageQueryResponse = await octokit.graphql(commitMessageQuery, {
...repoDetails,
prNumber: github.context.payload.pull_request?.number
})
const latestRelease: LatestReleaseQueryResponse = await octokit.graphql(lastReleaseQuery, {
...repoDetails
})
//Workout latest version from latest release, but have a default in case no release has been manually created
const latestVersion = latestRelease.repository.latestRelease?.tag.name ? latestRelease.repository.latestRelease?.tag.name : core.getInput('initial_release')
const bumpType: Bump = determineBumpType(commitMessage.repository.pullRequest.mergeCommit, {
inputBump: core.getInput('bump'),
inferBumpFromCommit: core.getInput('infer_bump_from_commit')
})
const nextVersion = bump((latestVersion) as string, bumpType)
const nextReleaseTag = core.getInput('tag_prefix') + nextVersion
let headerMessage = commitMessage.repository.pullRequest.mergeCommit.messageHeadline
let bodyMessage = commitMessage.repository.pullRequest.mergeCommit.messageBody
//Bypassing GitHub limitation of 70 characters on the squased commit info which arrives for working out the release
if( headerMessage.length > 69 ){
headerMessage = headerMessage + " " + bodyMessage.split(/\r?\n/)[0];
headerMessage = headerMessage.trim().replace(new RegExp("…", "g"), '')
bodyMessage = bodyMessage.replace(bodyMessage.split(/\r?\n/)[0],'').replace(new RegExp("…", "g"), '')
}
const releaseResult = await octokit.request('POST /repos/{owner}/{repo}/releases', {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
tag_name: nextReleaseTag,
target_commitish: 'main',
name: headerMessage,
body: bodyMessage,
draft: false,
prerelease: false,
generate_release_notes: true
})
console.log('releaseResult', releaseResult)
if(core.getInput('update_file')){
console.log("Input file to be modified is " + core.getInput('update_file'))
if(core.getInput('update_file') == "package.json"){
//Get input file
const fileToUpdate = await octokit.request(`GET /repos/{owner}/{repo}/contents/${core.getInput('update_file')}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
branch: "main"
})
const fileSha = fileToUpdate.data.sha
var updatedFileContent
const fileContent = JSON.parse(Base64.decode(fileToUpdate.data.content))
fileContent.version = nextReleaseTag
updatedFileContent = Base64.encode(JSON.stringify(fileContent,null,4))
const updateFileResult = await octokit.request(`PUT /repos/{owner}/{repo}/contents/${core.getInput('update_file')}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
message: `Automatic ${core.getInput('update_file')} bump to ${nextReleaseTag}`,
branch: "main",
sha: fileSha,
content: updatedFileContent
})
// console.log('updateFileResult', updateFileResult)
}else if(core.getInput('update_file') == "version.txt"){
//Get input file
const fileToUpdate = await octokit.request(`GET /repos/{owner}/{repo}/contents/${core.getInput('update_file')}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
branch: "main"
})
const fileSha = fileToUpdate.data.sha
var updatedFileContent
updatedFileContent = Base64.encode(nextReleaseTag)
const updateFileResult = await octokit.request(`PUT /repos/{owner}/{repo}/contents/${core.getInput('update_file')}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
message: `Automatic ${core.getInput('update_file')} bump to ${nextReleaseTag}`,
branch: "main",
sha: fileSha,
content: updatedFileContent
})
// console.log('updateFileResult', updateFileResult)
}else{
core.setFailed("Your update_file does not exist or it's not supported.");
}
}
if(core.getInput('changelog') && core.getInput('changelog') == "true"){
console.log("Input file to be modified is " + repoDetails.changelogFile)
const fileToUpdate = await octokit.request(`GET /repos/{owner}/{repo}/contents/${repoDetails.changelogFile}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
branch: "main"
})
const fileSha = fileToUpdate.data.sha
const fileContent = Base64.decode(fileToUpdate.data.content)
const changelogDate = new Date()
updatedFileContent = Base64.encode(changelogDate.toISOString().split('T')[0] + ", " + nextReleaseTag + "\n\n" + `- ${headerMessage} (${commitMessage.repository.pullRequest.mergeCommit.author.name})\n` + `- https://github.com/${repoDetails.repoOwner}/${repoDetails.repoName}/compare/${latestVersion}...${nextReleaseTag}\n\n` + fileContent)
const changelogResult = await octokit.request(`PUT /repos/{owner}/{repo}/contents/${repoDetails.changelogFile}`, {
repo: repoDetails.repoName,
owner: repoDetails.repoOwner,
message: `Automatic bump of ${repoDetails.changelogFile}`,
branch: "main",
sha: fileSha,
content: updatedFileContent
})
// console.log('changelogResult', changelogResult)
}
console.log("Next version outputed is ", nextReleaseTag)
core.setOutput('next_version', nextReleaseTag)
} catch (error: any) {
core.setFailed(error.message);
}
}
start()