feat(release): publish gitea release notes and enable production rollback
This commit is contained in:
80
.gitea/scripts/publish-gitea-release.mjs
Normal file
80
.gitea/scripts/publish-gitea-release.mjs
Normal file
@@ -0,0 +1,80 @@
|
||||
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}`)
|
||||
}
|
||||
Reference in New Issue
Block a user