Compare commits

..
Author SHA1 Message Date
Parker Brown 0fde60e111 Simplify proxy environment setup in request.js
Removed undici proxy agent configuration and related error handling. Now only sets NODE_USE_ENV_PROXY to encourage Node to honor standard proxy environment variables.
2025-08-22 13:50:04 -07:00
Parker Brown 3ffe05f85c Support lowercase proxy environment variables
Adds detection for lowercase proxy environment variables (https_proxy, http_proxy) in addition to their uppercase counterparts when configuring the global dispatcher.
2025-08-22 13:46:06 -07:00
Parker Brown f57ea8787c Move proxy setup to request.js and update entrypoint
Proxy environment setup previously in bootstrap.js is now handled in lib/request.js for better encapsulation. The action entrypoint is updated from dist/bootstrap.cjs to dist/main.cjs, and bootstrap.js is removed. Build script is updated to exclude bootstrap.js.
2025-08-22 13:43:20 -07:00
Parker Brown 00ba6edc66 Switch build output to CommonJS (.cjs) format
Updated build script to output .cjs files instead of .js, and updated action.yml to reference the new .cjs files. Also clarified proxy environment variable handling in bootstrap.js for consistency.
2025-08-22 13:22:02 -07:00
Parker Brown 21c1159e4d Switch build output to ESM format and update entrypoints
Changed the build script to output ES modules instead of CommonJS. Updated action.yml to reference .js files instead of .cjs, and clarified proxy support logic in bootstrap.js.
2025-08-22 13:16:17 -07:00
Parker Brown 6423fe3683 Add bootstrap entry for env-based proxy support
Introduces bootstrap.js to set NODE_USE_ENV_PROXY before loading main.js, ensuring proxy support is enabled unless explicitly opted out. Updates action.yml to use bootstrap as the main entry and modifies build script to bundle bootstrap.js.
2025-08-22 13:10:57 -07:00
Parker Brown 39808af6a2 Move NODE_USE_ENV_PROXY assignment to top of file
Relocated the setting of process.env.NODE_USE_ENV_PROXY to the beginning of main.js for improved clarity and to ensure the environment variable is set before any imports or logic are executed.
2025-08-22 13:05:03 -07:00
Parker Brown fe4ba3360a Set NODE_USE_ENV_PROXY in main.js and update workflow
Moved NODE_USE_ENV_PROXY environment variable assignment from the GitHub Actions workflow to main.js for consistent runtime configuration. This change ensures the variable is always set when the application runs, regardless of workflow environment settings.
2025-08-22 12:31:42 -07:00
Parker Brown 926b8abad2 Set NODE_USE_ENV_PROXY in test workflow
Adds NODE_USE_ENV_PROXY=1 to the test job environment in GitHub Actions to enable proxy usage via environment variable.
2025-08-22 12:29:23 -07:00
Parker Brown d988c9aaad ci(test): set https_proxy env for test workflow
Adds the https_proxy environment variable to the test job in the GitHub Actions workflow to route requests through the specified proxy.
2025-08-22 12:24:32 -07:00
14 changed files with 118 additions and 294 deletions
+3 -27
View File
@@ -4,7 +4,6 @@ on:
push: push:
branches: branches:
- main - main
- beta
pull_request: pull_request:
workflow_dispatch: workflow_dispatch:
@@ -34,7 +33,7 @@ jobs:
name: End-to-End name: End-to-End
runs-on: ubuntu-latest runs-on: ubuntu-latest
# do not run from forks, as forks dont have access to repository secrets # do not run from forks, as forks dont have access to repository secrets
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login if: github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login
steps: steps:
- uses: actions/checkout@v5 - uses: actions/checkout@v5
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
@@ -45,6 +44,8 @@ jobs:
- run: npm run build - run: npm run build
- uses: ./ # Uses the action in the root directory - uses: ./ # Uses the action in the root directory
id: test id: test
env:
https_proxy: https://example.com
with: with:
app-id: ${{ vars.TEST_APP_ID }} app-id: ${{ vars.TEST_APP_ID }}
private-key: ${{ secrets.TEST_APP_PRIVATE_KEY }} private-key: ${{ secrets.TEST_APP_PRIVATE_KEY }}
@@ -55,28 +56,3 @@ jobs:
with: with:
route: GET /installation/repositories route: GET /installation/repositories
- run: echo '${{ steps.get-repository.outputs.data }}' - run: echo '${{ steps.get-repository.outputs.data }}'
end-to-end-proxy:
name: End-to-End with unreachable proxy
runs-on: ubuntu-latest
# do not run from forks, as forks dont have access to repository secrets
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.owner.login == github.event.pull_request.base.repo.owner.login
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version-file: package.json
cache: 'npm'
- run: npm ci
- run: npm run build
- uses: ./ # Uses the action in the root directory
continue-on-error: true
id: test
env:
NODE_USE_ENV_PROXY: "1"
https_proxy: http://127.0.0.1:9
with:
app-id: ${{ vars.TEST_APP_ID }}
private-key: ${{ secrets.TEST_APP_PRIVATE_KEY }}
- name: Assert action failed through unreachable proxy
run: test "${{ steps.test.outcome }}" = "failure"
-18
View File
@@ -296,24 +296,6 @@ jobs:
GITHUB_TOKEN: ${{ steps.create_token.outputs.token }} GITHUB_TOKEN: ${{ steps.create_token.outputs.token }}
``` ```
### Proxy support
This action relies on Node.js native proxy support.
If you set `HTTP_PROXY` or `HTTPS_PROXY`, also set `NODE_USE_ENV_PROXY: "1"` on the action step so Node.js honors those variables. If you need proxy bypass rules, set `NO_PROXY` alongside them.
```yaml
- uses: actions/create-github-app-token@v3
id: app-token
env:
HTTPS_PROXY: http://proxy.example.com:8080
NO_PROXY: github.example.com
NODE_USE_ENV_PROXY: "1"
with:
app-id: ${{ vars.APP_ID }}
private-key: ${{ secrets.PRIVATE_KEY }}
```
## Inputs ## Inputs
### `app-id` ### `app-id`
+70 -94
View File
@@ -21294,11 +21294,11 @@ function createOAuthAppAuth(options) {
} }
// node_modules/universal-github-app-jwt/lib/utils.js // node_modules/universal-github-app-jwt/lib/utils.js
function isPkcs1(privateKey) { function isPkcs1(privateKey2) {
return privateKey.includes("-----BEGIN RSA PRIVATE KEY-----"); return privateKey2.includes("-----BEGIN RSA PRIVATE KEY-----");
} }
function isOpenSsh(privateKey) { function isOpenSsh(privateKey2) {
return privateKey.includes("-----BEGIN OPENSSH PRIVATE KEY-----"); return privateKey2.includes("-----BEGIN OPENSSH PRIVATE KEY-----");
} }
function string2ArrayBuffer(str) { function string2ArrayBuffer(str) {
const buf = new ArrayBuffer(str.length); const buf = new ArrayBuffer(str.length);
@@ -21335,17 +21335,17 @@ function base64encodeJSON(obj) {
// node_modules/universal-github-app-jwt/lib/crypto-node.js // node_modules/universal-github-app-jwt/lib/crypto-node.js
var import_node_crypto = require("node:crypto"); var import_node_crypto = require("node:crypto");
var import_node_crypto2 = require("node:crypto"); var import_node_crypto2 = require("node:crypto");
function convertPrivateKey(privateKey) { function convertPrivateKey(privateKey2) {
if (!isPkcs1(privateKey)) return privateKey; if (!isPkcs1(privateKey2)) return privateKey2;
return (0, import_node_crypto2.createPrivateKey)(privateKey).export({ return (0, import_node_crypto2.createPrivateKey)(privateKey2).export({
type: "pkcs8", type: "pkcs8",
format: "pem" format: "pem"
}); });
} }
// node_modules/universal-github-app-jwt/lib/get-token.js // node_modules/universal-github-app-jwt/lib/get-token.js
async function getToken({ privateKey, payload }) { async function getToken({ privateKey: privateKey2, payload }) {
const convertedPrivateKey = convertPrivateKey(privateKey); const convertedPrivateKey = convertPrivateKey(privateKey2);
if (isPkcs1(convertedPrivateKey)) { if (isPkcs1(convertedPrivateKey)) {
throw new Error( throw new Error(
"[universal-github-app-jwt] Private Key is in PKCS#1 format, but only PKCS#8 is supported. See https://github.com/gr2m/universal-github-app-jwt#private-key-formats" "[universal-github-app-jwt] Private Key is in PKCS#1 format, but only PKCS#8 is supported. See https://github.com/gr2m/universal-github-app-jwt#private-key-formats"
@@ -21383,10 +21383,10 @@ async function getToken({ privateKey, payload }) {
// node_modules/universal-github-app-jwt/index.js // node_modules/universal-github-app-jwt/index.js
async function githubAppJwt({ async function githubAppJwt({
id, id,
privateKey, privateKey: privateKey2,
now = Math.floor(Date.now() / 1e3) now = Math.floor(Date.now() / 1e3)
}) { }) {
const privateKeyWithNewlines = privateKey.replace(/\\n/g, "\n"); const privateKeyWithNewlines = privateKey2.replace(/\\n/g, "\n");
const nowWithSafetyMargin = now - 30; const nowWithSafetyMargin = now - 30;
const expiration = nowWithSafetyMargin + 60 * 10; const expiration = nowWithSafetyMargin + 60 * 10;
const payload = { const payload = {
@@ -21544,14 +21544,14 @@ var LruObject = class {
// node_modules/@octokit/auth-app/dist-node/index.js // node_modules/@octokit/auth-app/dist-node/index.js
async function getAppAuthentication({ async function getAppAuthentication({
appId, appId: appId2,
privateKey, privateKey: privateKey2,
timeDifference timeDifference
}) { }) {
try { try {
const authOptions = { const authOptions = {
id: appId, id: appId2,
privateKey privateKey: privateKey2
}; };
if (timeDifference) { if (timeDifference) {
Object.assign(authOptions, { Object.assign(authOptions, {
@@ -21566,7 +21566,7 @@ async function getAppAuthentication({
expiresAt: new Date(appAuthentication.expiration * 1e3).toISOString() expiresAt: new Date(appAuthentication.expiration * 1e3).toISOString()
}; };
} catch (error) { } catch (error) {
if (privateKey === "-----BEGIN RSA PRIVATE KEY-----") { if (privateKey2 === "-----BEGIN RSA PRIVATE KEY-----") {
throw new Error( throw new Error(
"The 'privateKey` option contains only the first line '-----BEGIN RSA PRIVATE KEY-----'. If you are setting it using a `.env` file, make sure it is set on a single line with newlines replaced by '\n'" "The 'privateKey` option contains only the first line '-----BEGIN RSA PRIVATE KEY-----'. If you are setting it using a `.env` file, make sure it is set on a single line with newlines replaced by '\n'"
); );
@@ -21597,19 +21597,19 @@ async function get(cache, options) {
permissionsString, permissionsString,
singleFileName singleFileName
] = result.split("|"); ] = result.split("|");
const permissions = options.permissions || permissionsString.split(/,/).reduce((permissions2, string) => { const permissions2 = options.permissions || permissionsString.split(/,/).reduce((permissions22, string) => {
if (/!$/.test(string)) { if (/!$/.test(string)) {
permissions2[string.slice(0, -1)] = "write"; permissions22[string.slice(0, -1)] = "write";
} else { } else {
permissions2[string] = "read"; permissions22[string] = "read";
} }
return permissions2; return permissions22;
}, {}); }, {});
return { return {
token, token,
createdAt, createdAt,
expiresAt, expiresAt,
permissions, permissions: permissions2,
repositoryIds: options.repositoryIds, repositoryIds: options.repositoryIds,
repositoryNames: options.repositoryNames, repositoryNames: options.repositoryNames,
singleFileName, singleFileName,
@@ -21633,11 +21633,11 @@ async function set(cache, options, data) {
} }
function optionsToCacheKey({ function optionsToCacheKey({
installationId, installationId,
permissions = {}, permissions: permissions2 = {},
repositoryIds = [], repositoryIds = [],
repositoryNames = [] repositoryNames = []
}) { }) {
const permissionsString = Object.keys(permissions).sort().map((name) => permissions[name] === "read" ? name : `${name}!`).join(","); const permissionsString = Object.keys(permissions2).sort().map((name) => permissions2[name] === "read" ? name : `${name}!`).join(",");
const repositoryIdsString = repositoryIds.sort().join(","); const repositoryIdsString = repositoryIds.sort().join(",");
const repositoryNamesString = repositoryNames.join(","); const repositoryNamesString = repositoryNames.join(",");
return [ return [
@@ -21653,7 +21653,7 @@ function toTokenAuthentication({
createdAt, createdAt,
expiresAt, expiresAt,
repositorySelection, repositorySelection,
permissions, permissions: permissions2,
repositoryIds, repositoryIds,
repositoryNames, repositoryNames,
singleFileName singleFileName
@@ -21664,7 +21664,7 @@ function toTokenAuthentication({
tokenType: "installation", tokenType: "installation",
token, token,
installationId, installationId,
permissions, permissions: permissions2,
createdAt, createdAt,
expiresAt, expiresAt,
repositorySelection repositorySelection
@@ -21717,7 +21717,7 @@ async function getInstallationAuthenticationImpl(state, options, request2) {
token: token2, token: token2,
createdAt: createdAt2, createdAt: createdAt2,
expiresAt: expiresAt2, expiresAt: expiresAt2,
permissions: permissions2, permissions: permissions22,
repositoryIds: repositoryIds2, repositoryIds: repositoryIds2,
repositoryNames: repositoryNames2, repositoryNames: repositoryNames2,
singleFileName: singleFileName2, singleFileName: singleFileName2,
@@ -21728,7 +21728,7 @@ async function getInstallationAuthenticationImpl(state, options, request2) {
token: token2, token: token2,
createdAt: createdAt2, createdAt: createdAt2,
expiresAt: expiresAt2, expiresAt: expiresAt2,
permissions: permissions2, permissions: permissions22,
repositorySelection: repositorySelection2, repositorySelection: repositorySelection2,
repositoryIds: repositoryIds2, repositoryIds: repositoryIds2,
repositoryNames: repositoryNames2, repositoryNames: repositoryNames2,
@@ -21761,7 +21761,7 @@ async function getInstallationAuthenticationImpl(state, options, request2) {
data: { data: {
token, token,
expires_at: expiresAt, expires_at: expiresAt,
repositories, repositories: repositories2,
permissions: permissionsOptional, permissions: permissionsOptional,
repository_selection: repositorySelectionOptional, repository_selection: repositorySelectionOptional,
single_file: singleFileName single_file: singleFileName
@@ -21770,17 +21770,17 @@ async function getInstallationAuthenticationImpl(state, options, request2) {
"POST /app/installations/{installation_id}/access_tokens", "POST /app/installations/{installation_id}/access_tokens",
payload payload
); );
const permissions = permissionsOptional || {}; const permissions2 = permissionsOptional || {};
const repositorySelection = repositorySelectionOptional || "all"; const repositorySelection = repositorySelectionOptional || "all";
const repositoryIds = repositories ? repositories.map((r) => r.id) : void 0; const repositoryIds = repositories2 ? repositories2.map((r) => r.id) : void 0;
const repositoryNames = repositories ? repositories.map((repo) => repo.name) : void 0; const repositoryNames = repositories2 ? repositories2.map((repo) => repo.name) : void 0;
const createdAt = (/* @__PURE__ */ new Date()).toISOString(); const createdAt = (/* @__PURE__ */ new Date()).toISOString();
const cacheOptions = { const cacheOptions = {
token, token,
createdAt, createdAt,
expiresAt, expiresAt,
repositorySelection, repositorySelection,
permissions, permissions: permissions2,
repositoryIds, repositoryIds,
repositoryNames repositoryNames
}; };
@@ -21794,7 +21794,7 @@ async function getInstallationAuthenticationImpl(state, options, request2) {
createdAt, createdAt,
expiresAt, expiresAt,
repositorySelection, repositorySelection,
permissions, permissions: permissions2,
repositoryIds, repositoryIds,
repositoryNames repositoryNames
}; };
@@ -21986,16 +21986,16 @@ function createAppAuth(options) {
// lib/get-permissions-from-inputs.js // lib/get-permissions-from-inputs.js
function getPermissionsFromInputs(env) { function getPermissionsFromInputs(env) {
return Object.entries(env).reduce((permissions, [key, value]) => { return Object.entries(env).reduce((permissions2, [key, value]) => {
if (!key.startsWith("INPUT_PERMISSION-")) return permissions; if (!key.startsWith("INPUT_PERMISSION-")) return permissions2;
if (!value) return permissions; if (!value) return permissions2;
const permission = key.slice("INPUT_PERMISSION-".length).toLowerCase().replaceAll(/-/g, "_"); const permission = key.slice("INPUT_PERMISSION-".length).toLowerCase().replaceAll(/-/g, "_");
if (permissions === void 0) { if (permissions2 === void 0) {
return { [permission]: value }; return { [permission]: value };
} }
return { return {
// @ts-expect-error - needs to be typed correctly // @ts-expect-error - needs to be typed correctly
...permissions, ...permissions2,
[permission]: value [permission]: value
}; };
}, void 0); }, void 0);
@@ -22112,43 +22112,43 @@ async function pRetry(input, options) {
} }
// lib/main.js // lib/main.js
async function main(appId, privateKey, owner, repositories, permissions, core3, createAppAuth2, request2, skipTokenRevoke) { async function main(appId2, privateKey2, owner2, repositories2, permissions2, core3, createAppAuth2, request2, skipTokenRevoke2) {
let parsedOwner = ""; let parsedOwner = "";
let parsedRepositoryNames = []; let parsedRepositoryNames = [];
if (!owner && repositories.length === 0) { if (!owner2 && repositories2.length === 0) {
const [owner2, repo] = String(process.env.GITHUB_REPOSITORY).split("/"); const [owner3, repo] = String(process.env.GITHUB_REPOSITORY).split("/");
parsedOwner = owner2; parsedOwner = owner3;
parsedRepositoryNames = [repo]; parsedRepositoryNames = [repo];
core3.info( core3.info(
`Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${owner2}/${repo}).` `Inputs 'owner' and 'repositories' are not set. Creating token for this repository (${owner3}/${repo}).`
); );
} }
if (owner && repositories.length === 0) { if (owner2 && repositories2.length === 0) {
parsedOwner = owner; parsedOwner = owner2;
core3.info( core3.info(
`Input 'repositories' is not set. Creating token for all repositories owned by ${owner}.` `Input 'repositories' is not set. Creating token for all repositories owned by ${owner2}.`
); );
} }
if (!owner && repositories.length > 0) { if (!owner2 && repositories2.length > 0) {
parsedOwner = String(process.env.GITHUB_REPOSITORY_OWNER); parsedOwner = String(process.env.GITHUB_REPOSITORY_OWNER);
parsedRepositoryNames = repositories; parsedRepositoryNames = repositories2;
core3.info( core3.info(
`No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories.map((repo) => ` `No 'owner' input provided. Using default owner '${parsedOwner}' to create token for the following repositories:${repositories2.map((repo) => `
- ${parsedOwner}/${repo}`).join("")}` - ${parsedOwner}/${repo}`).join("")}`
); );
} }
if (owner && repositories.length > 0) { if (owner2 && repositories2.length > 0) {
parsedOwner = owner; parsedOwner = owner2;
parsedRepositoryNames = repositories; parsedRepositoryNames = repositories2;
core3.info( core3.info(
`Inputs 'owner' and 'repositories' are set. Creating token for the following repositories: `Inputs 'owner' and 'repositories' are set. Creating token for the following repositories:
${repositories.map((repo) => ` ${repositories2.map((repo) => `
- ${parsedOwner}/${repo}`).join("")}` - ${parsedOwner}/${repo}`).join("")}`
); );
} }
const auth5 = createAppAuth2({ const auth5 = createAppAuth2({
appId, appId: appId2,
privateKey, privateKey: privateKey2,
request: request2 request: request2
}); });
let authentication, installationId, appSlug; let authentication, installationId, appSlug;
@@ -22159,7 +22159,7 @@ async function main(appId, privateKey, owner, repositories, permissions, core3,
auth5, auth5,
parsedOwner, parsedOwner,
parsedRepositoryNames, parsedRepositoryNames,
permissions permissions2
), ),
{ {
shouldRetry: (error) => error.status >= 500, shouldRetry: (error) => error.status >= 500,
@@ -22175,7 +22175,7 @@ async function main(appId, privateKey, owner, repositories, permissions, core3,
)); ));
} else { } else {
({ authentication, installationId, appSlug } = await pRetry( ({ authentication, installationId, appSlug } = await pRetry(
() => getTokenFromOwner(request2, auth5, parsedOwner, permissions), () => getTokenFromOwner(request2, auth5, parsedOwner, permissions2),
{ {
onFailedAttempt: (error) => { onFailedAttempt: (error) => {
core3.info( core3.info(
@@ -22190,12 +22190,12 @@ async function main(appId, privateKey, owner, repositories, permissions, core3,
core3.setOutput("token", authentication.token); core3.setOutput("token", authentication.token);
core3.setOutput("installation-id", installationId); core3.setOutput("installation-id", installationId);
core3.setOutput("app-slug", appSlug); core3.setOutput("app-slug", appSlug);
if (!skipTokenRevoke) { if (!skipTokenRevoke2) {
core3.saveState("token", authentication.token); core3.saveState("token", authentication.token);
core3.saveState("expiresAt", authentication.expiresAt); core3.saveState("expiresAt", authentication.expiresAt);
} }
} }
async function getTokenFromOwner(request2, auth5, parsedOwner, permissions) { async function getTokenFromOwner(request2, auth5, parsedOwner, permissions2) {
const response = await request2("GET /users/{username}/installation", { const response = await request2("GET /users/{username}/installation", {
username: parsedOwner, username: parsedOwner,
request: { request: {
@@ -22205,13 +22205,13 @@ async function getTokenFromOwner(request2, auth5, parsedOwner, permissions) {
const authentication = await auth5({ const authentication = await auth5({
type: "installation", type: "installation",
installationId: response.data.id, installationId: response.data.id,
permissions permissions: permissions2
}); });
const installationId = response.data.id; const installationId = response.data.id;
const appSlug = response.data["app_slug"]; const appSlug = response.data["app_slug"];
return { authentication, installationId, appSlug }; return { authentication, installationId, appSlug };
} }
async function getTokenFromRepository(request2, auth5, parsedOwner, parsedRepositoryNames, permissions) { async function getTokenFromRepository(request2, auth5, parsedOwner, parsedRepositoryNames, permissions2) {
const response = await request2("GET /repos/{owner}/{repo}/installation", { const response = await request2("GET /repos/{owner}/{repo}/installation", {
owner: parsedOwner, owner: parsedOwner,
repo: parsedRepositoryNames[0], repo: parsedRepositoryNames[0],
@@ -22223,7 +22223,7 @@ async function getTokenFromRepository(request2, auth5, parsedOwner, parsedReposi
type: "installation", type: "installation",
installationId: response.data.id, installationId: response.data.id,
repositoryNames: parsedRepositoryNames, repositoryNames: parsedRepositoryNames,
permissions permissions: permissions2
}); });
const installationId = response.data.id; const installationId = response.data.id;
const appSlug = response.data["app_slug"]; const appSlug = response.data["app_slug"];
@@ -22233,26 +22233,6 @@ async function getTokenFromRepository(request2, auth5, parsedOwner, parsedReposi
// lib/request.js // lib/request.js
var import_core = __toESM(require_core(), 1); var import_core = __toESM(require_core(), 1);
var baseUrl = import_core.default.getInput("github-api-url").replace(/\/$/, ""); var baseUrl = import_core.default.getInput("github-api-url").replace(/\/$/, "");
var proxyEnvironmentKeys = [
"https_proxy",
"HTTPS_PROXY",
"http_proxy",
"HTTP_PROXY"
];
function proxyEnvironmentConfigured() {
return proxyEnvironmentKeys.some((key) => process.env[key]);
}
function nativeProxySupportEnabled() {
return process.env.NODE_USE_ENV_PROXY === "1";
}
function ensureNativeProxySupport() {
if (!proxyEnvironmentConfigured() || nativeProxySupportEnabled()) {
return;
}
throw new Error(
"A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step."
);
}
var request_default = request.defaults({ var request_default = request.defaults({
headers: { "user-agent": "actions/create-github-app-token" }, headers: { "user-agent": "actions/create-github-app-token" },
baseUrl baseUrl
@@ -22265,15 +22245,13 @@ if (!process.env.GITHUB_REPOSITORY) {
if (!process.env.GITHUB_REPOSITORY_OWNER) { if (!process.env.GITHUB_REPOSITORY_OWNER) {
throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'"); throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'");
} }
async function run() { var appId = import_core2.default.getInput("app-id");
ensureNativeProxySupport(); var privateKey = import_core2.default.getInput("private-key");
const appId = import_core2.default.getInput("app-id"); var owner = import_core2.default.getInput("owner");
const privateKey = import_core2.default.getInput("private-key"); var repositories = import_core2.default.getInput("repositories").split(/[\n,]+/).map((s) => s.trim()).filter((x) => x !== "");
const owner = import_core2.default.getInput("owner"); var skipTokenRevoke = import_core2.default.getBooleanInput("skip-token-revoke");
const repositories = import_core2.default.getInput("repositories").split(/[\n,]+/).map((s) => s.trim()).filter((x) => x !== ""); var permissions = getPermissionsFromInputs(process.env);
const skipTokenRevoke = import_core2.default.getBooleanInput("skip-token-revoke"); var main_default = main(
const permissions = getPermissionsFromInputs(process.env);
return main(
appId, appId,
privateKey, privateKey,
owner, owner,
@@ -22283,9 +22261,7 @@ async function run() {
createAppAuth, createAppAuth,
request_default, request_default,
skipTokenRevoke skipTokenRevoke
); ).catch((error) => {
}
var main_default = run().catch((error) => {
console.error(error); console.error(error);
import_core2.default.setFailed(error.message); import_core2.default.setFailed(error.message);
}); });
+1 -25
View File
@@ -20485,37 +20485,13 @@ var request = withDefaults2(endpoint, defaults_default);
// lib/request.js // lib/request.js
var baseUrl = import_core.default.getInput("github-api-url").replace(/\/$/, ""); var baseUrl = import_core.default.getInput("github-api-url").replace(/\/$/, "");
var proxyEnvironmentKeys = [
"https_proxy",
"HTTPS_PROXY",
"http_proxy",
"HTTP_PROXY"
];
function proxyEnvironmentConfigured() {
return proxyEnvironmentKeys.some((key) => process.env[key]);
}
function nativeProxySupportEnabled() {
return process.env.NODE_USE_ENV_PROXY === "1";
}
function ensureNativeProxySupport() {
if (!proxyEnvironmentConfigured() || nativeProxySupportEnabled()) {
return;
}
throw new Error(
"A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step."
);
}
var request_default = request.defaults({ var request_default = request.defaults({
headers: { "user-agent": "actions/create-github-app-token" }, headers: { "user-agent": "actions/create-github-app-token" },
baseUrl baseUrl
}); });
// post.js // post.js
async function run() { post(import_core2.default, request_default).catch((error) => {
ensureNativeProxySupport();
return post(import_core2.default, request_default);
}
run().catch((error) => {
console.error(error); console.error(error);
import_core2.default.setFailed(error.message); import_core2.default.setFailed(error.message);
}); });
+7 -25
View File
@@ -1,34 +1,16 @@
import core from "@actions/core"; import core from "@actions/core";
import { request } from "@octokit/request"; import { request } from "@octokit/request";
/* c8 ignore start -- env knob setup */
// Encourage Node to honor standard *_PROXY vars for core HTTP(S) agents.
if (process.env.NODE_USE_ENV_PROXY == null) {
process.env.NODE_USE_ENV_PROXY = "1";
}
/* c8 ignore stop */
// Get the GitHub API URL from the action input and remove any trailing slash // Get the GitHub API URL from the action input and remove any trailing slash
const baseUrl = core.getInput("github-api-url").replace(/\/$/, ""); const baseUrl = core.getInput("github-api-url").replace(/\/$/, "");
const proxyEnvironmentKeys = [
"https_proxy",
"HTTPS_PROXY",
"http_proxy",
"HTTP_PROXY",
];
function proxyEnvironmentConfigured() {
return proxyEnvironmentKeys.some((key) => process.env[key]);
}
function nativeProxySupportEnabled() {
return process.env.NODE_USE_ENV_PROXY === "1";
}
export function ensureNativeProxySupport() {
if (!proxyEnvironmentConfigured() || nativeProxySupportEnabled()) {
return;
}
throw new Error(
"A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.",
);
}
// Configure the default settings for GitHub API requests // Configure the default settings for GitHub API requests
export default request.defaults({ export default request.defaults({
headers: { "user-agent": "actions/create-github-app-token" }, headers: { "user-agent": "actions/create-github-app-token" },
+11 -18
View File
@@ -1,11 +1,10 @@
// @ts-check // @ts-check
import core from "@actions/core"; import core from "@actions/core";
import { createAppAuth } from "@octokit/auth-app"; import { createAppAuth } from "@octokit/auth-app";
import { getPermissionsFromInputs } from "./lib/get-permissions-from-inputs.js"; import { getPermissionsFromInputs } from "./lib/get-permissions-from-inputs.js";
import { main } from "./lib/main.js"; import { main } from "./lib/main.js";
import request, { ensureNativeProxySupport } from "./lib/request.js"; import request from "./lib/request.js";
if (!process.env.GITHUB_REPOSITORY) { if (!process.env.GITHUB_REPOSITORY) {
throw new Error("GITHUB_REPOSITORY missing, must be set to '<owner>/<repo>'"); throw new Error("GITHUB_REPOSITORY missing, must be set to '<owner>/<repo>'");
@@ -15,23 +14,21 @@ if (!process.env.GITHUB_REPOSITORY_OWNER) {
throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'"); throw new Error("GITHUB_REPOSITORY_OWNER missing, must be set to '<owner>'");
} }
async function run() { const appId = core.getInput("app-id");
ensureNativeProxySupport(); const privateKey = core.getInput("private-key");
const owner = core.getInput("owner");
const appId = core.getInput("app-id"); const repositories = core
const privateKey = core.getInput("private-key");
const owner = core.getInput("owner");
const repositories = core
.getInput("repositories") .getInput("repositories")
.split(/[\n,]+/) .split(/[\n,]+/)
.map((s) => s.trim()) .map((s) => s.trim())
.filter((x) => x !== ""); .filter((x) => x !== "");
const skipTokenRevoke = core.getBooleanInput("skip-token-revoke"); const skipTokenRevoke = core.getBooleanInput("skip-token-revoke");
const permissions = getPermissionsFromInputs(process.env); const permissions = getPermissionsFromInputs(process.env);
return main( // Export promise for testing
export default main(
appId, appId,
privateKey, privateKey,
owner, owner,
@@ -40,12 +37,8 @@ async function run() {
core, core,
createAppAuth, createAppAuth,
request, request,
skipTokenRevoke, skipTokenRevoke
); ).catch((error) => {
}
// Export promise for testing
export default run().catch((error) => {
/* c8 ignore next 3 */ /* c8 ignore next 3 */
console.error(error); console.error(error);
core.setFailed(error.message); core.setFailed(error.message);
+2 -2
View File
@@ -1,12 +1,12 @@
{ {
"name": "create-github-app-token", "name": "create-github-app-token",
"version": "3.0.0-beta.3", "version": "3.0.0-beta.2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "create-github-app-token", "name": "create-github-app-token",
"version": "3.0.0-beta.3", "version": "3.0.0-beta.2",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@actions/core": "^1.11.1", "@actions/core": "^1.11.1",
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "create-github-app-token", "name": "create-github-app-token",
"private": true, "private": true,
"type": "module", "type": "module",
"version": "3.0.0-beta.3", "version": "3.0.0-beta.2",
"description": "GitHub Action for creating a GitHub App Installation Access Token", "description": "GitHub Action for creating a GitHub App Installation Access Token",
"engines": { "engines": {
"node": ">=24.4.0" "node": ">=24.4.0"
+2 -8
View File
@@ -3,15 +3,9 @@
import core from "@actions/core"; import core from "@actions/core";
import { post } from "./lib/post.js"; import { post } from "./lib/post.js";
import request, { ensureNativeProxySupport } from "./lib/request.js"; import request from "./lib/request.js";
async function run() { post(core, request).catch((error) => {
ensureNativeProxySupport();
return post(core, request);
}
run().catch((error) => {
/* c8 ignore next 3 */ /* c8 ignore next 3 */
console.error(error); console.error(error);
core.setFailed(error.message); core.setFailed(error.message);
-8
View File
@@ -21,14 +21,6 @@ for (const file of testFiles) {
const env = { const env = {
GITHUB_OUTPUT: undefined, GITHUB_OUTPUT: undefined,
GITHUB_STATE: undefined, GITHUB_STATE: undefined,
HTTP_PROXY: undefined,
HTTPS_PROXY: undefined,
http_proxy: undefined,
https_proxy: undefined,
NO_PROXY: undefined,
no_proxy: undefined,
NODE_OPTIONS: undefined,
NODE_USE_ENV_PROXY: undefined,
}; };
const { stderr, stdout } = await execa("node", [`tests/${file}`], { env }); const { stderr, stdout } = await execa("node", [`tests/${file}`], { env });
t.snapshot(stderr, "stderr"); t.snapshot(stderr, "stderr");
@@ -1,14 +0,0 @@
process.env.GITHUB_REPOSITORY = "actions/create-github-app-token";
process.env.GITHUB_REPOSITORY_OWNER = "actions";
process.env.HTTPS_PROXY = "http://127.0.0.1:3128";
const originalConsoleError = console.error;
console.error = (...args) => {
originalConsoleError(
...args.map((arg) => (arg instanceof Error ? arg.message : arg)),
);
};
await import("../main.js");
await new Promise((resolve) => setImmediate(resolve));
process.exitCode = 0;
@@ -1,13 +0,0 @@
process.env["INPUT_GITHUB-API-URL"] = "https://api.github.com";
process.env.HTTPS_PROXY = "http://127.0.0.1:3128";
const originalConsoleError = console.error;
console.error = (...args) => {
originalConsoleError(
...args.map((arg) => (arg instanceof Error ? arg.message : arg)),
);
};
await import("../post.js");
await new Promise((resolve) => setImmediate(resolve));
process.exitCode = 0;
-20
View File
@@ -82,16 +82,6 @@ Generated by [AVA](https://avajs.dev).
POST /app/installations/123456/access_tokens␊ POST /app/installations/123456/access_tokens␊
{"repositories":["create-github-app-token"]}` {"repositories":["create-github-app-token"]}`
## main-proxy-requires-native-support.test.js
> stderr
'A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.'
> stdout
'::error::A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.'
## main-repo-skew.test.js ## main-repo-skew.test.js
> stderr > stderr
@@ -343,16 +333,6 @@ Generated by [AVA](https://avajs.dev).
POST /app/installations/123456/access_tokens␊ POST /app/installations/123456/access_tokens␊
{"repositories":["create-github-app-token"],"permissions":{"issues":"write","pull_requests":"read"}}` {"repositories":["create-github-app-token"],"permissions":{"issues":"write","pull_requests":"read"}}`
## post-proxy-requires-native-support.test.js
> stderr
'A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.'
> stdout
'::error::A proxy environment variable is set, but Node.js native proxy support is not enabled. Set NODE_USE_ENV_PROXY=1 for this action step.'
## post-revoke-token-fail-response.test.js ## post-revoke-token-fail-response.test.js
> stderr > stderr
Binary file not shown.