mirror of
https://github.com/goreleaser/goreleaser-action
synced 2026-08-29 17:38:27 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e435ccd777 | ||
|
|
2ff5850a92 | ||
|
|
9a6cd01b33 | ||
|
|
a386515f0c | ||
|
|
ca48102d58 | ||
|
|
0931acf1f7 | ||
|
|
90c43f2c19 |
@@ -4,6 +4,10 @@ concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 10 * * *'
|
||||
|
||||
@@ -4,6 +4,10 @@ concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
|
||||
@@ -4,6 +4,10 @@ concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
|
||||
@@ -86,6 +86,18 @@ describe('getRelease', () => {
|
||||
expect(release?.tag_name).toEqual('v2.7.0');
|
||||
});
|
||||
|
||||
it('skips JSON check for specific version v2.8.1', async () => {
|
||||
const release = await github.getRelease('goreleaser', 'v2.8.1');
|
||||
expect(release).not.toBeNull();
|
||||
expect(release?.tag_name).toEqual('v2.8.1');
|
||||
});
|
||||
|
||||
it('skips JSON check for specific version without v prefix', async () => {
|
||||
const release = await github.getRelease('goreleaser', '2.8.1');
|
||||
expect(release).not.toBeNull();
|
||||
expect(release?.tag_name).toEqual('v2.8.1');
|
||||
});
|
||||
|
||||
it('unknown GoReleaser Pro release', async () => {
|
||||
await expect(github.getRelease('goreleaser-pro', 'foo')).rejects.toThrow(
|
||||
new Error('Cannot find GoReleaser release foo in https://goreleaser.com/static/releases-pro.json')
|
||||
|
||||
+3
-3
File diff suppressed because one or more lines are too long
+1
-1
File diff suppressed because one or more lines are too long
+1
-1
@@ -31,7 +31,7 @@
|
||||
"@actions/http-client": "^2.2.3",
|
||||
"@actions/tool-cache": "^2.0.2",
|
||||
"js-yaml": "^4.1.0",
|
||||
"semver": "^7.7.1",
|
||||
"semver": "^7.7.2",
|
||||
"yargs": "^17.7.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
+56
-11
@@ -3,6 +3,29 @@ import * as semver from 'semver';
|
||||
import * as core from '@actions/core';
|
||||
import * as httpm from '@actions/http-client';
|
||||
|
||||
const maxRetries = 10;
|
||||
const timeoutMs = 1000;
|
||||
const withRetry = async <T>(operation: () => Promise<T>): Promise<T> => {
|
||||
let lastError: Error;
|
||||
|
||||
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
||||
try {
|
||||
return await operation();
|
||||
} catch (error) {
|
||||
lastError = error as Error;
|
||||
|
||||
if (attempt === maxRetries) {
|
||||
break;
|
||||
}
|
||||
|
||||
core.debug(`Attempt ${attempt + 1} failed, retrying in ${timeoutMs}: ${lastError.message}`);
|
||||
await new Promise(resolve => setTimeout(resolve, timeoutMs));
|
||||
}
|
||||
}
|
||||
|
||||
throw lastError;
|
||||
};
|
||||
|
||||
export interface GitHubRelease {
|
||||
tag_name: string;
|
||||
}
|
||||
@@ -19,17 +42,38 @@ export const getReleaseTag = async (distribution: string, version: string): Prom
|
||||
if (version === 'nightly') {
|
||||
return {tag_name: version};
|
||||
}
|
||||
|
||||
// If version is a specific version (not a range), skip the JSON check
|
||||
const cleanVersion: string = cleanTag(version);
|
||||
if (semver.valid(cleanVersion)) {
|
||||
let tag = version.startsWith('v') ? version : `v${version}`;
|
||||
|
||||
// Handle GoReleaser Pro suffix for versions < 2.7.0, but only if not already present
|
||||
// TODO: remove all this `-pro` thing at some point.
|
||||
if (goreleaser.isPro(distribution) && semver.lt(cleanVersion, '2.7.0') && !tag.endsWith('-pro')) {
|
||||
tag = tag + goreleaser.distribSuffix(distribution);
|
||||
}
|
||||
|
||||
return {tag_name: tag};
|
||||
}
|
||||
|
||||
const tag: string = (await resolveVersion(distribution, version)) || version;
|
||||
const suffix: string = goreleaser.distribSuffix(distribution);
|
||||
const url = `https://goreleaser.com/static/releases${suffix}.json`;
|
||||
const http: httpm.HttpClient = new httpm.HttpClient('goreleaser-action');
|
||||
const resp: httpm.HttpClientResponse = await http.get(url);
|
||||
const body = await resp.readBody();
|
||||
const statusCode = resp.message.statusCode || 500;
|
||||
if (statusCode >= 400) {
|
||||
throw new Error(`Failed to get GoReleaser release ${version} from ${url} with status code ${statusCode}: ${body}`);
|
||||
}
|
||||
const releases = <Array<GitHubRelease>>JSON.parse(body);
|
||||
|
||||
const releases = await withRetry(async () => {
|
||||
const http: httpm.HttpClient = new httpm.HttpClient('goreleaser-action');
|
||||
const resp: httpm.HttpClientResponse = await http.get(url);
|
||||
const body = await resp.readBody();
|
||||
const statusCode = resp.message.statusCode || 500;
|
||||
if (statusCode >= 400) {
|
||||
throw new Error(
|
||||
`Failed to get GoReleaser release ${version} from ${url} with status code ${statusCode}: ${body}`
|
||||
);
|
||||
}
|
||||
return <Array<GitHubRelease>>JSON.parse(body);
|
||||
});
|
||||
|
||||
const res = releases.filter(r => r.tag_name === tag).shift();
|
||||
if (res) {
|
||||
return res;
|
||||
@@ -63,12 +107,13 @@ interface GitHubTag {
|
||||
}
|
||||
|
||||
const getAllTags = async (distribution: string): Promise<Array<string>> => {
|
||||
const http: httpm.HttpClient = new httpm.HttpClient('goreleaser-action');
|
||||
const suffix: string = goreleaser.distribSuffix(distribution);
|
||||
const url = `https://goreleaser.com/static/releases${suffix}.json`;
|
||||
core.debug(`Downloading ${url}`);
|
||||
const getTags = http.getJson<Array<GitHubTag>>(url);
|
||||
return getTags.then(response => {
|
||||
|
||||
return withRetry(async () => {
|
||||
const http: httpm.HttpClient = new httpm.HttpClient('goreleaser-action');
|
||||
const response = await http.getJson<Array<GitHubTag>>(url);
|
||||
if (response.result == null) {
|
||||
return [];
|
||||
}
|
||||
|
||||
+8
-1
@@ -32,7 +32,14 @@ async function run(): Promise<void> {
|
||||
if (argv.config) {
|
||||
yamlfile = argv.config;
|
||||
} else {
|
||||
['.goreleaser.yaml', '.goreleaser.yml', 'goreleaser.yaml', 'goreleaser.yml'].forEach(f => {
|
||||
[
|
||||
'.config/goreleaser.yaml',
|
||||
'.config/goreleaser.yml',
|
||||
'.goreleaser.yaml',
|
||||
'.goreleaser.yml',
|
||||
'goreleaser.yaml',
|
||||
'goreleaser.yml'
|
||||
].forEach(f => {
|
||||
if (fs.existsSync(f)) {
|
||||
yamlfile = f;
|
||||
}
|
||||
|
||||
@@ -1963,12 +1963,12 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"brace-expansion@npm:^1.1.7":
|
||||
version: 1.1.11
|
||||
resolution: "brace-expansion@npm:1.1.11"
|
||||
version: 1.1.12
|
||||
resolution: "brace-expansion@npm:1.1.12"
|
||||
dependencies:
|
||||
balanced-match: ^1.0.0
|
||||
concat-map: 0.0.1
|
||||
checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07
|
||||
checksum: 12cb6d6310629e3048cadb003e1aca4d8c9bb5c67c3c321bafdd7e7a50155de081f78ea3e0ed92ecc75a9015e784f301efc8132383132f4f7904ad1ac529c562
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3094,7 +3094,7 @@ __metadata:
|
||||
jest: ^29.6.4
|
||||
js-yaml: ^4.1.0
|
||||
prettier: ^3.0.3
|
||||
semver: ^7.7.1
|
||||
semver: ^7.7.2
|
||||
tmp: ^0.2.1
|
||||
ts-jest: ^29.1.1
|
||||
ts-node: ^10.9.1
|
||||
@@ -4884,12 +4884,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"semver@npm:^7.7.1":
|
||||
version: 7.7.1
|
||||
resolution: "semver@npm:7.7.1"
|
||||
"semver@npm:^7.7.2":
|
||||
version: 7.7.2
|
||||
resolution: "semver@npm:7.7.2"
|
||||
bin:
|
||||
semver: bin/semver.js
|
||||
checksum: 586b825d36874007c9382d9e1ad8f93888d8670040add24a28e06a910aeebd673a2eb9e3bf169c6679d9245e66efb9057e0852e70d9daa6c27372aab1dda7104
|
||||
checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -5368,11 +5368,11 @@ __metadata:
|
||||
linkType: hard
|
||||
|
||||
"undici@npm:^5.25.4":
|
||||
version: 5.28.5
|
||||
resolution: "undici@npm:5.28.5"
|
||||
version: 5.29.0
|
||||
resolution: "undici@npm:5.29.0"
|
||||
dependencies:
|
||||
"@fastify/busboy": ^2.0.0
|
||||
checksum: a402d699a602a8feee1c0f78267467c8ffcbd7682267fec7a1307fd11554a32976a2307bf1cc8bf6ef7a667654336592fbd66d675df20ce28357536fb55a3a7d
|
||||
checksum: a25b5462c1b6ffb974f5ffc492ffd64146a9983aad0cbda6fde65e2b22f6f1acd43f09beacc66cc47624a113bd0c684ffc60366102b6a21b038fbfafb7d75195
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
|
||||
Reference in New Issue
Block a user