Skip to content

Commit 7ed19b2

Browse files
committed
use github rest api to download releases json
Signed-off-by: CrazyMax <1951866+crazy-max@users.noreply.github.com>
1 parent 4a4d5aa commit 7ed19b2

File tree

14 files changed

+148
-82
lines changed

14 files changed

+148
-82
lines changed

__tests__/buildx/install.test.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -119,39 +119,49 @@ describe('getDownloadVersion', () => {
119119
expect(version.key).toEqual('official');
120120
expect(version.version).toEqual('latest');
121121
expect(version.downloadURL).toEqual('https://github.com/docker/buildx/releases/download/v%s/%s');
122-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json');
122+
expect(version.releasesOwner).toEqual('docker');
123+
expect(version.releasesRepo).toEqual('actions-toolkit');
124+
expect(version.releasesPath).toEqual('.github/buildx-releases.json');
123125
});
124126

125127
it('returns official v0.10.1 download version', async () => {
126128
const version = await Install.getDownloadVersion('v0.10.1');
127129
expect(version.key).toEqual('official');
128130
expect(version.version).toEqual('v0.10.1');
129131
expect(version.downloadURL).toEqual('https://github.com/docker/buildx/releases/download/v%s/%s');
130-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json');
132+
expect(version.releasesOwner).toEqual('docker');
133+
expect(version.releasesRepo).toEqual('actions-toolkit');
134+
expect(version.releasesPath).toEqual('.github/buildx-releases.json');
131135
});
132136

133137
it('returns cloud latest download version', async () => {
134138
const version = await Install.getDownloadVersion('cloud:latest');
135139
expect(version.key).toEqual('cloud');
136140
expect(version.version).toEqual('latest');
137141
expect(version.downloadURL).toEqual('https://github.com/docker/buildx-desktop/releases/download/v%s/%s');
138-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json');
142+
expect(version.releasesOwner).toEqual('docker');
143+
expect(version.releasesRepo).toEqual('actions-toolkit');
144+
expect(version.releasesPath).toEqual('.github/buildx-lab-releases.json');
139145
});
140146

141147
it('returns cloud v0.11.2-desktop.2 download version', async () => {
142148
const version = await Install.getDownloadVersion('cloud:v0.11.2-desktop.2');
143149
expect(version.key).toEqual('cloud');
144150
expect(version.version).toEqual('v0.11.2-desktop.2');
145151
expect(version.downloadURL).toEqual('https://github.com/docker/buildx-desktop/releases/download/v%s/%s');
146-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json');
152+
expect(version.releasesOwner).toEqual('docker');
153+
expect(version.releasesRepo).toEqual('actions-toolkit');
154+
expect(version.releasesPath).toEqual('.github/buildx-lab-releases.json');
147155
});
148156

149157
it('returns cloud for lab version', async () => {
150158
const version = await Install.getDownloadVersion('lab:latest');
151159
expect(version.key).toEqual('cloud');
152160
expect(version.version).toEqual('latest');
153161
expect(version.downloadURL).toEqual('https://github.com/docker/buildx-desktop/releases/download/v%s/%s');
154-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json');
162+
expect(version.releasesOwner).toEqual('docker');
163+
expect(version.releasesRepo).toEqual('actions-toolkit');
164+
expect(version.releasesPath).toEqual('.github/buildx-lab-releases.json');
155165
});
156166

157167
it('unknown repo', async () => {

__tests__/compose/install.test.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,28 +99,36 @@ describe('getDownloadVersion', () => {
9999
expect(version.key).toEqual('official');
100100
expect(version.version).toEqual('latest');
101101
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
102-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
102+
expect(version.releasesOwner).toEqual('docker');
103+
expect(version.releasesRepo).toEqual('actions-toolkit');
104+
expect(version.releasesPath).toEqual('.github/compose-releases.json');
103105
});
104106
it('returns official v2.24.3 download version', async () => {
105107
const version = await Install.getDownloadVersion('v2.24.3');
106108
expect(version.key).toEqual('official');
107109
expect(version.version).toEqual('v2.24.3');
108110
expect(version.downloadURL).toEqual('https://github.com/docker/compose/releases/download/v%s/%s');
109-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json');
111+
expect(version.releasesOwner).toEqual('docker');
112+
expect(version.releasesRepo).toEqual('actions-toolkit');
113+
expect(version.releasesPath).toEqual('.github/compose-releases.json');
110114
});
111115
it('returns cloud latest download version', async () => {
112116
const version = await Install.getDownloadVersion('cloud:latest');
113117
expect(version.key).toEqual('cloud');
114118
expect(version.version).toEqual('latest');
115119
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
116-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
120+
expect(version.releasesOwner).toEqual('docker');
121+
expect(version.releasesRepo).toEqual('actions-toolkit');
122+
expect(version.releasesPath).toEqual('.github/compose-lab-releases.json');
117123
});
118124
it('returns cloud v2.27.1-desktop.1 download version', async () => {
119125
const version = await Install.getDownloadVersion('cloud:v2.27.1-desktop.1');
120126
expect(version.key).toEqual('cloud');
121127
expect(version.version).toEqual('v2.27.1-desktop.1');
122128
expect(version.downloadURL).toEqual('https://github.com/docker/compose-desktop/releases/download/v%s/%s');
123-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json');
129+
expect(version.releasesOwner).toEqual('docker');
130+
expect(version.releasesRepo).toEqual('actions-toolkit');
131+
expect(version.releasesPath).toEqual('.github/compose-lab-releases.json');
124132
});
125133
it('unknown repo', async () => {
126134
await expect(Install.getDownloadVersion('foo:bar')).rejects.toThrow(new Error('Cannot find compose version for foo:bar'));

__tests__/regclient/install.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,13 +88,17 @@ describe('getDownloadVersion', () => {
8888
const version = await Install.getDownloadVersion('latest');
8989
expect(version.version).toEqual('latest');
9090
expect(version.downloadURL).toEqual('https://github.com/regclient/regclient/releases/download/v%s/%s');
91-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json');
91+
expect(version.releasesOwner).toEqual('docker');
92+
expect(version.releasesRepo).toEqual('actions-toolkit');
93+
expect(version.releasesPath).toEqual('.github/regclient-releases.json');
9294
});
9395
it('returns v0.8.1 download version', async () => {
9496
const version = await Install.getDownloadVersion('v0.8.1');
9597
expect(version.version).toEqual('v0.8.1');
9698
expect(version.downloadURL).toEqual('https://github.com/regclient/regclient/releases/download/v%s/%s');
97-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/regclient-releases.json');
99+
expect(version.releasesOwner).toEqual('docker');
100+
expect(version.releasesRepo).toEqual('actions-toolkit');
101+
expect(version.releasesPath).toEqual('.github/regclient-releases.json');
98102
});
99103
});
100104

__tests__/undock/install.test.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,13 +93,17 @@ describe('getDownloadVersion', () => {
9393
const version = await Install.getDownloadVersion('latest');
9494
expect(version.version).toEqual('latest');
9595
expect(version.downloadURL).toEqual('https://github.com/crazy-max/undock/releases/download/v%s/%s');
96-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/undock-releases.json');
96+
expect(version.releasesOwner).toEqual('docker');
97+
expect(version.releasesRepo).toEqual('actions-toolkit');
98+
expect(version.releasesPath).toEqual('.github/undock-releases.json');
9799
});
98100
it('returns v0.6.0 download version', async () => {
99101
const version = await Install.getDownloadVersion('v0.6.0');
100102
expect(version.version).toEqual('v0.6.0');
101103
expect(version.downloadURL).toEqual('https://github.com/crazy-max/undock/releases/download/v%s/%s');
102-
expect(version.releasesURL).toEqual('https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/undock-releases.json');
104+
expect(version.releasesOwner).toEqual('docker');
105+
expect(version.releasesRepo).toEqual('actions-toolkit');
106+
expect(version.releasesPath).toEqual('.github/undock-releases.json');
103107
});
104108
});
105109

src/buildx/install.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,6 @@ import fs from 'fs';
1818
import os from 'os';
1919
import path from 'path';
2020
import * as core from '@actions/core';
21-
import * as httpm from '@actions/http-client';
22-
import {BearerCredentialHandler} from '@actions/http-client/lib/auth';
2321
import * as tc from '@actions/tool-cache';
2422
import * as semver from 'semver';
2523
import * as util from 'util';
@@ -30,6 +28,7 @@ import {Context} from '../context';
3028
import {Exec} from '../exec';
3129
import {Docker} from '../docker/docker';
3230
import {Git} from '../git';
31+
import {GitHub} from '../github';
3332
import {Util} from '../util';
3433

3534
import {DownloadVersion} from '../types/buildx/buildx';
@@ -289,15 +288,19 @@ export class Install {
289288
key: repoKey,
290289
version: version,
291290
downloadURL: 'https://github.com/docker/buildx/releases/download/v%s/%s',
292-
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-releases.json'
291+
releasesOwner: 'docker',
292+
releasesRepo: 'actions-toolkit',
293+
releasesPath: '.github/buildx-releases.json'
293294
};
294295
}
295296
case 'cloud': {
296297
return {
297298
key: repoKey,
298299
version: version,
299300
downloadURL: 'https://github.com/docker/buildx-desktop/releases/download/v%s/%s',
300-
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/buildx-lab-releases.json'
301+
releasesOwner: 'docker',
302+
releasesRepo: 'actions-toolkit',
303+
releasesPath: '.github/buildx-lab-releases.json'
301304
};
302305
}
303306
default: {
@@ -307,17 +310,22 @@ export class Install {
307310
}
308311

309312
public static async getRelease(version: DownloadVersion, githubToken?: string): Promise<GitHubRelease> {
310-
githubToken = githubToken || process.env.GITHUB_TOKEN;
311-
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit', githubToken ? [new BearerCredentialHandler(githubToken)] : undefined);
312-
const resp: httpm.HttpClientResponse = await http.get(version.releasesURL);
313-
const body = await resp.readBody();
314-
const statusCode = resp.message.statusCode || 500;
315-
if (statusCode >= 400) {
316-
throw new Error(`Failed to get Buildx releases from ${version.releasesURL} with status code ${statusCode}: ${body}`);
313+
let releasesJSON: string;
314+
try {
315+
const github = new GitHub({token: githubToken});
316+
const resp = await github.octokit.rest.repos.getContent({
317+
owner: version.releasesOwner,
318+
repo: version.releasesRepo,
319+
path: version.releasesPath
320+
});
321+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
322+
releasesJSON = Buffer.from((resp.data as any).content, (resp.data as any).encoding).toString();
323+
} catch (error) {
324+
throw new Error(`Failed to get Buildx releases: ${error instanceof Error ? error.message : error}`);
317325
}
318-
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
326+
const releases = <Record<string, GitHubRelease>>JSON.parse(releasesJSON);
319327
if (!releases[version.version]) {
320-
throw new Error(`Cannot find Buildx release ${version.version} in ${version.releasesURL}`);
328+
throw new Error(`Cannot find Buildx release ${version.version} in releases JSON`);
321329
}
322330
return releases[version.version];
323331
}

src/compose/install.ts

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,17 @@ import fs from 'fs';
1818
import os from 'os';
1919
import path from 'path';
2020
import * as core from '@actions/core';
21-
import * as httpm from '@actions/http-client';
22-
import {BearerCredentialHandler} from '@actions/http-client/lib/auth';
2321
import * as tc from '@actions/tool-cache';
2422
import * as semver from 'semver';
2523
import * as util from 'util';
2624

2725
import {Cache} from '../cache';
2826
import {Context} from '../context';
27+
import {Docker} from '../docker/docker';
28+
import {GitHub} from '../github';
2929

3030
import {DownloadVersion} from '../types/compose/compose';
3131
import {GitHubRelease} from '../types/github';
32-
import {Docker} from '../docker/docker';
3332

3433
export interface InstallOpts {
3534
standalone?: boolean;
@@ -187,15 +186,19 @@ export class Install {
187186
key: repoKey,
188187
version: version,
189188
downloadURL: 'https://github.com/docker/compose/releases/download/v%s/%s',
190-
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-releases.json'
189+
releasesOwner: 'docker',
190+
releasesRepo: 'actions-toolkit',
191+
releasesPath: '.github/compose-releases.json'
191192
};
192193
}
193194
case 'cloud': {
194195
return {
195196
key: repoKey,
196197
version: version,
197198
downloadURL: 'https://github.com/docker/compose-desktop/releases/download/v%s/%s',
198-
releasesURL: 'https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/compose-lab-releases.json'
199+
releasesOwner: 'docker',
200+
releasesRepo: 'actions-toolkit',
201+
releasesPath: '.github/compose-lab-releases.json'
199202
};
200203
}
201204
default: {
@@ -205,17 +208,22 @@ export class Install {
205208
}
206209

207210
public static async getRelease(version: DownloadVersion, githubToken?: string): Promise<GitHubRelease> {
208-
githubToken = githubToken || process.env.GITHUB_TOKEN;
209-
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit', githubToken ? [new BearerCredentialHandler(githubToken)] : undefined);
210-
const resp: httpm.HttpClientResponse = await http.get(version.releasesURL);
211-
const body = await resp.readBody();
212-
const statusCode = resp.message.statusCode || 500;
213-
if (statusCode >= 400) {
214-
throw new Error(`Failed to get Compose releases from ${version.releasesURL} with status code ${statusCode}: ${body}`);
211+
let releasesJSON: string;
212+
try {
213+
const github = new GitHub({token: githubToken});
214+
const resp = await github.octokit.rest.repos.getContent({
215+
owner: version.releasesOwner,
216+
repo: version.releasesRepo,
217+
path: version.releasesPath
218+
});
219+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
220+
releasesJSON = Buffer.from((resp.data as any).content, (resp.data as any).encoding).toString();
221+
} catch (error) {
222+
throw new Error(`Failed to get Compose releases: ${error instanceof Error ? error.message : error}`);
215223
}
216-
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
224+
const releases = <Record<string, GitHubRelease>>JSON.parse(releasesJSON);
217225
if (!releases[version.version]) {
218-
throw new Error(`Cannot find Compose release ${version.version} in ${version.releasesURL}`);
226+
throw new Error(`Cannot find Compose release ${version.version} in releases JSON`);
219227
}
220228
return releases[version.version];
221229
}

src/docker/install.ts

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,17 @@ import path from 'path';
2222
import retry from 'async-retry';
2323
import * as handlebars from 'handlebars';
2424
import * as core from '@actions/core';
25-
import * as httpm from '@actions/http-client';
26-
import {BearerCredentialHandler} from '@actions/http-client/lib/auth';
2725
import * as io from '@actions/io';
2826
import * as tc from '@actions/tool-cache';
2927

3028
import {Context} from '../context';
3129
import {Docker} from './docker';
30+
import {Exec} from '../exec';
31+
import {GitHub} from '../github';
3232
import {Regctl} from '../regclient/regctl';
3333
import {Undock} from '../undock/undock';
34-
import {Exec} from '../exec';
3534
import {Util} from '../util';
35+
3636
import {limaYamlData, dockerServiceLogsPs1, setupDockerWinPs1} from './assets';
3737

3838
import {GitHubRelease} from '../types/github';
@@ -699,19 +699,23 @@ EOF`,
699699
}
700700

701701
public static async getRelease(version: string, githubToken?: string): Promise<GitHubRelease> {
702-
githubToken = githubToken || process.env.GITHUB_TOKEN;
703-
const url = `https://raw.githubusercontent.com/docker/actions-toolkit/main/.github/docker-releases.json`;
704-
const http: httpm.HttpClient = new httpm.HttpClient('docker-actions-toolkit', githubToken ? [new BearerCredentialHandler(githubToken)] : undefined);
705-
const resp: httpm.HttpClientResponse = await http.get(url);
706-
const body = await resp.readBody();
707-
const statusCode = resp.message.statusCode || 500;
708-
if (statusCode >= 400) {
709-
throw new Error(`Failed to get Docker release ${version} from ${url} with status code ${statusCode}: ${body}`);
702+
let releasesJSON: string;
703+
try {
704+
const github = new GitHub({token: githubToken});
705+
const resp = await github.octokit.rest.repos.getContent({
706+
owner: 'docker',
707+
repo: 'actions-toolkit',
708+
path: '.github/docker-releases.json'
709+
});
710+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
711+
releasesJSON = Buffer.from((resp.data as any).content, (resp.data as any).encoding).toString();
712+
} catch (error) {
713+
throw new Error(`Failed to get Docker releases: ${error instanceof Error ? error.message : error}`);
710714
}
711-
const releases = <Record<string, GitHubRelease>>JSON.parse(body);
715+
const releases = <Record<string, GitHubRelease>>JSON.parse(releasesJSON);
712716
if (!releases[version]) {
713717
if (!releases['v' + version]) {
714-
throw new Error(`Cannot find Docker release ${version} in ${url}`);
718+
throw new Error(`Cannot find Docker release ${version} in releases JSON`);
715719
}
716720
return releases['v' + version];
717721
}

src/github.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ export class GitHub {
4747
public readonly octokit: InstanceType<typeof Octokit>;
4848

4949
constructor(opts?: GitHubOpts) {
50-
this.octokit = github.getOctokit(`${opts?.token}`);
50+
this.octokit = github.getOctokit(`${opts?.token || process.env.GITHUB_TOKEN}`);
5151
}
5252

5353
public repoData(): Promise<GitHubRepo> {

0 commit comments

Comments
 (0)