From 806b0b063180ae62705da0b9c7dcb2948c4ef901 Mon Sep 17 00:00:00 2001 From: Sven-Hendrik Haase Date: Fri, 3 Jul 2020 08:47:23 +0200 Subject: [PATCH] Add prerelease and body options --- .github/workflows/ci.yml | 4 ++++ README.md | 13 +++++++--- dist/index.js | 28 +++++++++++++--------- src/main.ts | 52 ++++++++++++++++++++++++---------------- 4 files changed, 63 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 44bb4c0..62c8c75 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -30,6 +30,8 @@ jobs: asset_name: TEST.md tag: ci-test-${{ matrix.os }} overwrite: true + prerelease: true + body: "rofl lol test" - name: Check that the uploaded asset is readable uses: actions/github-script@v2 with: @@ -44,6 +46,8 @@ jobs: ...context.repo, tag: "ci-test-${{ matrix.os }}", }) + assert.deepStrictEqual(release.data.prerelease, true) + assert.deepStrictEqual(release.data.body, "rofl lol test") const actual = child_process.execSync(`curl -Ls ${release.data.assets[0].browser_download_url}`) assert.deepStrictEqual(expected, actual) - name: Clean up diff --git a/README.md b/README.md index 89e7cce..03d9126 100644 --- a/README.md +++ b/README.md @@ -7,15 +7,21 @@ It runs on all operating systems types offered by GitHub. You must provide: -- `repo_token`: Usually you'll want to set this to `${{ secrets.GITHUB_TOKEN }}` +- `repo_token`: Usually you'll want to set this to `${{ secrets.GITHUB_TOKEN }}`. - `file`: A local file to be uploaded as the asset. - `asset_name`: The name the file gets as an asset on a release. Use `$tag` to include the tag name. - `tag`: The tag to upload into. If you want the current event's tag, use `${{ github.ref }}` (the `refs/tags/` prefix will be automatically stripped). -- `overwrite`: If an asset with the same name already exists, overwrite it. Optional Arguments - - `file_glob`: If set to true, the file argument can be a glob pattern (`asset_name` is ignored in this case) +- `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`). +- `prerelease`: Mark the release as a pre-release (Default: `false`). +- `body`: Content of the release text (Defaut: `""`). + +## Output variables + +- `browser_download_url`: The publicly available URL of the asset. ## Usage @@ -49,6 +55,7 @@ jobs: asset_name: mything tag: ${{ github.ref }} overwrite: true + body: "This is my release text" ``` Complex example with more operating systems: diff --git a/dist/index.js b/dist/index.js index 0e0d14d..a9bba5e 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2201,7 +2201,7 @@ const core = __importStar(__webpack_require__(470)); const github = __importStar(__webpack_require__(469)); const path = __importStar(__webpack_require__(622)); const glob = __importStar(__webpack_require__(402)); -function get_release_by_tag(tag, octokit) { +function get_release_by_tag(tag, prerelease, body, octokit) { return __awaiter(this, void 0, void 0, function* () { try { core.debug(`Getting release by tag ${tag}.`); @@ -2211,7 +2211,7 @@ function get_release_by_tag(tag, octokit) { // If this returns 404, we need to create the release first. if (error.status === 404) { core.debug(`Release for tag ${tag} doesn't exist yet so we'll create it now.`); - return yield octokit.repos.createRelease(Object.assign(Object.assign({}, github.context.repo), { tag_name: tag, draft: false, prerelease: true })); + return yield octokit.repos.createRelease(Object.assign(Object.assign({}, github.context.repo), { tag_name: tag, prerelease: prerelease, body: body })); } else { throw error; @@ -2232,20 +2232,20 @@ function upload_to_release(release, file, asset_name, tag, overwrite, octokit) { const assets = yield octokit.repos.listReleaseAssets(Object.assign(Object.assign({}, github.context.repo), { release_id: release.data.id })); const duplicate_asset = assets.data.find(a => a.name === asset_name); if (duplicate_asset !== undefined) { - if (overwrite === 'true') { + if (overwrite) { core.debug(`An asset called ${asset_name} already exists in release ${tag} so we'll overwrite it.`); yield octokit.repos.deleteReleaseAsset(Object.assign(Object.assign({}, github.context.repo), { asset_id: duplicate_asset.id })); } else { core.setFailed(`An asset called ${asset_name} already exists.`); - return; + return duplicate_asset.browser_download_url; } } else { core.debug(`No pre-existing asset called ${asset_name} found in release ${tag}. All good.`); } core.debug(`Uploading ${file} to ${asset_name} in release ${tag}.`); - yield octokit.repos.uploadReleaseAsset({ + const uploaded_asset = yield octokit.repos.uploadReleaseAsset({ url: release.data.upload_url, name: asset_name, data: file_bytes, @@ -2254,24 +2254,29 @@ function upload_to_release(release, file, asset_name, tag, overwrite, octokit) { 'content-length': file_size } }); + return uploaded_asset.data.browser_download_url; }); } function run() { return __awaiter(this, void 0, void 0, function* () { try { + // Get the inputs from the workflow file: https://github.com/actions/toolkit/tree/master/packages/core#inputsoutputs const token = core.getInput('repo_token', { required: true }); const file = core.getInput('file', { required: true }); - const file_glob = core.getInput('file_glob'); const tag = core.getInput('tag', { required: true }).replace('refs/tags/', ''); - const overwrite = core.getInput('overwrite'); + const file_glob = core.getInput('file_glob') == 'true' ? true : false; + const overwrite = core.getInput('overwrite') == 'true' ? true : false; + const prerelease = core.getInput('prerelease') == 'true' ? true : false; + const body = core.getInput('body'); const octokit = github.getOctokit(token); - const release = yield get_release_by_tag(tag, octokit); - if (file_glob === 'true') { + const release = yield get_release_by_tag(tag, prerelease, body, octokit); + if (file_glob) { const files = glob.sync(file); if (files.length > 0) { for (const file of files) { const asset_name = path.basename(file); - yield upload_to_release(release, file, asset_name, tag, overwrite, octokit); + const asset_download_url = yield upload_to_release(release, file, asset_name, tag, overwrite, octokit); + core.setOutput('browser_download_url', asset_download_url); } } else { @@ -2282,7 +2287,8 @@ function run() { const asset_name = core .getInput('asset_name', { required: true }) .replace(/\$tag/g, tag); - yield upload_to_release(release, file, asset_name, tag, overwrite, octokit); + const asset_download_url = yield upload_to_release(release, file, asset_name, tag, overwrite, octokit); + core.setOutput('browser_download_url', asset_download_url); } } catch (error) { diff --git a/src/main.ts b/src/main.ts index 44ff3a8..7ed3462 100644 --- a/src/main.ts +++ b/src/main.ts @@ -9,9 +9,12 @@ import * as glob from 'glob' type RepoAssetsResp = Endpoints['GET /repos/:owner/:repo/releases/:release_id/assets']['response'] 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'] async function get_release_by_tag( tag: string, + prerelease: boolean, + body: string, octokit: Octokit ): Promise { try { @@ -29,8 +32,8 @@ async function get_release_by_tag( return await octokit.repos.createRelease({ ...github.context.repo, tag_name: tag, - draft: false, - prerelease: true + prerelease: prerelease, + body: body }) } else { throw error @@ -43,9 +46,9 @@ async function upload_to_release( file: string, asset_name: string, tag: string, - overwrite: string, + overwrite: boolean, octokit: Octokit -): Promise { +): Promise { const stat = fs.statSync(file) if (!stat.isFile()) { core.debug(`Skipping ${file}, since its not a file`) @@ -61,7 +64,7 @@ async function upload_to_release( }) const duplicate_asset = assets.data.find(a => a.name === asset_name) if (duplicate_asset !== undefined) { - if (overwrite === 'true') { + if (overwrite) { core.debug( `An asset called ${asset_name} already exists in release ${tag} so we'll overwrite it.` ) @@ -71,7 +74,7 @@ async function upload_to_release( }) } else { core.setFailed(`An asset called ${asset_name} already exists.`) - return + return duplicate_asset.browser_download_url } } else { core.debug( @@ -80,34 +83,41 @@ async function upload_to_release( } core.debug(`Uploading ${file} to ${asset_name} in release ${tag}.`) - 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 octokit.repos.uploadReleaseAsset( + { + url: release.data.upload_url, + name: asset_name, + data: file_bytes, + headers: { + 'content-type': 'binary/octet-stream', + 'content-length': file_size + } } - }) + ) + return uploaded_asset.data.browser_download_url } async function run(): Promise { try { + // Get the inputs from the workflow file: https://github.com/actions/toolkit/tree/master/packages/core#inputsoutputs const token = core.getInput('repo_token', {required: true}) const file = core.getInput('file', {required: true}) - const file_glob = core.getInput('file_glob') const tag = core.getInput('tag', {required: true}).replace('refs/tags/', '') - const overwrite = core.getInput('overwrite') + + const file_glob = core.getInput('file_glob') == 'true' ? true : false + const overwrite = core.getInput('overwrite') == 'true' ? true : false + const prerelease = core.getInput('prerelease') == 'true' ? true : false + const body = core.getInput('body') const octokit: Octokit = github.getOctokit(token) - const release = await get_release_by_tag(tag, octokit) + const release = await get_release_by_tag(tag, prerelease, body, octokit) - if (file_glob === 'true') { + if (file_glob) { const files = glob.sync(file) if (files.length > 0) { for (const file of files) { const asset_name = path.basename(file) - await upload_to_release( + const asset_download_url = await upload_to_release( release, file, asset_name, @@ -115,6 +125,7 @@ async function run(): Promise { overwrite, octokit ) + core.setOutput('browser_download_url', asset_download_url) } } else { core.setFailed('No files matching the glob pattern found.') @@ -123,7 +134,7 @@ async function run(): Promise { const asset_name = core .getInput('asset_name', {required: true}) .replace(/\$tag/g, tag) - await upload_to_release( + const asset_download_url = await upload_to_release( release, file, asset_name, @@ -131,6 +142,7 @@ async function run(): Promise { overwrite, octokit ) + core.setOutput('browser_download_url', asset_download_url) } } catch (error) { core.setFailed(error.message)