Skip to content

Commit 9b725e7

Browse files
authored
Improve Download GHR task (#9946)
1 parent 3b1ea3f commit 9b725e7

File tree

5 files changed

+98
-32
lines changed

5 files changed

+98
-32
lines changed

Tasks/DownloadGitHubReleaseV0/Strings/resources.resjson/en-US/resources.resjson

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
"loc.input.help.itemPattern": "Minimatch pattern to filter files to be downloaded. To download all files within release use **",
1616
"loc.input.label.downloadPath": "Destination directory",
1717
"loc.input.help.downloadPath": "Path on the agent machine where the release assets will be downloaded",
18-
"loc.messages.DownloadArtifacts": "Downloading assets of release %s from: %s",
19-
"loc.messages.ArtifactsSuccessfullyDownloaded": "Successfully downloaded release assets to %s"
18+
"loc.messages.DownloadArtifacts": "Downloading assets of release '%s' from: %s",
19+
"loc.messages.ArtifactsSuccessfullyDownloaded": "Successfully downloaded release assets to '%s'",
20+
"loc.messages.InvalidRelease": "The release Id/Tag input '%s' is not valid",
21+
"loc.messages.InvalidDefaultVersionType": "The DefaultVersionType input '%s' is not valid"
2022
}

Tasks/DownloadGitHubReleaseV0/main.ts

Lines changed: 73 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ const area: string = 'DownloadGitHubRelease';
1414
const userAgent: string = 'download-github-release-task-' + packagejson.version;
1515
const defaultRetryLimit: number = 4;
1616

17+
interface Release {
18+
Id: number;
19+
Name: string;
20+
}
21+
1722
function getDefaultProps() {
1823
var hostType = (tl.getVariable('SYSTEM.HOSTTYPE') || "").toLowerCase();
1924
return {
@@ -52,15 +57,19 @@ function publishTelemetry(feature, properties: any): void {
5257
}
5358
}
5459

55-
async function getLatestRelease(repositoryName: string, handler): Promise<string> {
56-
var promise = new Promise<string>((resolve, reject) => {
60+
async function getLatestRelease(repositoryName: string, handler): Promise<Release> {
61+
var promise = new Promise<Release>((resolve, reject) => {
5762
let httpClient: httpc.HttpClient = new httpc.HttpClient(userAgent, [handler]);
5863
let latestReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/latest";
5964
latestReleaseUrl = latestReleaseUrl.replace(/([^:]\/)\/+/g, "$1");
6065
httpClient.get(latestReleaseUrl).then((res) => {
6166
res.readBody().then((body) => {
62-
var response = JSON.parse(body);
63-
resolve(response["id"]);
67+
let response = JSON.parse(body);
68+
let release: Release = {
69+
Id: response["id"],
70+
Name: response["tag_name"]
71+
}
72+
resolve(release);
6473
});
6574
}, (reason) => {
6675
reject(reason);
@@ -70,15 +79,41 @@ async function getLatestRelease(repositoryName: string, handler): Promise<string
7079
return promise;
7180
}
7281

73-
async function getTaggedRelease(repositoryName: string, tag: string, handler): Promise<string> {
74-
var promise = new Promise<string>((resolve, reject) => {
82+
async function getTaggedRelease(repositoryName: string, tag: string, handler): Promise<Release> {
83+
var promise = new Promise<Release>((resolve, reject) => {
7584
let httpClient: httpc.HttpClient = new httpc.HttpClient(userAgent, [handler]);
7685
let taggedReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/tags/" + tag;
7786
taggedReleaseUrl = taggedReleaseUrl.replace(/([^:]\/)\/+/g, "$1");
7887
httpClient.get(taggedReleaseUrl).then((res) => {
7988
res.readBody().then((body) => {
80-
var response = JSON.parse(body);
81-
resolve(response["id"]);
89+
let response = JSON.parse(body);
90+
let release: Release = {
91+
Id: response["id"],
92+
Name: response["tag_name"]
93+
}
94+
resolve(release);
95+
});
96+
}, (reason) => {
97+
reject(reason);
98+
});
99+
});
100+
101+
return promise;
102+
}
103+
104+
async function getSpecificRelease(repositoryName: string, version: string, handler): Promise<Release> {
105+
var promise = new Promise<Release>((resolve, reject) => {
106+
let httpClient: httpc.HttpClient = new httpc.HttpClient(userAgent, [handler]);
107+
let taggedReleaseUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + version;
108+
taggedReleaseUrl = taggedReleaseUrl.replace(/([^:]\/)\/+/g, "$1");
109+
httpClient.get(taggedReleaseUrl).then((res) => {
110+
res.readBody().then((body) => {
111+
let response = JSON.parse(body);
112+
let release: Release = {
113+
Id: response["id"],
114+
Name: !!(response["name"]) ? response["name"] : response["tag_name"]
115+
}
116+
resolve(release);
82117
});
83118
}, (reason) => {
84119
reject(reason);
@@ -96,7 +131,7 @@ async function main(): Promise<void> {
96131
let itemPattern = tl.getInput("itemPattern", false);
97132
let downloadPath = tl.getInput("downloadPath", true);
98133
let version = tl.getInput("version", false);
99-
let releaseId;
134+
let release: Release = null;
100135

101136
var token = tl.getEndpointAuthorizationParameter(connection, 'AccessToken', false);
102137
var retryLimit = parseInt(tl.getVariable("VSTS_HTTP_RETRY")) ? parseInt(tl.getVariable("VSTS_HTTP_RETRY")) : defaultRetryLimit;
@@ -124,18 +159,38 @@ async function main(): Promise<void> {
124159
}
125160
}
126161

127-
switch (defaultVersionType.toLowerCase()) {
128-
case 'latest': releaseId = await executeWithRetries("getLatestRelease", () => getLatestRelease(repositoryName, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
129-
break;
130-
case 'specifictag': releaseId = await executeWithRetries("getTaggedRelease", () => getTaggedRelease(repositoryName, version, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
131-
break;
132-
case 'specificversion':
133-
default: releaseId = version;
162+
if (!!defaultVersionType) {
163+
switch (defaultVersionType.toLowerCase()) {
164+
case 'latest': release = await executeWithRetries("getLatestRelease", () => getLatestRelease(repositoryName, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
165+
break;
166+
case 'specifictag': release = await executeWithRetries("getTaggedRelease", () => getTaggedRelease(repositoryName, version, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
167+
break;
168+
case 'specificversion': release = await executeWithRetries("getSpecificRelease", () => getSpecificRelease(repositoryName, version, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
169+
break;
170+
default: release = null;
171+
}
172+
} else {
173+
if (!!version) {
174+
release = await executeWithRetries("getTaggedRelease", () => getTaggedRelease(repositoryName, version, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
175+
} else {
176+
release = await executeWithRetries("getLatestRelease", () => getLatestRelease(repositoryName, customCredentialHandler), retryLimit).catch((reason) => { reject(reason); });
177+
}
178+
}
179+
180+
if (!release) {
181+
reject(tl.loc("InvalidDefaultVersionType", defaultVersionType));
182+
return;
183+
}
184+
185+
if (!release.Id) {
186+
reject(tl.loc("InvalidRelease", version));
187+
return;
134188
}
135189

136-
var itemsUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + releaseId + "/assets";
190+
var itemsUrl = "https://api.github.com/repos/" + repositoryName + "/releases/" + release.Id + "/assets";
137191
itemsUrl = itemsUrl.replace(/([^:]\/)\/+/g, "$1");
138-
console.log(tl.loc("DownloadArtifacts", releaseId, itemsUrl));
192+
193+
console.log(tl.loc("DownloadArtifacts", release.Name, itemsUrl));
139194

140195
var templatePath = path.join(__dirname, 'githubrelease.handlebars.txt');
141196
var gitHubReleaseVariables = {

Tasks/DownloadGitHubReleaseV0/package-lock.json

Lines changed: 8 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tasks/DownloadGitHubReleaseV0/task.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"demands": [],
1111
"version": {
1212
"Major": 0,
13-
"Minor": 148,
14-
"Patch": 2
13+
"Minor": 149,
14+
"Patch": 0
1515
},
1616
"minimumAgentVersion": "1.99.0",
1717
"instanceNameFormat": "Download GitHub Release",
@@ -90,7 +90,7 @@
9090
"target": "version",
9191
"endpointId": "$(connection)",
9292
"dataSourceName": "Releases",
93-
"resultTemplate": "{ \"Value\" : \"{{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{id}}{{/equals}}\", \"DisplayValue\" : \" {{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{#if name}}{{name}}{{else}}{{id}}{{/if}}{{/equals}}\" }",
93+
"resultTemplate": "{ \"Value\" : \"{{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{id}}{{/equals}}\", \"DisplayValue\" : \" {{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{#if name}}{{name}}{{else}}{{tag_name}}{{/if}}{{/equals}}{{#if prerelease}} (Pre-release){{/if}}\" }",
9494
"parameters": {
9595
"repositoryName": "$(userRepository)",
9696
"releaseByTagName": "$(defaultVersionType)"
@@ -114,7 +114,9 @@
114114
}
115115
},
116116
"messages": {
117-
"DownloadArtifacts": "Downloading assets of release %s from: %s",
118-
"ArtifactsSuccessfullyDownloaded": "Successfully downloaded release assets to %s"
117+
"DownloadArtifacts": "Downloading assets of release '%s' from: %s",
118+
"ArtifactsSuccessfullyDownloaded": "Successfully downloaded release assets to '%s'",
119+
"InvalidRelease": "The release Id/Tag input '%s' is not valid",
120+
"InvalidDefaultVersionType": "The DefaultVersionType input '%s' is not valid"
119121
}
120122
}

Tasks/DownloadGitHubReleaseV0/task.loc.json

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
"demands": [],
1111
"version": {
1212
"Major": 0,
13-
"Minor": 148,
14-
"Patch": 2
13+
"Minor": 149,
14+
"Patch": 0
1515
},
1616
"minimumAgentVersion": "1.99.0",
1717
"instanceNameFormat": "ms-resource:loc.instanceNameFormat",
@@ -90,7 +90,7 @@
9090
"target": "version",
9191
"endpointId": "$(connection)",
9292
"dataSourceName": "Releases",
93-
"resultTemplate": "{ \"Value\" : \"{{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{id}}{{/equals}}\", \"DisplayValue\" : \" {{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{#if name}}{{name}}{{else}}{{id}}{{/if}}{{/equals}}\" }",
93+
"resultTemplate": "{ \"Value\" : \"{{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{id}}{{/equals}}\", \"DisplayValue\" : \" {{#equals defaultVersionType 'specificTag'}}{{tag_name}}{{else}}{{#if name}}{{name}}{{else}}{{tag_name}}{{/if}}{{/equals}}{{#if prerelease}} (Pre-release){{/if}}\" }",
9494
"parameters": {
9595
"repositoryName": "$(userRepository)",
9696
"releaseByTagName": "$(defaultVersionType)"
@@ -115,6 +115,8 @@
115115
},
116116
"messages": {
117117
"DownloadArtifacts": "ms-resource:loc.messages.DownloadArtifacts",
118-
"ArtifactsSuccessfullyDownloaded": "ms-resource:loc.messages.ArtifactsSuccessfullyDownloaded"
118+
"ArtifactsSuccessfullyDownloaded": "ms-resource:loc.messages.ArtifactsSuccessfullyDownloaded",
119+
"InvalidRelease": "ms-resource:loc.messages.InvalidRelease",
120+
"InvalidDefaultVersionType": "ms-resource:loc.messages.InvalidDefaultVersionType"
119121
}
120122
}

0 commit comments

Comments
 (0)