81 lines
2.2 KiB
JavaScript
81 lines
2.2 KiB
JavaScript
import { readFileSync } from "node:fs"
|
|
|
|
const tag = process.env.RELEASE_TAG?.trim()
|
|
const releaseName = process.env.RELEASE_NAME?.trim() || tag
|
|
const bodyFile = process.env.RELEASE_BODY_FILE?.trim() || ".gitea-release-notes.md"
|
|
const serverUrl = process.env.GITHUB_SERVER_URL?.trim()
|
|
const repository = process.env.GITHUB_REPOSITORY?.trim()
|
|
const token = process.env.GITEA_RELEASE_TOKEN?.trim()
|
|
|
|
if (!tag) {
|
|
throw new Error("RELEASE_TAG is required")
|
|
}
|
|
|
|
if (!serverUrl || !repository) {
|
|
throw new Error("GITHUB_SERVER_URL and GITHUB_REPOSITORY are required")
|
|
}
|
|
|
|
if (!token) {
|
|
throw new Error("GITEA_RELEASE_TOKEN is required")
|
|
}
|
|
|
|
const body = readFileSync(bodyFile, "utf8")
|
|
const baseApi = `${serverUrl.replace(/\/$/, "")}/api/v1/repos/${repository}`
|
|
|
|
async function request(path, options = {}) {
|
|
const response = await fetch(`${baseApi}${path}`, {
|
|
...options,
|
|
headers: {
|
|
"content-type": "application/json",
|
|
authorization: `token ${token}`,
|
|
...(options.headers ?? {}),
|
|
},
|
|
})
|
|
|
|
return response
|
|
}
|
|
|
|
const payload = {
|
|
tag_name: tag,
|
|
target_commitish: "main",
|
|
name: releaseName,
|
|
body,
|
|
draft: false,
|
|
prerelease: false,
|
|
}
|
|
|
|
const existingResponse = await request(`/releases/tags/${encodeURIComponent(tag)}`)
|
|
|
|
if (existingResponse.ok) {
|
|
const existing = await existingResponse.json()
|
|
const updateResponse = await request(`/releases/${existing.id}`, {
|
|
method: "PATCH",
|
|
body: JSON.stringify({
|
|
...payload,
|
|
target_commitish: existing.target_commitish ?? payload.target_commitish,
|
|
}),
|
|
})
|
|
|
|
if (!updateResponse.ok) {
|
|
const message = await updateResponse.text()
|
|
throw new Error(`Failed to update release: ${updateResponse.status} ${message}`)
|
|
}
|
|
|
|
console.log(`Updated release for tag ${tag}`)
|
|
} else if (existingResponse.status === 404) {
|
|
const createResponse = await request("/releases", {
|
|
method: "POST",
|
|
body: JSON.stringify(payload),
|
|
})
|
|
|
|
if (!createResponse.ok) {
|
|
const message = await createResponse.text()
|
|
throw new Error(`Failed to create release: ${createResponse.status} ${message}`)
|
|
}
|
|
|
|
console.log(`Created release for tag ${tag}`)
|
|
} else {
|
|
const message = await existingResponse.text()
|
|
throw new Error(`Failed to query existing release: ${existingResponse.status} ${message}`)
|
|
}
|