28 Commits
2.5.0 ... 2.6.1

Author SHA1 Message Date
Sven-Hendrik Haase
2b9d2847a9 2.6.1 2023-05-31 19:36:01 +02:00
Sven-Hendrik Haase
f9beb0ad08 Merge pull request #108 from regevbr/#107
fix #197 - do not overwrite, if empty
2023-05-31 19:31:09 +02:00
regevbr
1662cfa449 fix #197 - do not overwrite, if empty 2023-05-31 10:52:21 +03:00
Sven-Hendrik Haase
a5002416a0 Document running npm update after changing version 2023-05-24 02:09:52 +02:00
Sven-Hendrik Haase
58d5258088 2.6.0 2023-05-23 22:33:22 +02:00
Sven-Hendrik Haase
ffc1afa9c0 Update CHANGELOG 2023-05-23 22:31:32 +02:00
Sven-Hendrik Haase
24bced81d9 Merge pull request #74 from regevbr/body
feature - promote prerelease
2023-05-23 22:30:22 +02:00
regevbr
794b3152e1 fix #42 - overwrite body and name as well 2023-05-23 22:55:20 +03:00
regevbr
b00963776a fix #42 - overwrite body and name as well 2023-05-23 22:54:48 +03:00
regevbr
210500d479 fix #42 - overwrite body and name as well 2023-05-23 09:49:27 +03:00
Sven-Hendrik Haase
f0dfba8919 Update CHANGELOG for overwrite fixes 2023-05-23 03:52:28 +02:00
Sven-Hendrik Haase
42c63808d6 Merge pull request #106 from regevbr/body_update
fix #42 - overwrite body and name as well
2023-05-23 03:49:38 +02:00
regevbr
febd7d0808 fix #42 - overwrite body and name as well 2023-05-22 23:52:51 +03:00
Sven-Hendrik Haase
d8e2a64134 Merge pull request #105 from svenstaro/bump-deps
Bump deps
2023-05-22 22:29:47 +02:00
Sven-Hendrik Haase
a4af572b12 Bump deps 2023-05-22 22:14:47 +02:00
Sven-Hendrik Haase
7d4e20c14b Bump deps 2023-05-22 20:54:45 +02:00
Sven-Hendrik Haase
7e467024cd Merge pull request #104 from regevbr/ci_fix
fix - fix ci
2023-05-22 20:50:04 +02:00
regevbr
e225e77501 fix - fix ci 2023-05-22 21:29:20 +03:00
Sven-Hendrik Haase
6295ff030e Update CHANGELOG 2023-05-22 02:19:26 +02:00
Sven-Hendrik Haase
37a32b0167 Merge pull request #100 from brandonkelly/make-latest
Add `make_latest` param
2023-05-22 02:15:00 +02:00
Sven-Hendrik Haase
0c6fec2cea Merge pull request #102 from Loyalsoldier/fix-file-empty
Fix: skip uploading empty files
2023-05-22 02:13:13 +02:00
Sven-Hendrik Haase
37f4f3a9cd Merge pull request #103 from Loyalsoldier/fix-lock
Fix: package version in lock file
2023-05-22 02:06:56 +02:00
Loyalsoldier
dfae8c036c Fix: package version in lock file 2023-05-11 14:55:32 +08:00
Loyalsoldier
99e2100a1f Fix: skip uploading empty files 2023-05-11 14:47:45 +08:00
Sven-Hendrik Haase
664a7c20c1 Better README markup 2023-04-27 17:29:08 +02:00
brandonkelly
760a5584dc make_latest param 2023-04-12 17:36:04 -07:00
Sven-Hendrik Haase
580065490f Merge pull request #98 from edgarrmondragon/document-granular-permissions
Document usage with granular permissions
2023-04-11 08:47:18 +02:00
Edgar Ramírez Mondragón
eed453b613 Document usage with granular permissions 2023-04-11 00:05:14 -06:00
9 changed files with 15080 additions and 4860 deletions

View File

@@ -31,6 +31,7 @@ jobs:
tag: ci-test-${{ matrix.os }}-${{ github.run_id }}
overwrite: true
prerelease: true
make_latest: true
body: "rofl lol test%0Aianal %25 fubar"
- name: Check that the uploaded asset is readable
uses: actions/github-script@v2
@@ -38,10 +39,9 @@ jobs:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const fs = require('fs')
const child_process = require('child_process');
const assert = require('assert').strict;
const expected = fs.readFileSync("README.md")
const expected = fs.readFileSync("README.md", "utf-8")
const release = await github.repos.getReleaseByTag({
...context.repo,
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}",
@@ -49,8 +49,39 @@ jobs:
assert.deepStrictEqual(release.data.prerelease, true)
assert.deepStrictEqual(release.data.body, "rofl lol test\nianal % fubar")
assert.deepStrictEqual(release.data.assets[0].name, "TEST.md")
const actual = child_process.execSync(`curl -Ls ${release.data.assets[0].browser_download_url}`)
assert.deepStrictEqual(expected, actual)
const actual = await github.request(release.data.assets[0].browser_download_url)
assert.deepStrictEqual(expected, actual.data)
- name: Make test promote
uses: ./
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: README.md
asset_name: TEST.md
tag: ci-test-${{ matrix.os }}-${{ github.run_id }}
overwrite: true
promote: true
prerelease: false
make_latest: true
body: "new body"
- name: Check that the release is promoted
uses: actions/github-script@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
retries: 15
script: |
const fs = require('fs')
const assert = require('assert').strict;
const expected = fs.readFileSync("README.md", "utf-8")
const release = await github.repos.getReleaseByTag({
...context.repo,
tag: "ci-test-${{ matrix.os }}-${{ github.run_id }}",
})
assert.deepStrictEqual(release.data.prerelease, false)
assert.deepStrictEqual(release.data.body, "new body")
assert.deepStrictEqual(release.data.assets[0].name, "TEST.md")
const actual = await github.request(release.data.assets[0].browser_download_url)
assert.deepStrictEqual(expected, actual.data)
- name: Clean up
if: ${{ always() }}
uses: actions/github-script@v2

1
.gitignore vendored
View File

@@ -2,3 +2,4 @@ node_modules
run.sh
__tests__/runner/*
lib/**/*
.idea

View File

@@ -1,5 +1,15 @@
# Changelog
## [2.6.1] - 2023-05-31
- Do not overwrite body or name if empty [#108](https://github.com/svenstaro/upload-release-action/pull/108) (thanks regevbr)
## [2.6.0] - 2023-05-23
- Add `make_latest` input parameter. Can be set to `false` to prevent the created release from being marked as the latest release for the repository [#100](https://github.com/svenstaro/upload-release-action/pull/100) (thanks @brandonkelly)
- Don't try to upload empty files [#102](https://github.com/svenstaro/upload-release-action/pull/102) (thanks @Loyalsoldier)
- Bump all deps [#105](https://github.com/svenstaro/upload-release-action/pull/105)
- `overwrite` option also overwrites name and body [#106](https://github.com/svenstaro/upload-release-action/pull/106) (thanks @regevbr)
- Add `promote` option to allow prereleases to be promoted [#74](https://github.com/svenstaro/upload-release-action/pull/74) (thanks @regevbr)
## [2.5.0] - 2023-02-21
- Add retry to upload release [#96](https://github.com/svenstaro/upload-release-action/pull/96) (thanks @sonphantrung)

View File

@@ -15,9 +15,11 @@ Optional Arguments
- `tag`: The tag to upload into. If you want the current event's tag or branch name, use `${{ github.ref }}` (the `refs/tags/` and `refs/heads/` prefixes will be automatically stripped). Defaults to `github.ref`.
- `asset_name`: The name the file gets as an asset on a release. Use `$tag` to include the tag name. When not provided it will default to the filename.
This is not used if `file_glob` is set to `true`.
- `file_glob`: If set to true, the file argument can be a glob pattern (`asset_name` is ignored in this case) (Default: `false`)
- `file_glob`: If set to true, the `file` argument can be a glob pattern (`asset_name` is ignored in this case) (Default: `false`)
- `overwrite`: If an asset with the same name already exists, overwrite it (Default: `false`).
- `promote`: If a prerelease already exists, promote it to a release (Default: `false`).
- `prerelease`: Mark the release as a pre-release (Default: `false`).
- `make_latest`: Mark the release as the latest release for the repository (Default: `true`).
- `release_name`: Explicitly set a release name. (Defaults: implicitly same as `tag` via GitHub API).
- `body`: Content of the release text (Default: `""`).
- `repo_name`: Specify the name of the GitHub repository in which the GitHub release will be created, edited, and deleted. If the repository is other than the current, it is required to create a personal access token with `repo`, `user`, `admin:repo_hook` scopes to the foreign repository and add it as a secret. (Default: current repository).
@@ -206,6 +208,15 @@ jobs:
```
### Permissions
This actions requires writes access to the release. If you are using [granular permissions](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions)
in your workflow, you will need to add the `contents: write` permission to the token:
```yaml
permissions:
contents: write
```
## Releasing
@@ -213,6 +224,7 @@ To release this Action:
- Bump version in `package.json`
- Create `CHANGELOG.md` entry
- `npm update`
- `npm run all`
- `git commit -am <version>`
- `git tag -sm <version> <version>`

View File

@@ -20,10 +20,14 @@ inputs:
description: 'Name of the asset. When not provided will use the file name. Unused if file_glob is set to "true".'
overwrite:
description: 'Overwrite the release in case it already exists.'
promote:
description: 'Promote a prerelease to release. Defaults to "false".'
file_glob:
description: 'If true the file can be a glob pattern, asset_name is ignored if this is true.'
prerelease:
description: 'Mark the release as a pre-release. Defaults to "false".'
make_latest:
description: 'Mark the release the latest release for the repository. Defaults to "true".'
release_name:
description: 'Explicitly set a release name. Defaults to empty which will cause the release to take the tag as name on GitHub.'
body:

12537
dist/index.js vendored

File diff suppressed because it is too large Load Diff

7258
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,6 @@
{
"name": "upload-release-action",
"version": "2.5.0",
"version": "2.6.1",
"private": true,
"description": "Upload files to a GitHub release",
"main": "lib/main.js",
@@ -28,24 +28,26 @@
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/github": "^5",
"@actions/github": "^5.1.1",
"@lifeomic/attempt": "^3.0.3",
"glob": "^7"
"@octokit/core": "^4.2.1",
"glob": "^10"
},
"devDependencies": {
"@types/glob": "^7",
"@octokit/types": "^9.2.3",
"@types/glob": "^8",
"@types/jest": "^29",
"@types/node": "^16",
"@typescript-eslint/parser": "^5",
"@vercel/ncc": "^0.36.0",
"@vercel/ncc": "^0.36.1",
"eslint": "^8",
"eslint-plugin-github": "^4.6",
"eslint-plugin-github": "^4.7",
"eslint-plugin-jest": "^27",
"jest": "^29",
"jest-circus": "^29",
"js-yaml": "^4",
"prettier": "^2.8",
"ts-jest": "^29",
"typescript": "^4"
"typescript": "^5"
}
}

View File

@@ -9,6 +9,8 @@ import {retry} from '@lifeomic/attempt'
const releaseByTag = 'GET /repos/{owner}/{repo}/releases/tags/{tag}' as const
const createRelease = 'POST /repos/{owner}/{repo}/releases' as const
const updateRelease =
'PATCH /repos/{owner}/{repo}/releases/{release_id}' as const
const repoAssets =
'GET /repos/{owner}/{repo}/releases/{release_id}/assets' as const
const uploadAssets =
@@ -20,17 +22,23 @@ type ReleaseByTagResp = Endpoints[typeof releaseByTag]['response']
type CreateReleaseResp = Endpoints[typeof createRelease]['response']
type RepoAssetsResp = Endpoints[typeof repoAssets]['response']['data']
type UploadAssetResp = Endpoints[typeof uploadAssets]['response']
type UpdateReleaseResp = Endpoints[typeof updateRelease]['response']
type UpdateReleaseParams = Endpoints[typeof updateRelease]['parameters']
async function get_release_by_tag(
tag: string,
prerelease: boolean,
make_latest: boolean,
release_name: string,
body: string,
octokit: Octokit
): Promise<ReleaseByTagResp | CreateReleaseResp> {
octokit: Octokit,
overwrite: boolean,
promote: boolean
): Promise<ReleaseByTagResp | CreateReleaseResp | UpdateReleaseResp> {
let release: ReleaseByTagResp
try {
core.debug(`Getting release by tag ${tag}.`)
return await octokit.request(releaseByTag, {
release = await octokit.request(releaseByTag, {
...repo(),
tag: tag
})
@@ -44,6 +52,7 @@ async function get_release_by_tag(
...repo(),
tag_name: tag,
prerelease: prerelease,
make_latest: make_latest ? 'true' : 'false',
name: release_name,
body: body
})
@@ -51,10 +60,40 @@ async function get_release_by_tag(
throw error
}
}
let updateObject: Partial<UpdateReleaseParams> | undefined
if (promote && release.data.prerelease) {
core.debug(`The ${tag} is a prerelease, promoting it to a release.`)
updateObject = updateObject || {}
updateObject.prerelease = false
}
if (overwrite) {
if (release_name && release.data.name !== release_name) {
core.debug(
`The ${tag} release already exists with a different name ${release.data.name} so we'll overwrite it.`
)
updateObject = updateObject || {}
updateObject.name = release_name
}
if (body && release.data.body !== body) {
core.debug(
`The ${tag} release already exists with a different body ${release.data.body} so we'll overwrite it.`
)
updateObject = updateObject || {}
updateObject.body = body
}
}
if (updateObject) {
return octokit.request(updateRelease, {
...repo(),
...updateObject,
release_id: release.data.id
})
}
return release
}
async function upload_to_release(
release: ReleaseByTagResp | CreateReleaseResp,
release: ReleaseByTagResp | CreateReleaseResp | UpdateReleaseResp,
file: string,
asset_name: string,
tag: string,
@@ -67,7 +106,10 @@ async function upload_to_release(
return
}
const file_size = stat.size
const file_bytes: any = fs.createReadStream(file)
if (file_size === 0) {
core.debug(`Skipping ${file}, since its size is 0`)
return
}
// Check for duplicates.
const assets: RepoAssetsResp = await octokit.paginate(repoAssets, {
@@ -102,7 +144,7 @@ async function upload_to_release(
release_id: release.data.id,
url: release.data.upload_url,
name: asset_name,
data: file_bytes,
data: fs.createReadStream(file) as any,
headers: {
'content-type': 'binary/octet-stream',
'content-length': file_size
@@ -148,7 +190,9 @@ async function run(): Promise<void> {
const file_glob = core.getInput('file_glob') == 'true' ? true : false
const overwrite = core.getInput('overwrite') == 'true' ? true : false
const promote = core.getInput('promote') == 'true' ? true : false
const prerelease = core.getInput('prerelease') == 'true' ? true : false
const make_latest = core.getInput('make_latest') != 'false' ? true : false
const release_name = core.getInput('release_name')
const body = core
.getInput('body')
@@ -160,9 +204,12 @@ async function run(): Promise<void> {
const release = await get_release_by_tag(
tag,
prerelease,
make_latest,
release_name,
body,
octokit
octokit,
overwrite,
promote
)
if (file_glob) {