diff --git a/dist/main.cjs b/dist/main.cjs index a6cdabe..d779058 100644 --- a/dist/main.cjs +++ b/dist/main.cjs @@ -23157,76 +23157,40 @@ async function main(appId, privateKey, enterprise, owner, repositories, permissi if (enterprise && (owner || repositories.length > 0)) { throw new Error("Cannot use 'enterprise' input with 'owner' or 'repositories' inputs"); } - let parsedOwner = ""; - let parsedRepositoryNames = []; - if (!enterprise) { - if (!owner && repositories.length === 0) { - const [owner2, repo] = String(process.env.GITHUB_REPOSITORY).split("/"); - parsedOwner = owner2; - parsedRepositoryNames = [repo]; - core.info( - `Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${owner2}/${repo}).` - ); - } - if (owner && repositories.length === 0) { - parsedOwner = owner; - core.info( - `Input 'repositories' is not set. Creating token for all repositories owned by ${owner}.` - ); - } - if (!owner && repositories.length > 0) { - parsedOwner = String(process.env.GITHUB_REPOSITORY_OWNER); - parsedRepositoryNames = repositories; - core.info( - `No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories.map((repo) => ` -- ${parsedOwner}/${repo}`).join("")}` - ); - } - if (owner && repositories.length > 0) { - parsedOwner = owner; - parsedRepositoryNames = repositories; - core.info( - `Inputs 'owner' and 'repositories' are set. Creating token for the following repositories: - ${repositories.map((repo) => ` -- ${parsedOwner}/${repo}`).join("")}` - ); - } - } else { - core.info(`Creating enterprise installation token for enterprise "${enterprise}".`); - } + const target = resolveInstallationTarget(enterprise, owner, repositories, core); const auth5 = createAppAuth2({ appId, privateKey, request: request2 }); let authentication, installationId, appSlug; - if (enterprise) { + if (target.type === "enterprise") { ({ authentication, installationId, appSlug } = await pRetry( - () => getTokenFromEnterprise(request2, auth5, enterprise, permissions), + () => getTokenFromEnterprise(request2, auth5, target.enterprise, permissions), { shouldRetry: ({ error: error2 }) => error2.status >= 500, onFailedAttempt: (context) => { core.info( - `Failed to create token for enterprise "${enterprise}" (attempt ${context.attemptNumber}): ${context.error.message}` + `Failed to create token for enterprise "${target.enterprise}" (attempt ${context.attemptNumber}): ${context.error.message}` ); }, retries: 3 } )); - } else if (parsedRepositoryNames.length > 0) { + } else if (target.type === "repository") { ({ authentication, installationId, appSlug } = await pRetry( () => getTokenFromRepository( request2, auth5, - parsedOwner, - parsedRepositoryNames, + target.owner, + target.repositories, permissions ), { shouldRetry: ({ error: error2 }) => error2.status >= 500, onFailedAttempt: (context) => { core.info( - `Failed to create token for "${parsedRepositoryNames.join( + `Failed to create token for "${target.repositories.join( "," )}" (attempt ${context.attemptNumber}): ${context.error.message}` ); @@ -23236,11 +23200,11 @@ async function main(appId, privateKey, enterprise, owner, repositories, permissi )); } else { ({ authentication, installationId, appSlug } = await pRetry( - () => getTokenFromOwner(request2, auth5, parsedOwner, permissions), + () => getTokenFromOwner(request2, auth5, target.owner, permissions), { onFailedAttempt: (context) => { core.info( - `Failed to create token for "${parsedOwner}" (attempt ${context.attemptNumber}): ${context.error.message}` + `Failed to create token for "${target.owner}" (attempt ${context.attemptNumber}): ${context.error.message}` ); }, retries: 3 @@ -23256,6 +23220,47 @@ async function main(appId, privateKey, enterprise, owner, repositories, permissi core.saveState("expiresAt", authentication.expiresAt); } } +function resolveInstallationTarget(enterprise, owner, repositories, core) { + if (enterprise) { + core.info(`Creating enterprise installation token for enterprise "${enterprise}".`); + return { type: "enterprise", enterprise }; + } + if (!owner && repositories.length === 0) { + const [defaultOwner, repo] = String(process.env.GITHUB_REPOSITORY).split("/"); + core.info( + `Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${defaultOwner}/${repo}).` + ); + return { + type: "repository", + owner: defaultOwner, + repositories: [repo] + }; + } + if (owner && repositories.length === 0) { + core.info( + `Input 'repositories' is not set. Creating token for all repositories owned by ${owner}.` + ); + return { type: "owner", owner }; + } + const parsedOwner = owner || String(process.env.GITHUB_REPOSITORY_OWNER); + if (!owner) { + core.info( + `No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories.map((repo) => ` +- ${parsedOwner}/${repo}`).join("")}` + ); + } else { + core.info( + `Inputs 'owner' and 'repositories' are set. Creating token for the following repositories: + ${repositories.map((repo) => ` +- ${parsedOwner}/${repo}`).join("")}` + ); + } + return { + type: "repository", + owner: parsedOwner, + repositories + }; +} async function getTokenFromOwner(request2, auth5, parsedOwner, permissions) { const response = await request2("GET /users/{username}/installation", { username: parsedOwner, diff --git a/lib/main.js b/lib/main.js index 582adf9..f0d8db0 100644 --- a/lib/main.js +++ b/lib/main.js @@ -30,56 +30,7 @@ export async function main( throw new Error("Cannot use 'enterprise' input with 'owner' or 'repositories' inputs"); } - let parsedOwner = ""; - let parsedRepositoryNames = []; - - // Skip owner/repository parsing if enterprise is set - if (!enterprise) { - // If neither owner nor repositories are set, default to current repository - if (!owner && repositories.length === 0) { - const [owner, repo] = String(process.env.GITHUB_REPOSITORY).split("/"); - parsedOwner = owner; - parsedRepositoryNames = [repo]; - - core.info( - `Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${owner}/${repo}).` - ); - } - - // If only an owner is set, default to all repositories from that owner - if (owner && repositories.length === 0) { - parsedOwner = owner; - - core.info( - `Input 'repositories' is not set. Creating token for all repositories owned by ${owner}.` - ); - } - - // If repositories are set, but no owner, default to `GITHUB_REPOSITORY_OWNER` - if (!owner && repositories.length > 0) { - parsedOwner = String(process.env.GITHUB_REPOSITORY_OWNER); - parsedRepositoryNames = repositories; - - core.info( - `No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories - .map((repo) => `\n- ${parsedOwner}/${repo}`) - .join("")}` - ); - } - - // If both owner and repositories are set, use those values - if (owner && repositories.length > 0) { - parsedOwner = owner; - parsedRepositoryNames = repositories; - - core.info( - `Inputs 'owner' and 'repositories' are set. Creating token for the following repositories: - ${repositories.map((repo) => `\n- ${parsedOwner}/${repo}`).join("")}` - ); - } - } else { - core.info(`Creating enterprise installation token for enterprise "${enterprise}".`); - } + const target = resolveInstallationTarget(enterprise, owner, repositories, core); const auth = createAppAuth({ appId, @@ -88,36 +39,35 @@ export async function main( }); let authentication, installationId, appSlug; - - // If enterprise is set, get installation ID from the enterprise - if (enterprise) { + + if (target.type === "enterprise") { ({ authentication, installationId, appSlug } = await pRetry( - () => getTokenFromEnterprise(request, auth, enterprise, permissions), + () => getTokenFromEnterprise(request, auth, target.enterprise, permissions), { shouldRetry: ({ error }) => error.status >= 500, onFailedAttempt: (context) => { core.info( - `Failed to create token for enterprise "${enterprise}" (attempt ${context.attemptNumber}): ${context.error.message}` + `Failed to create token for enterprise "${target.enterprise}" (attempt ${context.attemptNumber}): ${context.error.message}` ); }, retries: 3, } )); - } else if (parsedRepositoryNames.length > 0) { + } else if (target.type === "repository") { ({ authentication, installationId, appSlug } = await pRetry( () => getTokenFromRepository( request, auth, - parsedOwner, - parsedRepositoryNames, + target.owner, + target.repositories, permissions ), { shouldRetry: ({ error }) => error.status >= 500, onFailedAttempt: (context) => { core.info( - `Failed to create token for "${parsedRepositoryNames.join( + `Failed to create token for "${target.repositories.join( "," )}" (attempt ${context.attemptNumber}): ${context.error.message}` ); @@ -128,11 +78,11 @@ export async function main( } else { // Otherwise get the installation for the owner, which can either be an organization or a user account ({ authentication, installationId, appSlug } = await pRetry( - () => getTokenFromOwner(request, auth, parsedOwner, permissions), + () => getTokenFromOwner(request, auth, target.owner, permissions), { onFailedAttempt: (context) => { core.info( - `Failed to create token for "${parsedOwner}" (attempt ${context.attemptNumber}): ${context.error.message}` + `Failed to create token for "${target.owner}" (attempt ${context.attemptNumber}): ${context.error.message}` ); }, retries: 3, @@ -154,6 +104,56 @@ export async function main( } } +function resolveInstallationTarget(enterprise, owner, repositories, core) { + if (enterprise) { + core.info(`Creating enterprise installation token for enterprise "${enterprise}".`); + return { type: "enterprise", enterprise }; + } + + if (!owner && repositories.length === 0) { + const [defaultOwner, repo] = String(process.env.GITHUB_REPOSITORY).split("/"); + + core.info( + `Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${defaultOwner}/${repo}).` + ); + + return { + type: "repository", + owner: defaultOwner, + repositories: [repo], + }; + } + + if (owner && repositories.length === 0) { + core.info( + `Input 'repositories' is not set. Creating token for all repositories owned by ${owner}.` + ); + + return { type: "owner", owner }; + } + + const parsedOwner = owner || String(process.env.GITHUB_REPOSITORY_OWNER); + + if (!owner) { + core.info( + `No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories + .map((repo) => `\n- ${parsedOwner}/${repo}`) + .join("")}` + ); + } else { + core.info( + `Inputs 'owner' and 'repositories' are set. Creating token for the following repositories: + ${repositories.map((repo) => `\n- ${parsedOwner}/${repo}`).join("")}` + ); + } + + return { + type: "repository", + owner: parsedOwner, + repositories, + }; +} + async function getTokenFromOwner(request, auth, parsedOwner, permissions) { // https://docs.github.com/rest/apps/apps?apiVersion=2022-11-28#get-a-user-installation-for-the-authenticated-app // This endpoint works for both users and organizations @@ -164,7 +164,7 @@ async function getTokenFromOwner(request, auth, parsedOwner, permissions) { }, }); - // Get token for for all repositories of the given installation + // Get token for all repositories of the given installation const authentication = await auth({ type: "installation", installationId: response.data.id,