feat: add Gitea support (#1106)

Co-authored-by: FabianLars <github@fabianlars.de>
This commit is contained in:
s1adem4n
2025-11-04 13:28:13 +01:00
committed by GitHub
parent c2b5c6db9b
commit 08112f729d
10 changed files with 235 additions and 80 deletions

5
.changes/gitea.md Normal file
View File

@@ -0,0 +1,5 @@
---
action: minor
---
Added experimental support for Gitea hosted instances.

View File

@@ -0,0 +1,5 @@
---
action: patch
---
Added a config to set the GitHub API URL which should help users with self-hosted instances and those using GitHub Enterprise.

View File

@@ -114,19 +114,21 @@ These inputs allow you to change how your Tauri project will be build.
These inputs allow you to modify the GitHub release.
| Name | Required | Description | Type | Default |
| ------------------- | :------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------- |
| `releaseId` | false | The id of the release to upload artifacts as release assets. If set, `tagName` and `releaseName` will not be considered to find a release. | number | |
| `tagName` | false | The tag name of the release to upload/create or the tag of the release belonging to `releaseId` | string | |
| `releaseName` | false | The name of the release to create. Required if there's no existing release for `tagName` | string | |
| `releaseBody` | false | The body of the release to create | string | |
| `releaseDraft` | false | Whether the release to find or create is a draft or not | bool | false |
| `prerelease` | false | Whether the release to create is a prerelease or not | bool | false |
| `releaseCommitish` | false | Any branch or commit SHA the Git tag is created from, unused if the Git tag already exists. | string | SHA of current commit |
| `owner` | false | The account owner of the repository the release will be uploaded to. Requires `GITHUB_TOKEN` in env and a `releaseCommitish` target if it doesn't match the current repo. | string | owner of the current repo |
| `repo` | false | The name of the repository the release will be uploaded to. Requires `GITHUB_TOKEN` in env and a `releaseCommitish` target if it doesn't match the current repo. | string | name of the current repo |
| `assetNamePattern` | false | The naming pattern to use for the uploaded assets. If not set, the names given by Tauri's CLI are kept. | string | none |
| `uploadPlainBinary` | false | Whether to upload the unbundled executable binary or not. Requires Tauri v2+. To prevent issues with Tauri's [`bundle_type`](https://docs.rs/tauri-utils/latest/tauri_utils/platform/fn.bundle_type.html) value this should only be used with the `--no-bundle` flag. | bool | false |
| Name | Required | Description | Type | Default |
| ------------------- | :------: | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | ------------------------------------------- |
| `releaseId` | false | The id of the release to upload artifacts as release assets. If set, `tagName` and `releaseName` will not be considered to find a release. | number | |
| `tagName` | false | The tag name of the release to upload/create or the tag of the release belonging to `releaseId` | string | |
| `releaseName` | false | The name of the release to create. Required if there's no existing release for `tagName` | string | |
| `releaseBody` | false | The body of the release to create | string | |
| `releaseDraft` | false | Whether the release to find or create is a draft or not | bool | false |
| `prerelease` | false | Whether the release to create is a prerelease or not | bool | false |
| `releaseCommitish` | false | Any branch or commit SHA the Git tag is created from, unused if the Git tag already exists. | string | SHA of current commit |
| `owner` | false | The account owner of the repository the release will be uploaded to. Requires `GITHUB_TOKEN` in env and a `releaseCommitish` target if it doesn't match the current repo. | string | owner of the current repo |
| `repo` | false | The name of the repository the release will be uploaded to. Requires `GITHUB_TOKEN` in env and a `releaseCommitish` target if it doesn't match the current repo. | string | name of the current repo |
| `githubBaseUrl` | false | The base URL of the GitHub API to use. This is useful if you want to use a self-hosted GitHub instance or a GitHub Enterprise server. | string | `$GITHUB_API_URL` or https://api.github.com |
| `isGitea` | false | Whether to run in Gitea compatibility mode. Set this if `githubBaseUrl` targets a Gitea instance, since some API endpoints differ from GitHub. | bool | false |
| `assetNamePattern` | false | The naming pattern to use for the uploaded assets. If not set, the names given by Tauri's CLI are kept. | string | none |
| `uploadPlainBinary` | false | Whether to upload the unbundled executable binary or not. Requires Tauri v2+. To prevent issues with Tauri's [`bundle_type`](https://docs.rs/tauri-utils/latest/tauri_utils/platform/fn.bundle_type.html) value this should only be used with the `--no-bundle` flag. | bool | false |
## Outputs
@@ -160,6 +162,7 @@ These inputs allow you to modify the GitHub release.
- `[mode]` will be replaced with `debug` or `release`, depending on `includeDebug` and `includeRelease`.
- `[setup]` will be replaced with `-setup` which can be used to differenciate between the NSIS installer and the binary from `uploadPlainBinary`. For all other bundle types it will be an empty string.
- `[_setup]` behaves like `[setup]` but with `_setup` instead of `-setup`.
- Gitea support is experimental. It was implemented and tested solely by the community.
## Partners

View File

@@ -58,6 +58,11 @@ inputs:
description: 'The account owner of the repository'
repo:
description: 'The name of the repository'
githubBaseUrl:
description: 'The base URL of the GitHub API to use. This is useful if you want to use a self-hosted GitHub instance or a GitHub Enterprise server.'
isGitea:
description: 'Whether to run in Gitea compatibility mode. Set this if `githubBaseUrl` targets a Gitea instance, since some API endpoints differ from GitHub'
default: 'false'
assetNamePattern:
description: 'The naming pattern to use for the uploaded assets'
uploadPlainBinary:

111
dist/index.js vendored
View File

@@ -42926,12 +42926,14 @@ function allReleases(github, owner, repo) {
return github.paginate.iterator(github.rest.repos.listReleases.endpoint.merge(params));
}
/// Try to get release by tag. If there's none, releaseName is required to create one.
async function getOrCreateRelease(owner, repo, tagName, releaseName, body, commitish, draft = true, prerelease = true) {
async function getOrCreateRelease(owner, repo, tagName, githubBaseUrl, releaseName, body, commitish, draft = true, prerelease = true) {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
}
// Get authenticated GitHub client (Ocktokit): https://github.com/actions/toolkit/tree/master/packages/github#usage
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_2__.getOctokit)(process.env.GITHUB_TOKEN);
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_2__.getOctokit)(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const bodyPath = _actions_core__WEBPACK_IMPORTED_MODULE_1__.getInput('body_path', { required: false });
let bodyFileContent = null;
if (bodyPath !== '' && !!bodyPath) {
@@ -43067,6 +43069,10 @@ async function run() {
const draft = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getBooleanInput('releaseDraft');
const prerelease = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getBooleanInput('prerelease');
const commitish = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getInput('releaseCommitish') || null;
const githubBaseUrl = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getInput('githubBaseUrl') ||
process.env.GITHUB_API_URL ||
'https://api.github.com';
const isGitea = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getBooleanInput('isGitea');
// TODO: Change its default to true for v2 apps
// Not using getBooleanInput so we can differentiate between true,false,unset later.
const updaterJsonPreferNsis = _actions_core__WEBPACK_IMPORTED_MODULE_2__.getInput('updaterJsonPreferNsis')?.toLowerCase() === 'true';
@@ -43150,16 +43156,16 @@ async function run() {
releaseName = releaseName.replace(regex, template.value);
body = body.replace(regex, template.value);
});
const releaseData = await (0,_create_release__WEBPACK_IMPORTED_MODULE_4__/* .getOrCreateRelease */ .l)(owner, repo, tagName, releaseName || undefined, body, commitish || undefined, draft, prerelease);
const releaseData = await (0,_create_release__WEBPACK_IMPORTED_MODULE_4__/* .getOrCreateRelease */ .l)(owner, repo, tagName, githubBaseUrl, releaseName || undefined, body, commitish || undefined, draft, prerelease);
releaseId = releaseData.id;
_actions_core__WEBPACK_IMPORTED_MODULE_2__.setOutput('releaseUploadUrl', releaseData.uploadUrl);
_actions_core__WEBPACK_IMPORTED_MODULE_2__.setOutput('releaseId', releaseData.id.toString());
_actions_core__WEBPACK_IMPORTED_MODULE_2__.setOutput('releaseHtmlUrl', releaseData.htmlUrl);
}
if (releaseId) {
await (0,_upload_release_assets__WEBPACK_IMPORTED_MODULE_5__/* .uploadAssets */ .r)(owner, repo, releaseId, artifacts, retryAttempts, assetNamePattern);
await (0,_upload_release_assets__WEBPACK_IMPORTED_MODULE_5__/* .uploadAssets */ .r)(owner, repo, releaseId, artifacts, retryAttempts, githubBaseUrl, isGitea, assetNamePattern);
if (includeUpdaterJson) {
await (0,_upload_version_json__WEBPACK_IMPORTED_MODULE_6__/* .uploadVersionJSON */ .Y)(owner, repo, info.version, body, tagName, releaseId, releaseArtifacts.length !== 0 ? releaseArtifacts : debugArtifacts, targetInfo, info.unzippedSigs, updaterJsonPreferNsis, updaterJsonKeepUniversal, retryAttempts, assetNamePattern);
await (0,_upload_version_json__WEBPACK_IMPORTED_MODULE_6__/* .uploadVersionJSON */ .Y)(owner, repo, info.version, body, tagName, releaseId, releaseArtifacts.length !== 0 ? releaseArtifacts : debugArtifacts, targetInfo, info.unzippedSigs, updaterJsonPreferNsis, updaterJsonKeepUniversal, retryAttempts, githubBaseUrl, isGitea, assetNamePattern);
}
}
else {
@@ -43193,11 +43199,13 @@ __webpack_async_result__();
async function uploadAssets(owner, repo, releaseId, assets, retryAttempts, assetNamePattern) {
async function uploadAssets(owner, repo, releaseId, assets, retryAttempts, githubBaseUrl, isGitea, assetNamePattern) {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
}
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_1__.getOctokit)(process.env.GITHUB_TOKEN);
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_1__.getOctokit)(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const existingAssets = (await github.rest.repos.listReleaseAssets({
owner: owner,
repo: repo,
@@ -43221,11 +43229,16 @@ async function uploadAssets(owner, repo, releaseId, assets, retryAttempts, asset
.replace(/[\u0300-\u036f]/g, ''));
if (existingAsset) {
console.log(`Deleting existing ${assetName}...`);
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
asset_id: existingAsset.id,
});
if (isGitea) {
await (0,_utils__WEBPACK_IMPORTED_MODULE_2__/* .deleteGiteaReleaseAsset */ .Rx)(github, owner, repo, releaseId, existingAsset.id);
}
else {
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
asset_id: existingAsset.id,
});
}
}
console.log(`Uploading ${assetName}...`);
await (0,_utils__WEBPACK_IMPORTED_MODULE_2__/* .retry */ .L5)(() => github.rest.repos.uploadReleaseAsset({
@@ -43237,6 +43250,7 @@ async function uploadAssets(owner, repo, releaseId, assets, retryAttempts, asset
owner: owner,
repo: repo,
release_id: releaseId,
baseUrl: githubBaseUrl,
}), retryAttempts + 1);
}
}
@@ -43264,11 +43278,13 @@ async function uploadAssets(owner, repo, releaseId, assets, retryAttempts, asset
async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId, artifacts, targetInfo, unzippedSig, updaterJsonPreferNsis, updaterJsonKeepUniversal, retryAttempts, assetNamePattern) {
async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId, artifacts, targetInfo, unzippedSig, updaterJsonPreferNsis, updaterJsonKeepUniversal, retryAttempts, githubBaseUrl, isGitea, assetNamePattern) {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
}
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_2__.getOctokit)(process.env.GITHUB_TOKEN);
const github = (0,_actions_github__WEBPACK_IMPORTED_MODULE_2__.getOctokit)(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const versionFilename = 'latest.json';
const versionFile = (0,node_path__WEBPACK_IMPORTED_MODULE_1__.resolve)(process.cwd(), versionFilename);
const versionContent = {
@@ -43285,16 +43301,31 @@ async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId
});
const asset = assets.data.find((e) => e.name === versionFilename);
if (asset) {
const assetData = (await github.request('GET /repos/{owner}/{repo}/releases/assets/{asset_id}', {
owner: owner,
repo: repo,
asset_id: asset.id,
headers: {
accept: 'application/octet-stream',
},
})).data;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(Buffer.from(assetData).toString()).platforms;
if (isGitea) {
const info = (await github.request('GET /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}', {
owner,
repo,
release_id: releaseId,
asset_id: asset.id,
})).data;
const data = (await github.request(`GET ${info.browser_download_url}`))
.data;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(data).platforms;
}
else {
const assetData = (await github.request(`GET /repos/{owner}/{repo}/releases/assets/{asset_id}`, {
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
headers: {
accept: 'application/octet-stream',
},
})).data;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(Buffer.from(assetData).toString()).platforms;
}
}
const downloadUrls = new Map();
for (const data of assets.data) {
@@ -43424,13 +43455,18 @@ async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId
}
(0,node_fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync)(versionFile, JSON.stringify(versionContent, null, 2));
if (asset) {
// https://docs.github.com/en/rest/releases/assets#update-a-release-asset
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
});
if (isGitea) {
await (0,_utils__WEBPACK_IMPORTED_MODULE_4__/* .deleteGiteaReleaseAsset */ .Rx)(github, owner, repo, releaseId, asset.id);
}
else {
// https://docs.github.com/en/rest/releases/assets#update-a-release-asset
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
});
}
}
const artifact = (0,_utils__WEBPACK_IMPORTED_MODULE_4__/* .createArtifact */ .Dg)({
path: versionFile,
@@ -43441,7 +43477,7 @@ async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId
bundle: '',
version,
});
await (0,_upload_release_assets__WEBPACK_IMPORTED_MODULE_3__/* .uploadAssets */ .r)(owner, repo, releaseId, [artifact], retryAttempts);
await (0,_upload_release_assets__WEBPACK_IMPORTED_MODULE_3__/* .uploadAssets */ .r)(owner, repo, releaseId, [artifact], retryAttempts, githubBaseUrl, isGitea);
}
@@ -43454,6 +43490,7 @@ async function uploadVersionJSON(owner, repo, version, notes, tagName, releaseId
// EXPORTS
__nccwpck_require__.d(__webpack_exports__, {
Dg: () => (/* binding */ createArtifact),
Rx: () => (/* binding */ deleteGiteaReleaseAsset),
NK: () => (/* binding */ execCommand),
wm: () => (/* binding */ getAssetName),
Vp: () => (/* binding */ getInfo),
@@ -53502,6 +53539,16 @@ async function retry(fn, attempts) {
}
}
}
// Helper function to delete a Gitea release asset
// This is a workaround since Gitea's API is incompatible with the GitHub API
function deleteGiteaReleaseAsset(github, owner, repo, releaseId, assetId) {
return github.request('DELETE /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}', {
owner,
repo,
release_id: releaseId,
asset_id: assetId,
});
}
// TODO: Properly resolve the eslint issues in this file.

View File

@@ -33,6 +33,7 @@ export async function getOrCreateRelease(
owner: string,
repo: string,
tagName: string,
githubBaseUrl: string,
releaseName?: string,
body?: string,
commitish?: string,
@@ -44,7 +45,9 @@ export async function getOrCreateRelease(
}
// Get authenticated GitHub client (Ocktokit): https://github.com/actions/toolkit/tree/master/packages/github#usage
const github = getOctokit(process.env.GITHUB_TOKEN);
const github = getOctokit(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const bodyPath = core.getInput('body_path', { required: false });
let bodyFileContent: string | null = null;

View File

@@ -45,6 +45,11 @@ async function run(): Promise<void> {
const draft = core.getBooleanInput('releaseDraft');
const prerelease = core.getBooleanInput('prerelease');
const commitish = core.getInput('releaseCommitish') || null;
const githubBaseUrl =
core.getInput('githubBaseUrl') ||
process.env.GITHUB_API_URL ||
'https://api.github.com';
const isGitea = core.getBooleanInput('isGitea');
// TODO: Change its default to true for v2 apps
// Not using getBooleanInput so we can differentiate between true,false,unset later.
@@ -178,6 +183,7 @@ async function run(): Promise<void> {
owner,
repo,
tagName,
githubBaseUrl,
releaseName || undefined,
body,
commitish || undefined,
@@ -197,6 +203,8 @@ async function run(): Promise<void> {
releaseId,
artifacts,
retryAttempts,
githubBaseUrl,
isGitea,
assetNamePattern,
);
@@ -214,6 +222,8 @@ async function run(): Promise<void> {
updaterJsonPreferNsis,
updaterJsonKeepUniversal,
retryAttempts,
githubBaseUrl,
isGitea,
assetNamePattern,
);
}

View File

@@ -2,7 +2,7 @@ import fs from 'node:fs';
import { getOctokit } from '@actions/github';
import { getAssetName, retry } from './utils';
import { deleteGiteaReleaseAsset, getAssetName, retry } from './utils';
import type { Artifact } from './types';
export async function uploadAssets(
@@ -11,13 +11,17 @@ export async function uploadAssets(
releaseId: number,
assets: Artifact[],
retryAttempts: number,
githubBaseUrl: string,
isGitea: boolean,
assetNamePattern?: string,
) {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
}
const github = getOctokit(process.env.GITHUB_TOKEN);
const github = getOctokit(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const existingAssets = (
await github.rest.repos.listReleaseAssets({
@@ -49,13 +53,24 @@ export async function uploadAssets(
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, ''),
);
if (existingAsset) {
console.log(`Deleting existing ${assetName}...`);
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
asset_id: existingAsset.id,
});
if (isGitea) {
await deleteGiteaReleaseAsset(
github,
owner,
repo,
releaseId,
existingAsset.id,
);
} else {
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
asset_id: existingAsset.id,
});
}
}
console.log(`Uploading ${assetName}...`);
@@ -71,6 +86,7 @@ export async function uploadAssets(
owner: owner,
repo: repo,
release_id: releaseId,
baseUrl: githubBaseUrl,
}),
retryAttempts + 1,
);

View File

@@ -4,7 +4,7 @@ import { basename, extname, resolve } from 'node:path';
import { getOctokit } from '@actions/github';
import { uploadAssets } from './upload-release-assets';
import { getAssetName } from './utils';
import { deleteGiteaReleaseAsset, getAssetName } from './utils';
import type { Artifact, TargetInfo } from './types';
import { createArtifact } from './utils';
@@ -36,13 +36,17 @@ export async function uploadVersionJSON(
updaterJsonPreferNsis: boolean,
updaterJsonKeepUniversal: boolean,
retryAttempts: number,
githubBaseUrl: string,
isGitea: boolean,
assetNamePattern?: string,
) {
if (process.env.GITHUB_TOKEN === undefined) {
throw new Error('GITHUB_TOKEN is required');
}
const github = getOctokit(process.env.GITHUB_TOKEN);
const github = getOctokit(process.env.GITHUB_TOKEN, {
baseUrl: githubBaseUrl,
});
const versionFilename = 'latest.json';
const versionFile = resolve(process.cwd(), versionFilename);
@@ -62,25 +66,49 @@ export async function uploadVersionJSON(
const asset = assets.data.find((e) => e.name === versionFilename);
if (asset) {
const assetData = (
await github.request(
'GET /repos/{owner}/{repo}/releases/assets/{asset_id}',
{
owner: owner,
repo: repo,
asset_id: asset.id,
headers: {
accept: 'application/octet-stream',
if (isGitea) {
const info = (
await github.request(
'GET /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}',
{
owner,
repo,
release_id: releaseId,
asset_id: asset.id,
},
},
)
).data as unknown as ArrayBuffer;
)
).data as { browser_download_url: string };
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(
Buffer.from(assetData).toString(),
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
).platforms;
const data = (await github.request(`GET ${info.browser_download_url}`))
.data as string;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(
data,
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
).platforms;
} else {
const assetData = (
await github.request(
`GET /repos/{owner}/{repo}/releases/assets/{asset_id}`,
{
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
headers: {
accept: 'application/octet-stream',
},
},
)
).data as unknown as ArrayBuffer;
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
versionContent.platforms = JSON.parse(
Buffer.from(assetData).toString(),
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
).platforms;
}
}
const downloadUrls = new Map<string, string>();
@@ -239,13 +267,17 @@ export async function uploadVersionJSON(
writeFileSync(versionFile, JSON.stringify(versionContent, null, 2));
if (asset) {
// https://docs.github.com/en/rest/releases/assets#update-a-release-asset
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
});
if (isGitea) {
await deleteGiteaReleaseAsset(github, owner, repo, releaseId, asset.id);
} else {
// https://docs.github.com/en/rest/releases/assets#update-a-release-asset
await github.rest.repos.deleteReleaseAsset({
owner: owner,
repo: repo,
release_id: releaseId,
asset_id: asset.id,
});
}
}
const artifact = createArtifact({
@@ -258,5 +290,13 @@ export async function uploadVersionJSON(
version,
});
await uploadAssets(owner, repo, releaseId, [artifact], retryAttempts);
await uploadAssets(
owner,
repo,
releaseId,
[artifact],
retryAttempts,
githubBaseUrl,
isGitea,
);
}

View File

@@ -22,6 +22,7 @@ import type {
TargetInfo,
TargetPlatform,
} from './types';
import { GitHub } from '@actions/github/lib/utils';
/*** constants ***/
export const extensions = [
@@ -512,4 +513,24 @@ export async function retry(
}
}
// Helper function to delete a Gitea release asset
// This is a workaround since Gitea's API is incompatible with the GitHub API
export function deleteGiteaReleaseAsset(
github: InstanceType<typeof GitHub>,
owner: string,
repo: string,
releaseId: number,
assetId: number,
) {
return github.request(
'DELETE /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}',
{
owner,
repo,
release_id: releaseId,
asset_id: assetId,
},
);
}
// TODO: Properly resolve the eslint issues in this file.