fix(ci): verify public release target
This commit is contained in:
@@ -579,15 +579,6 @@ async function validatePullRequest() {
|
|||||||
console.log("Scheduled merge after required checks succeed.");
|
console.log("Scheduled merge after required checks succeed.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
async function releaseCommit(client, repository, tag) {
|
|
||||||
const refs = await client.api(`/repos/${repositoryPath(repository)}/git/refs/tags/${encodeURIComponent(tag)}`);
|
|
||||||
let object = (Array.isArray(refs) ? refs.find((ref) => ref.ref === `refs/tags/${tag}`) : refs)?.object;
|
|
||||||
for (let depth = 0; object?.type === "tag" && depth < 5; depth++) {
|
|
||||||
object = (await client.api(`/repos/${repositoryPath(repository)}/git/tags/${object.sha}`)).object;
|
|
||||||
}
|
|
||||||
if (object?.type !== "commit") throw new Error("Release tag does not resolve to a commit");
|
|
||||||
return object.sha;
|
|
||||||
}
|
|
||||||
async function verifyPublishedRelease(client, repository, tag, registry) {
|
async function verifyPublishedRelease(client, repository, tag, registry) {
|
||||||
const release = await client.api(`/repos/${repositoryPath(repository)}/releases/tags/${encodeURIComponent(tag)}`);
|
const release = await client.api(`/repos/${repositoryPath(repository)}/releases/tags/${encodeURIComponent(tag)}`);
|
||||||
if (release.draft) throw new Error("Draft releases cannot enter the catalog");
|
if (release.draft) throw new Error("Draft releases cannot enter the catalog");
|
||||||
@@ -595,7 +586,7 @@ async function verifyPublishedRelease(client, repository, tag, registry) {
|
|||||||
if (!descriptorAsset) throw new Error("Release has no trove-release.json attachment");
|
if (!descriptorAsset) throw new Error("Release has no trove-release.json attachment");
|
||||||
const descriptor = validateDescriptor(await client.json(descriptorAsset.browser_download_url), registry);
|
const descriptor = validateDescriptor(await client.json(descriptorAsset.browser_download_url), registry);
|
||||||
if (descriptor.repository !== repository || descriptor.tag !== tag) throw new Error("Release identity differs from its descriptor");
|
if (descriptor.repository !== repository || descriptor.tag !== tag) throw new Error("Release identity differs from its descriptor");
|
||||||
if (descriptor.commit !== await releaseCommit(client, repository, tag)) throw new Error("Release tag differs from the descriptor commit");
|
if (descriptor.commit !== release.target_commitish) throw new Error("Release target differs from the descriptor commit");
|
||||||
const assets = /* @__PURE__ */ new Map();
|
const assets = /* @__PURE__ */ new Map();
|
||||||
for (const plugin of descriptor.plugins) {
|
for (const plugin of descriptor.plugins) {
|
||||||
for (const artifact of plugin.artifacts) {
|
for (const artifact of plugin.artifacts) {
|
||||||
@@ -616,7 +607,7 @@ async function proposeRelease() {
|
|||||||
if (!tag) throw new Error("Release tag is required");
|
if (!tag) throw new Error("Release tag is required");
|
||||||
if (repository.split("/")[0] !== trustedOwner) throw new Error(`${repository} is not an official Curio repository`);
|
if (repository.split("/")[0] !== trustedOwner) throw new Error(`${repository} is not an official Curio repository`);
|
||||||
if (!process.env.CATALOG_TOKEN) throw new Error("Catalog write token is missing");
|
if (!process.env.CATALOG_TOKEN) throw new Error("Catalog write token is missing");
|
||||||
const sourceClient = new Gitea({ token: process.env.GITHUB_TOKEN });
|
const sourceClient = new Gitea({ token: "" });
|
||||||
const catalogClient = new Gitea({ token: process.env.CATALOG_TOKEN });
|
const catalogClient = new Gitea({ token: process.env.CATALOG_TOKEN });
|
||||||
if (sourceClient.server !== catalogClient.server) throw new Error("Release and catalog must use the same Gitea server");
|
if (sourceClient.server !== catalogClient.server) throw new Error("Release and catalog must use the same Gitea server");
|
||||||
const published = await verifyPublishedRelease(sourceClient, repository, tag, catalogRepository);
|
const published = await verifyPublishedRelease(sourceClient, repository, tag, catalogRepository);
|
||||||
|
|||||||
Reference in New Issue
Block a user