Skip to content

Commit 843552c

Browse files
Add upload url to release package action outputs
1 parent 31ff97e commit 843552c

File tree

3 files changed

+81
-12
lines changed

3 files changed

+81
-12
lines changed

.changeset/sixty-snails-mate.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@changesets/action": minor
3+
---
4+
5+
Add uploadUrl to publishedPackages output

README.md

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,17 @@ This action for [Changesets](https://github.com/atlassian/changesets) creates a
1616

1717
### Outputs
1818

19+
"/https:\/\/uploads\.github\.com\/repos\/([^/]+)\/([^/]+)\/releases\/(\d+)\/assets(?:\?name=([^&]+))?(?:&label=([^&]+))?/"
20+
1921
- published - A boolean value to indicate whether a publishing has happened or not
20-
- publishedPackages - A JSON array to present the published packages. The format is `[{"name": "@xx/xx", "version": "1.2.0"}, {"name": "@xx/xy", "version": "0.8.9"}]`
22+
- publishedPackages - A JSON array to present the published packages.
23+
The format is
24+
```
25+
[
26+
{"name": "@org/package1", "version": "1.2.0", "uploadUrl": "https://uploads.github.com/repos/org/repo/releases/package1_releaseId/assets{?name, label}" },
27+
{"name": "@org/package2", "version": "0.8.9", "uploadUrl": "https://uploads.github.com/repos/org/repo/releases/package2_releaseId/assets{?name, label}" }
28+
]
29+
```
2130

2231
### Example workflow:
2332

@@ -122,6 +131,46 @@ For example, you can add a step before running the Changesets GitHub Action:
122131
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
123132
```
124133

134+
#### Uploading extra assets
135+
136+
If you want to upload extra assets after a release is created you can utilize the `publishedPackages[0].uploadUrl` output.
137+
138+
```yml
139+
name: Release
140+
141+
on:
142+
push:
143+
branches:
144+
- main
145+
146+
jobs:
147+
release:
148+
name: Release
149+
runs-on: ubuntu-latest
150+
steps:
151+
- name: Checkout Repo
152+
uses: actions/checkout@v3
153+
154+
- name: Setup Node.js 20.x
155+
uses: actions/setup-node@v3
156+
with:
157+
node-version: 20.x
158+
159+
- name: Install Dependencies
160+
run: yarn
161+
162+
- name: Create Release Pull Request or Publish to npm
163+
id: changesets
164+
uses: changesets/action@v1
165+
env:
166+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
167+
168+
- name: Publish
169+
if: steps.changesets.outputs.published == 'true'
170+
# You can do something with the published packages array
171+
run: my-file-uploader upload-files {{ steps.changesets.outputs.publishedPackages }}
172+
```
173+
125174
#### Custom Publishing
126175

127176
If you want to hook into when publishing should occur but have your own publishing functionality, you can utilize the `hasChangesets` output.

src/run.ts

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ import readChangesetState from "./readChangesetState";
1818
import resolveFrom from "resolve-from";
1919
import { throttling } from "@octokit/plugin-throttling";
2020

21+
type ReleasedPackage = Package & { uploadUrl: string };
22+
2123
// GitHub Issues/PRs messages have a max size limit on the
2224
// message body payload.
2325
// `body is too long (maximum is 65536 characters)`.
@@ -76,7 +78,7 @@ const createRelease = async (
7678
);
7779
}
7880

79-
await octokit.rest.repos.createRelease({
81+
return await octokit.rest.repos.createRelease({
8082
name: tagName,
8183
tag_name: tagName,
8284
body: changelogEntry.content,
@@ -133,7 +135,8 @@ export async function runPublish({
133135
await gitUtils.pushTags();
134136

135137
let { packages, tool } = await getPackages(cwd);
136-
let releasedPackages: Package[] = [];
138+
let packagesToRelease: Package[] = [];
139+
let releasedPackages: ReleasedPackage[] = [];
137140

138141
if (tool !== "root") {
139142
let newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/;
@@ -152,18 +155,23 @@ export async function runPublish({
152155
"This is probably a bug in the action, please open an issue"
153156
);
154157
}
155-
releasedPackages.push(pkg);
158+
packagesToRelease.push(pkg);
156159
}
157160

158161
if (createGithubReleases) {
159-
await Promise.all(
160-
releasedPackages.map((pkg) =>
161-
createRelease(octokit, {
162-
pkg,
163-
tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}`,
162+
releasedPackages = (
163+
await Promise.all(
164+
packagesToRelease.map(async (pkg) => {
165+
const release = await createRelease(octokit, {
166+
pkg,
167+
tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}`,
168+
});
169+
if (release) {
170+
return { ...pkg, uploadUrl: release.data.upload_url };
171+
}
164172
})
165173
)
166-
);
174+
).filter((pkg) => pkg !== undefined);
167175
}
168176
} else {
169177
if (packages.length === 0) {
@@ -179,12 +187,18 @@ export async function runPublish({
179187
let match = line.match(newTagRegex);
180188

181189
if (match) {
182-
releasedPackages.push(pkg);
190+
packagesToRelease.push(pkg);
183191
if (createGithubReleases) {
184-
await createRelease(octokit, {
192+
const release = await createRelease(octokit, {
185193
pkg,
186194
tagName: `v${pkg.packageJson.version}`,
187195
});
196+
if (release) {
197+
releasedPackages.push({
198+
...pkg,
199+
uploadUrl: release.data.upload_url,
200+
});
201+
}
188202
}
189203
break;
190204
}
@@ -197,6 +211,7 @@ export async function runPublish({
197211
publishedPackages: releasedPackages.map((pkg) => ({
198212
name: pkg.packageJson.name,
199213
version: pkg.packageJson.version,
214+
uploadUrl: pkg.uploadUrl,
200215
})),
201216
};
202217
}

0 commit comments

Comments
 (0)