1 | const debug = require('debug')('semantic-release:github');
|
2 | const {RELEASE_NAME} = require('./definitions/constants');
|
3 | const parseGithubUrl = require('./parse-github-url');
|
4 | const resolveConfig = require('./resolve-config');
|
5 | const getClient = require('./get-client');
|
6 | const isPrerelease = require('./is-prerelease');
|
7 |
|
8 | module.exports = async (pluginConfig, context) => {
|
9 | const {
|
10 | options: {repositoryUrl},
|
11 | branch,
|
12 | nextRelease: {name, gitTag, notes},
|
13 | logger,
|
14 | } = context;
|
15 | const {githubToken, githubUrl, githubApiPathPrefix, proxy} = resolveConfig(pluginConfig, context);
|
16 | const {owner, repo} = parseGithubUrl(repositoryUrl);
|
17 | const github = getClient({githubToken, githubUrl, githubApiPathPrefix, proxy});
|
18 | let releaseId;
|
19 |
|
20 | const release = {owner, repo, name, prerelease: isPrerelease(branch), tag_name: gitTag};
|
21 |
|
22 | debug('release object: %O', release);
|
23 |
|
24 | try {
|
25 | ({
|
26 | data: {id: releaseId},
|
27 | } = await github.repos.getReleaseByTag({owner, repo, tag: gitTag}));
|
28 | } catch (error) {
|
29 | if (error.status === 404) {
|
30 | logger.log('There is no release for tag %s, creating a new one', gitTag);
|
31 |
|
32 | const {
|
33 | data: {html_url: url},
|
34 | } = await github.repos.createRelease({...release, body: notes});
|
35 |
|
36 | logger.log('Published GitHub release: %s', url);
|
37 | return {url, name: RELEASE_NAME};
|
38 | }
|
39 |
|
40 | throw error;
|
41 | }
|
42 |
|
43 | debug('release release_id: %o', releaseId);
|
44 |
|
45 | const {
|
46 | data: {html_url: url},
|
47 | } = await github.repos.updateRelease({...release, release_id: releaseId});
|
48 |
|
49 | logger.log('Updated GitHub release: %s', url);
|
50 |
|
51 | return {url, name: RELEASE_NAME};
|
52 | };
|