Compare commits

...

88 Commits

Author SHA1 Message Date
Sven-Hendrik Haase
84f3aed823
Merge pull request #125 from svenstaro/dependabot/npm_and_yarn/braces-3.0.3
Bump braces from 3.0.2 to 3.0.3
2024-07-07 03:16:11 +02:00
dependabot[bot]
f9770cdf31
Bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-16 09:58:52 +00:00
Sven-Hendrik Haase
1b2bf5c959
Merge pull request #123 from svenstaro/dependabot/npm_and_yarn/undici-5.28.4
Bump undici from 5.28.3 to 5.28.4
2024-04-05 03:13:44 +02:00
dependabot[bot]
265508bc9f
Bump undici from 5.28.3 to 5.28.4
Bumps [undici](https://github.com/nodejs/undici) from 5.28.3 to 5.28.4.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v5.28.3...v5.28.4)

---
updated-dependencies:
- dependency-name: undici
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-04 17:24:09 +00:00
Sven-Hendrik Haase
04733e069f
This is 2.9.0 2024-02-21 22:43:46 +01:00
Sven-Hendrik Haase
7b5b755e5b
Add CHANGELOG entry for #112 2024-02-21 22:40:15 +01:00
Sven-Hendrik Haase
17449a21ea
Add draft release support (fixes #19) 2024-02-21 22:38:32 +01:00
Sven-Hendrik Haase
ec2ff03a5a
Amend CHANGELOG 2024-02-21 22:32:30 +01:00
Sven-Hendrik Haase
ff23fb2574
This is 2.8.0 2024-02-21 22:30:30 +01:00
Sven-Hendrik Haase
8e438350b0
Bump all deps 2024-02-21 22:28:50 +01:00
Sven-Hendrik Haase
fe68892921
Merge pull request #113 from svenstaro/dependabot/npm_and_yarn/babel/traverse-7.23.2
Bump @babel/traverse from 7.22.8 to 7.23.2
2023-11-22 17:40:23 +01:00
Sven-Hendrik Haase
a13e7b5d40
Merge pull request #116 from der-eismann/update-to-node20
Update to node20
2023-11-22 17:39:45 +01:00
Philipp Trulson
a4bae284e7
Update to node20 2023-11-21 18:29:25 +01:00
dependabot[bot]
c19ddf4c20
Bump @babel/traverse from 7.22.8 to 7.23.2
Bumps [@babel/traverse](https://github.com/babel/babel/tree/HEAD/packages/babel-traverse) from 7.22.8 to 7.23.2.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.23.2/packages/babel-traverse)

---
updated-dependencies:
- dependency-name: "@babel/traverse"
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-19 11:51:41 +00:00
ShonP40
2d9c0f4337
Updated the readme 2023-09-04 13:19:28 +03:00
ShonP40
615015f76e
Forgot to add draft support here 2023-09-04 12:49:56 +03:00
ShonP40
e3374ce5b6
Ability to create draft releases 2023-09-04 10:06:26 +03:00
Sven-Hendrik Haase
1beeb572c1
2.7.0 2023-07-28 18:36:58 +02:00
Sven-Hendrik Haase
5206d34958
Bump deps 2023-07-28 18:34:08 +02:00
Sven-Hendrik Haase
80d7a7e41c
Merge pull request #46 from Spikatrix/master
Allow setting an explicit target_commitish
2023-07-28 18:28:50 +02:00
Sven-Hendrik Haase
5eb2ffd70b
Merge pull request #110 from svenstaro/dependabot/npm_and_yarn/word-wrap-1.2.4
Bump word-wrap from 1.2.3 to 1.2.4
2023-07-19 02:40:07 +02:00
dependabot[bot]
07af2f374a
Bump word-wrap from 1.2.3 to 1.2.4
Bumps [word-wrap](https://github.com/jonschlinkert/word-wrap) from 1.2.3 to 1.2.4.
- [Release notes](https://github.com/jonschlinkert/word-wrap/releases)
- [Commits](https://github.com/jonschlinkert/word-wrap/compare/1.2.3...1.2.4)

---
updated-dependencies:
- dependency-name: word-wrap
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-07-18 22:43:20 +00:00
Spikatrix
5164410c7d Push dist
Why do I always forget to do this?
2023-06-10 05:48:38 +00:00
Spikatrix
f47fb36ff1 Use the ref api to check if a tag exists 2023-06-10 05:46:02 +00:00
Spikatrix
212d4babf8 Rethrow getTag error if not 404 2023-06-10 03:58:27 +00:00
Spikatrix
7670b98fa0 Push dist files 2023-06-04 16:31:53 +05:30
Spikatrix
ac438791c4 Warn when target_commit is ignored 2023-06-04 15:01:54 +05:30
Spikatrix
545e4c402b Change single quotes to double quotes 2023-06-03 11:59:49 +05:30
Spikatrix
7d304ee154 master -> main 2023-06-01 07:32:03 +00:00
Spikatrix
3cff01dd32 Allow setting an explicit target_commitish 2023-06-01 04:55:54 +00:00
Sven-Hendrik Haase
a724093295
Fix CHANGELOG name 2023-05-31 19:38:21 +02:00
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
Sven-Hendrik Haase
7319e4733e
2.5.0 2023-02-21 15:45:38 +01:00
Sven-Hendrik Haase
4e86b8565b
Prepare release 2023-02-21 15:11:15 +01:00
Sven-Hendrik Haase
3a6baf0f12
Add CHANGELOG entry for retry feature 2023-02-21 15:08:59 +01:00
Sven-Hendrik Haase
e8c797e08e
Merge pull request #96 from sonphantrung/retry-v2
Add retry to upload release (UPDATED VERSION)
2023-02-21 15:07:45 +01:00
Son Phan Trung
cf83be2c7f Merge branch 'master' into retry-v2 2023-02-21 20:08:09 +07:00
Son Phan Trung
cfdd9b50bd Merge branch 'retry' of https://github.com/messense/upload-release-action 2023-02-21 20:06:34 +07:00
Sven-Hendrik Haase
cc92c9093e
2.4.1 2023-02-01 23:55:13 +01:00
Sven-Hendrik Haase
72f6bf584a
Merge pull request #93 from ggreif/gabor/fix
Fix uploading of assets
2023-01-31 22:49:36 +01:00
Gabor Greif
f2899b4677 use createReadStream 2023-01-31 20:27:15 +01:00
Gabor Greif
af306bddfe Revert "use the @file mechanism of octokit-5"
This reverts commit e5e4b800aa.
2023-01-31 20:23:19 +01:00
Sven-Hendrik Haase
9927d3f5ec
Merge pull request #92 from ggreif/patch-2
Use the `@file` mechanism of octokit-5
2023-01-31 11:51:05 +01:00
Gabor Greif
e5e4b800aa use the @file mechanism of octokit-5 2023-01-28 22:34:53 +01:00
Sven-Hendrik Haase
74f6bde645
Merge pull request #91 from ggreif/gabor/subst
transform back substituted characters
2023-01-21 10:51:05 +01:00
Gabor Greif
0e6c75888a move percent recovery to the last step 2023-01-20 14:40:32 +01:00
Gabor Greif
5cbce4f5ee do the transpilation 2023-01-20 03:39:20 +01:00
Gabor Greif
df11ebfac2 test % too 2023-01-19 15:19:07 +01:00
Gabor Greif
50a5b0990c also lowercase 2023-01-19 15:15:10 +01:00
Gabor Greif
0e0bd99213 first attemt to transform back substituted characters 2023-01-19 15:07:12 +01:00
Sven-Hendrik Haase
8250434419
Update to newer Octokit 2023-01-19 13:02:09 +01:00
Sven-Hendrik Haase
9093186278
Merge pull request #90 from ggreif/patch-1
Test a two-liner body
2023-01-19 11:42:10 +01:00
Sven-Hendrik Haase
321f000b6d
Go back to glob v7
It seems like glob v8 is broken on Windows for some reason.
No time to investigate this now.
2023-01-19 11:39:06 +01:00
Gabor Greif
233ab9a35e
bump 2023-01-18 23:43:37 +01:00
Gabor Greif
d3a6c14a79
check for multi-line too 2023-01-18 23:40:07 +01:00
Gabor Greif
fa5d5d5a33
test a two-liner 2023-01-18 23:33:57 +01:00
Sven-Hendrik Haase
442eb645ce
Merge pull request #89 from shawaj/patch-1
fix: updated readme to reflect updated version
2023-01-09 10:41:10 +01:00
Aaron Shaw
4d1e10f6d1
Update README.md 2023-01-09 02:24:13 +00:00
Aaron Shaw
f63a22975a
Update README.md 2023-01-09 02:13:15 +00:00
Aaron Shaw
a9842f0f62
fix: updated readme to reflect updated version
Relates-to: #85
2023-01-09 02:08:24 +00:00
messense
1819382cf9
Add retry to upload release 2022-07-03 11:23:10 +08:00
10 changed files with 38761 additions and 23036 deletions

View File

@ -24,6 +24,7 @@
"@typescript-eslint/func-call-spacing": ["error", "never"],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",

View File

@ -9,7 +9,7 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- run: |
npm install
npm run all
@ -21,7 +21,7 @@ jobs:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Make test pre-release
uses: ./
with:
@ -31,26 +31,57 @@ jobs:
tag: ci-test-${{ matrix.os }}-${{ github.run_id }}
overwrite: true
prerelease: true
body: "rofl lol test"
make_latest: true
body: "rofl lol test%0Aianal %25 fubar"
- name: Check that the uploaded asset is readable
uses: actions/github-script@v2
with:
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 }}",
})
assert.deepStrictEqual(release.data.prerelease, true)
assert.deepStrictEqual(release.data.body, "rofl lol test")
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,31 @@
# Changelog
## [2.9.0] - 2024-02-22
- Allow seeting a release as draft [#112](https://github.com/svenstaro/upload-release-action/pull/112) (thanks @ShonP40)
## [2.8.0] - 2024-02-21
- Bump all deps
- Update to node 20
## [2.7.0] - 2023-07-28
- Allow setting an explicit target_commitish [#46](https://github.com/svenstaro/upload-release-action/pull/46) (thanks @Spikatrix)
## [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)
## [2.4.1] - 2023-02-01
- Modernize octokit usage
## [2.4.0] - 2023-01-09
- Update to node 16
- Bump most dependencies

View File

@ -1,4 +1,4 @@
# Upload files to a GitHub release [![GitHub Actions Workflow](https://github.com/svenstaro/upload-release-action/workflows/PR%20Checks/badge.svg)](https://github.com/svenstaro/upload-release-action/actions)
# Upload files to a GitHub release [![GitHub Actions Workflow](https://github.com/svenstaro/upload-release-action/actions/workflows/ci.yml/badge.svg)](https://github.com/svenstaro/upload-release-action/actions)
This action allows you to select which files to upload to the just-tagged release.
It runs on all operating systems types offered by GitHub.
@ -15,10 +15,14 @@ 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`).
- `draft`: Sets the release as a draft instead of publishing it, allowing you to make any edits needed before releasing (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).
- `target_commit`: Sets the commit hash or branch for the tag to be based on (Default: the default branch, usually `main`).
- `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).
@ -47,7 +51,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Build
run: cargo build --release
- name: Upload binaries to release
@ -89,7 +93,7 @@ jobs:
asset_name: mything-macos-amd64
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Build
run: cargo build --release --locked
- name: Upload binaries to release
@ -115,7 +119,7 @@ jobs:
name: Publish binaries
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Build
run: cargo build --release
- name: Upload binaries to release
@ -144,7 +148,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
- name: Build
run: cargo build --release
- name: Upload binaries to release
@ -182,7 +186,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v3
# This step reads a file from repo and use it for body of the release
# This works on any self-hosted runner OS
@ -194,7 +198,7 @@ jobs:
r="${r//'%'/'%25'}" # Multiline escape sequences for %
r="${r//$'\n'/'%0A'}" # Multiline escape sequences for '\n'
r="${r//$'\r'/'%0D'}" # Multiline escape sequences for '\r'
echo "::set-output name=RELEASE_BODY::$r" # <--- Set environment variable
echo "RELEASE_BODY=$r" >> $GITHUB_OUTPUT # <--- Set environment variable
- name: Upload Binaries to Release
uses: svenstaro/upload-release-action@v2
@ -206,6 +210,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 +226,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,19 +20,27 @@ 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.'
draft:
description: 'Mark the release as a draft. Defaults to "false".'
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:
description: 'Content of the release text. Empty by default.'
target_commit:
description: 'Specifies the commitish value that determines where the Git tag is created from. Can be any branch or commit SHA. Unused if the Git tag already exists. Default: the repository\"s default branch (usually `main`).'
repo_name:
description: '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. Defaults to the current repository'
outputs:
browser_download_url:
description: 'The publicly available URL of the asset.'
runs:
using: 'node16'
using: 'node20'
main: 'dist/index.js'

47684
dist/index.js vendored

File diff suppressed because one or more lines are too long

13809
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.4.0",
"version": "2.9.0",
"private": true,
"description": "Upload files to a GitHub release",
"main": "lib/main.js",
@ -27,24 +27,27 @@
"author": "Sven-Hendrik Haase",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.0",
"@actions/github": "^4.0.0",
"@types/glob": "^8",
"glob": "^8"
"@actions/core": "^1.10.1",
"@actions/github": "^6.0.0",
"@lifeomic/attempt": "^3.0.3",
"@octokit/core": "^5.1.0",
"glob": "^10"
},
"devDependencies": {
"@octokit/types": "^12.5.0",
"@types/jest": "^29",
"@types/node": "^16",
"@typescript-eslint/parser": "^5",
"@vercel/ncc": "^0.36.0",
"@types/node": "^20",
"@typescript-eslint/eslint-plugin": "^7.0.2",
"@typescript-eslint/parser": "^7",
"@vercel/ncc": "^0.38.1",
"eslint": "^8",
"eslint-plugin-github": "^4.6",
"eslint-plugin-github": "^4.10",
"eslint-plugin-jest": "^27",
"jest": "^29",
"jest-circus": "^29",
"js-yaml": "^4",
"prettier": "^2.8",
"prettier": "^3.2",
"ts-jest": "^29",
"typescript": "^4"
"typescript": "^5"
}
}

View File

@ -5,26 +5,43 @@ import * as core from '@actions/core'
import * as github from '@actions/github'
import * as path from 'path'
import * as glob from 'glob'
import {retry} from '@lifeomic/attempt'
type RepoAssetsResp =
Endpoints['GET /repos/:owner/:repo/releases/:release_id/assets']['response']['data']
type ReleaseByTagResp =
Endpoints['GET /repos/:owner/:repo/releases/tags/:tag']['response']
type CreateReleaseResp =
Endpoints['POST /repos/:owner/:repo/releases']['response']
type UploadAssetResp =
Endpoints['POST /repos/:owner/:repo/releases/:release_id/assets{?name,label}']['response']
const getRef = 'GET /repos/{owner}/{repo}/git/ref/{ref}' as const
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 =
'POST {origin}/repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}' as const
const deleteAssets =
'DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}' as const
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,
draft: boolean,
prerelease: boolean,
make_latest: boolean,
release_name: string,
body: string,
octokit: Octokit
): Promise<ReleaseByTagResp | CreateReleaseResp> {
octokit: Octokit,
overwrite: boolean,
promote: boolean,
target_commit: string
): Promise<ReleaseByTagResp | CreateReleaseResp | UpdateReleaseResp> {
let release: ReleaseByTagResp
try {
core.debug(`Getting release by tag ${tag}.`)
return await octokit.repos.getReleaseByTag({
release = await octokit.request(releaseByTag, {
...repo(),
tag: tag
})
@ -34,26 +51,74 @@ async function get_release_by_tag(
core.debug(
`Release for tag ${tag} doesn't exist yet so we'll create it now.`
)
return await octokit.repos.createRelease({
if (target_commit) {
try {
await octokit.request(getRef, {
...repo(),
ref: `tags/${tag}`
})
core.warning(
`Ignoring target_commit as the tag ${tag} already exists`
)
} catch (tagError: any) {
if (tagError.status !== 404) {
throw tagError
}
}
}
return await octokit.request(createRelease, {
...repo(),
tag_name: tag,
draft: draft,
prerelease: prerelease,
make_latest: make_latest ? 'true' : 'false',
name: release_name,
body: body
body: body,
target_commitish: target_commit
})
} else {
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,
overwrite: boolean,
octokit: Octokit
octokit: ReturnType<(typeof github)['getOctokit']>
): Promise<undefined | string> {
const stat = fs.statSync(file)
if (!stat.isFile()) {
@ -61,23 +126,23 @@ async function upload_to_release(
return
}
const file_size = stat.size
const file_bytes = fs.readFileSync(file)
if (file_size === 0) {
core.debug(`Skipping ${file}, since its size is 0`)
return
}
// Check for duplicates.
const assets: RepoAssetsResp = await octokit.paginate(
octokit.repos.listReleaseAssets,
{
...repo(),
release_id: release.data.id
}
)
const assets: RepoAssetsResp = await octokit.paginate(repoAssets, {
...repo(),
release_id: release.data.id
})
const duplicate_asset = assets.find(a => a.name === asset_name)
if (duplicate_asset !== undefined) {
if (overwrite) {
core.debug(
`An asset called ${asset_name} already exists in release ${tag} so we'll overwrite it.`
)
await octokit.repos.deleteReleaseAsset({
await octokit.request(deleteAssets, {
...repo(),
asset_id: duplicate_asset.id
})
@ -92,16 +157,24 @@ async function upload_to_release(
}
core.debug(`Uploading ${file} to ${asset_name} in release ${tag}.`)
const uploaded_asset: UploadAssetResp =
await octokit.repos.uploadReleaseAsset({
url: release.data.upload_url,
name: asset_name,
data: file_bytes,
headers: {
'content-type': 'binary/octet-stream',
'content-length': file_size
}
})
const uploaded_asset: UploadAssetResp = await retry(
async () => {
return octokit.request(uploadAssets, {
...repo(),
release_id: release.data.id,
url: release.data.upload_url,
name: asset_name,
data: fs.createReadStream(file) as any,
headers: {
'content-type': 'binary/octet-stream',
'content-length': file_size
}
})
},
{
maxAttempts: 3
}
)
return uploaded_asset.data.browser_download_url
}
@ -111,11 +184,11 @@ function repo(): {owner: string; repo: string} {
if (!repo_name) {
return github.context.repo
}
const owner = repo_name.substr(0, repo_name.indexOf('/'))
const owner = repo_name.substring(0, repo_name.indexOf('/'))
if (!owner) {
throw new Error(`Could not extract 'owner' from 'repo_name': ${repo_name}.`)
}
const repo_ = repo_name.substr(repo_name.indexOf('/') + 1)
const repo_ = repo_name.substring(repo_name.indexOf('/') + 1)
if (!repo_) {
throw new Error(`Could not extract 'repo' from 'repo_name': ${repo_name}.`)
}
@ -137,17 +210,30 @@ 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 draft = core.getInput('draft') == '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')
const target_commit = core.getInput('target_commit')
const body = core
.getInput('body')
.replace(/%0A/gi, '\n')
.replace(/%0D/gi, '\r')
.replace(/%25/g, '%')
const octokit: Octokit = github.getOctokit(token)
const octokit = github.getOctokit(token)
const release = await get_release_by_tag(
tag,
draft,
prerelease,
make_latest,
release_name,
body,
octokit
octokit,
overwrite,
promote,
target_commit
)
if (file_glob) {