@paklo/runner 0.11.1 → 0.11.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { C as hasDigest, D as ApiClient, E as updaterImages, O as CredentialFetchingError, S as digestName, T as updaterImageName, _ as getOrgFromImage, a as Updater, b as extractUpdaterSha, c as JOB_INPUT_FILENAME, d as UpdaterBuilder, f as CONFIG_FILE_NAME, g as ImageService, h as getJobParameters, i as runJob, k as JobDetailsFetchingError, l as JOB_INPUT_PATH, m as JobParameters, n as JobRunnerUpdaterError, o as CA_CERT_FILENAME, p as ProxyBuilder, r as isRunningInDocker, s as CA_CERT_INPUT_PATH, t as JobRunnerImagingError, u as REPO_CONTENTS_PATH, v as ContainerRuntimeError, w as repositoryName, x as PROXY_IMAGE_NAME, y as ContainerService } from "./run-Dk3mWwvc.mjs";
1
+ import { C as hasDigest, D as ApiClient, E as updaterImages, O as CredentialFetchingError, S as digestName, T as updaterImageName, _ as getOrgFromImage, a as Updater, b as extractUpdaterSha, c as JOB_INPUT_FILENAME, d as UpdaterBuilder, f as CONFIG_FILE_NAME, g as ImageService, h as getJobParameters, i as runJob, k as JobDetailsFetchingError, l as JOB_INPUT_PATH, m as JobParameters, n as JobRunnerUpdaterError, o as CA_CERT_FILENAME, p as ProxyBuilder, r as isRunningInDocker, s as CA_CERT_INPUT_PATH, t as JobRunnerImagingError, u as REPO_CONTENTS_PATH, v as ContainerRuntimeError, w as repositoryName, x as PROXY_IMAGE_NAME, y as ContainerService } from "./run-_JPMNsMy.mjs";
2
2
  import { logger } from "@paklo/core/logger";
3
3
  import Docker from "dockerode";
4
4
 
@@ -1,5 +1,5 @@
1
1
  import "../../api-client-DZQQArbU.mjs";
2
- import { a as LocalJobsRunner, i as LocalDependabotServerOptions, n as LocalDependabotServer, o as LocalJobsRunnerOptions, s as RunJobsResult } from "../../server-CgRF4LrG.mjs";
2
+ import { a as LocalJobsRunner, i as LocalDependabotServerOptions, n as LocalDependabotServer, o as LocalJobsRunnerOptions, s as RunJobsResult } from "../../server-B6aYEkTC.mjs";
3
3
  import { DependabotRequest } from "@paklo/core/dependabot";
4
4
  import { AzdoPrExtractedWithProperties, AzdoPullRequestMergeStrategy, AzureDevOpsClientWrapper, AzureDevOpsRepositoryUrl } from "@paklo/core/azure";
5
5
 
@@ -1,4 +1,4 @@
1
- import { i as runJob } from "../../run-Dk3mWwvc.mjs";
1
+ import { i as runJob } from "../../run-_JPMNsMy.mjs";
2
2
  import { n as LocalJobsRunner, t as LocalDependabotServer } from "../../server-BkN82tIp.mjs";
3
3
  import { logger } from "@paklo/core/logger";
4
4
  import { readFile } from "node:fs/promises";
@@ -1,3 +1,3 @@
1
1
  import "../api-client-DZQQArbU.mjs";
2
- import { a as LocalJobsRunner, i as LocalDependabotServerOptions, n as LocalDependabotServer, o as LocalJobsRunnerOptions, r as LocalDependabotServerAddOptions, s as RunJobsResult, t as AffectedPullRequestIds } from "../server-CgRF4LrG.mjs";
2
+ import { a as LocalJobsRunner, i as LocalDependabotServerOptions, n as LocalDependabotServer, o as LocalJobsRunnerOptions, r as LocalDependabotServerAddOptions, s as RunJobsResult, t as AffectedPullRequestIds } from "../server-B6aYEkTC.mjs";
3
3
  export { AffectedPullRequestIds, LocalDependabotServer, LocalDependabotServerAddOptions, LocalDependabotServerOptions, LocalJobsRunner, LocalJobsRunnerOptions, RunJobsResult };
@@ -116,38 +116,38 @@ var ApiClient = class {
116
116
 
117
117
  //#endregion
118
118
  //#region docker/containers.json
119
- var proxy = "ghcr.io/dependabot/proxy:v2.0.20260211002226@sha256:01973f1077a283381e979987aae6e70fbe1104f04186863985539e4d2472f019";
119
+ var proxy = "ghcr.io/dependabot/proxy:v2.0.20260212174659@sha256:866526f227b518325176451a66d083f53a26dc0e5d1916a4e19cd84e9b9d8f4a";
120
120
  var containers_default = {
121
121
  proxy,
122
- bundler: "ghcr.io/dependabot/dependabot-updater-bundler:v2.0.20260209125534@sha256:735d58e36743031fa20e82fff52c6f7b0d2a19130e14ffcb9135e81e4994331d",
123
- cargo: "ghcr.io/dependabot/dependabot-updater-cargo:v2.0.20260209195242@sha256:698db3aaf0d5673ec29dc4dc1700734e687f8b71320198c6e39aa4c34e199d3a",
124
- composer: "ghcr.io/dependabot/dependabot-updater-composer:v2.0.20260209195242@sha256:14a65f8db6fc5b8b0511cd14b8627f17664873bab929b857086ce69af35ec785",
125
- conda: "ghcr.io/dependabot/dependabot-updater-conda:v2.0.20260209125534@sha256:31214d00c3e7870d83ef82e6fb5a0fb4fb1a45da62323aeb6f1ee3757df82a08",
126
- pub: "ghcr.io/dependabot/dependabot-updater-pub:v2.0.20260209195242@sha256:3eb8ea87a95d4c452cf95cb361049c843c55ebcf35e434b795d1af2fdd5d27dd",
127
- docker: "ghcr.io/dependabot/dependabot-updater-docker:v2.0.20260209195242@sha256:c589f1b84b02e5ba7c3eae58156dcf1ef2dd0f51a50e4f593f6e2da9ee705e1a",
128
- elm: "ghcr.io/dependabot/dependabot-updater-elm:v2.0.20260209195242@sha256:83c78d8f0f485a6d70cd4565a9d2dd19e0ea4b8c133d99fdcff8d4179b6dda2c",
129
- github_actions: "ghcr.io/dependabot/dependabot-updater-github-actions:v2.0.20260209195242@sha256:87c90ddb60af4cf4e8883171ce0b6fa473ded957c927199b54a90bae4a7fd82f",
130
- submodules: "ghcr.io/dependabot/dependabot-updater-gitsubmodule:v2.0.20260209195242@sha256:6dc0818455feec99b8057e1820c2f654ce9a720fb049b6c1a5321e162ba69810",
131
- go_modules: "ghcr.io/dependabot/dependabot-updater-gomod:v2.0.20260209195242@sha256:6b3509b8c8a5737fc42177615453340aba60877e0977cf1f0acd1ef204eedca8",
132
- gradle: "ghcr.io/dependabot/dependabot-updater-gradle:v2.0.20260209195242@sha256:a8b1687202ff90dcd05eb4f6d740c71830d16f7d630bf9b3e7f5d04208fa1546",
133
- maven: "ghcr.io/dependabot/dependabot-updater-maven:v2.0.20260209195242@sha256:0532eab865bea0781a3bad7e6e105a4e20740bd6410af7e9dfbf89f3b925fe05",
134
- hex: "ghcr.io/dependabot/dependabot-updater-mix:v2.0.20260209195242@sha256:1135fa3b755b59970a3dbfe7e693607e27b3d1e0eba4257f87801a9fb639bc2d",
135
- nuget: "ghcr.io/dependabot/dependabot-updater-nuget:v2.0.20260209195242@sha256:9c7f49a065e309a19e613ab6213b5da0c0e98c181c0f980c95a15e32a685df4a",
136
- npm_and_yarn: "ghcr.io/dependabot/dependabot-updater-npm:v2.0.20260209195242@sha256:20a7c46527da82d055c5bdf8f8102903d1e80686fe98a0a675d8e0c38612c7c2",
137
- pip: "ghcr.io/dependabot/dependabot-updater-pip:v2.0.20260209195242@sha256:2b9ae800a24370e37ec628bc38a42c6138364c6c580db8ca1c518c01622412d8",
138
- rust_toolchain: "ghcr.io/dependabot/dependabot-updater-rust-toolchain:v2.0.20260209195242@sha256:fc8912608ad0ae915b357597f28ca71c0cb2a4d58f3e8a88c2de0f4ae0413983",
139
- swift: "ghcr.io/dependabot/dependabot-updater-swift:v2.0.20260209195242@sha256:8a59ceebb0d4c54994f28252317e48cd922d4438c96acf85fd7dfd5667a5a623",
140
- terraform: "ghcr.io/dependabot/dependabot-updater-terraform:v2.0.20260209195242@sha256:eb91b6424f2113b6e9688d535a8178baca8a8c42546836944fe5e4d8ea82f57d",
141
- devcontainers: "ghcr.io/dependabot/dependabot-updater-devcontainers:v2.0.20260209195242@sha256:65aaa1f28af004d3b50f316fb230b49a3cd3336a4fda3ffec741586ff895f86b",
142
- dotnet_sdk: "ghcr.io/dependabot/dependabot-updater-dotnet-sdk:v2.0.20260209195242@sha256:e0b34cef104e73558300d973bcf23c647219955a1b245a56de7983b6993333b9",
143
- bun: "ghcr.io/dependabot/dependabot-updater-bun:v2.0.20260209195242@sha256:6a57d00155c5c66af4ddf29307adfb86f095d8f3049d99d2607493ef67e1a7c3",
144
- docker_compose: "ghcr.io/dependabot/dependabot-updater-docker-compose:v2.0.20260209195242@sha256:f7f19524d7dbfb830e1906fe178637dd92df76eef41c0fdc5a33e866846f0b03",
145
- uv: "ghcr.io/dependabot/dependabot-updater-uv:v2.0.20260209195242@sha256:c715de9d1ea17a16565862891c9168cf9af3a3fa4bc4455e5b0c0f95fe4f8970",
146
- vcpkg: "ghcr.io/dependabot/dependabot-updater-vcpkg:v2.0.20260209195242@sha256:9a8aec81e6c826f0fb84b3d0b2ae45d237c95310cb8c463257988538f680009d",
147
- helm: "ghcr.io/dependabot/dependabot-updater-helm:v2.0.20260209195242@sha256:688f11893480dad1c9ae71b5a84741bbb7d71396239d53493b8fab7d6fc058ff",
148
- julia: "ghcr.io/dependabot/dependabot-updater-julia:v2.0.20260209195242@sha256:5d32fd8b83595896069fb45c58ec289f609fcab1f743e436c794bdc2864f7993",
149
- bazel: "ghcr.io/dependabot/dependabot-updater-bazel:v2.0.20260209195242@sha256:69a467a22503e771e7c3f3c68013fd4af37e4a738f62c12501d16f43c3630a18",
150
- opentofu: "ghcr.io/dependabot/dependabot-updater-opentofu:v2.0.20260209195242@sha256:7bff1a65240f4df1deff948e4262c96411256c6e3ae284f6fd850ef010ff0c87"
122
+ bundler: "ghcr.io/dependabot/dependabot-updater-bundler:v2.0.20260213162512@sha256:68926e58829a247aada619c27b5de68606538c17872a737665d533549972c8c7",
123
+ cargo: "ghcr.io/dependabot/dependabot-updater-cargo:v2.0.20260213162512@sha256:4653b1f0338fa0b2838dda73af1c3a9c06304f43f1964d5e7d8c3e7edd0c29c7",
124
+ composer: "ghcr.io/dependabot/dependabot-updater-composer:v2.0.20260213162512@sha256:abcb25e2756d54d26c9f128268406d925f90b64367a526a4e55fe6cf7e05ef94",
125
+ conda: "ghcr.io/dependabot/dependabot-updater-conda:v2.0.20260213162512@sha256:e295dfb9e214c2f2eae7fb7e032a806c60fc6bb11bc8dea81c70189b6800a846",
126
+ pub: "ghcr.io/dependabot/dependabot-updater-pub:v2.0.20260213162512@sha256:6e79a6769845206fc5f14edcb964b798ba350dfa0633a2207e3b4bd58070e4cd",
127
+ docker: "ghcr.io/dependabot/dependabot-updater-docker:v2.0.20260213162512@sha256:f1b69cad5887f99ea54d35853dd3daea431ace207f904e048015e858f2a366d7",
128
+ elm: "ghcr.io/dependabot/dependabot-updater-elm:v2.0.20260213162512@sha256:9dc6b3292caec7737b4045d7e9f0d05d44d289b6860b0b1440ed1364e395123a",
129
+ github_actions: "ghcr.io/dependabot/dependabot-updater-github-actions:v2.0.20260213162512@sha256:6be679a8b2215faaa13de33f512da5a3f3c4d4782be04b160594599576930bbd",
130
+ submodules: "ghcr.io/dependabot/dependabot-updater-gitsubmodule:v2.0.20260213162512@sha256:cdb73be73a997f8740341c977a08ec98365f6ebd0df1499cceac216e64cfd951",
131
+ go_modules: "ghcr.io/dependabot/dependabot-updater-gomod:v2.0.20260213162512@sha256:d162150a94ba72af2d84c49030cb37cb3b5f379f8e0e2907d6c54987804aa42e",
132
+ gradle: "ghcr.io/dependabot/dependabot-updater-gradle:v2.0.20260213162512@sha256:a7f040711ea10fc58b9f94b2fe443ece255c7830ee5215173822426f8580d507",
133
+ maven: "ghcr.io/dependabot/dependabot-updater-maven:v2.0.20260213162512@sha256:4712f3265ab80b95b0f17bcabd5de1898c0efae7c3dd61721d0b778d7bae2c97",
134
+ hex: "ghcr.io/dependabot/dependabot-updater-mix:v2.0.20260213162512@sha256:9c9e6e0b2f94893f01de36cdb6a92671439f8a9eda54b267654038fc94f97374",
135
+ nuget: "ghcr.io/dependabot/dependabot-updater-nuget:v2.0.20260213162512@sha256:12b57c43a1359b19edb2272d31f5d58ec5b7a691e216887f229d7c980c174d88",
136
+ npm_and_yarn: "ghcr.io/dependabot/dependabot-updater-npm:v2.0.20260213162512@sha256:91fc51ccefc42f2716d410059b06db2c38be3070098a25e165bc1abe47a9ab54",
137
+ pip: "ghcr.io/dependabot/dependabot-updater-pip:v2.0.20260213162512@sha256:529302bffe049944ac64ae076b2e9147593359826441ae54e2671ea061ed4ed4",
138
+ rust_toolchain: "ghcr.io/dependabot/dependabot-updater-rust-toolchain:v2.0.20260213162512@sha256:05097f77126cf0efca2ebf1cc456d4f9d05f645071cb79ce258c6b99ab9eaf77",
139
+ swift: "ghcr.io/dependabot/dependabot-updater-swift:v2.0.20260213162512@sha256:6f84b328dd82a28a0140b6d0d34b8df54b316fb2832011808b5fb4f0a4e31ed9",
140
+ terraform: "ghcr.io/dependabot/dependabot-updater-terraform:v2.0.20260213162512@sha256:d3a81fe9a8d19c334b03aa8b04a2dadb62c942b56800d7904211ff833af460cb",
141
+ devcontainers: "ghcr.io/dependabot/dependabot-updater-devcontainers:v2.0.20260213162512@sha256:6b4fc136f42656556cd3a00ebea3b90c576d5d67ea8028c2ebdb2592a36f5e75",
142
+ dotnet_sdk: "ghcr.io/dependabot/dependabot-updater-dotnet-sdk:v2.0.20260213162512@sha256:e1fa4faf327dca884c9d959ef7af624582cffa8fbae572451dc81cb58121d33a",
143
+ bun: "ghcr.io/dependabot/dependabot-updater-bun:v2.0.20260213162512@sha256:f043043653dd4ba8cd8b1f479d1a10be4b4b2488bf194039118c80fe83d8b6cf",
144
+ docker_compose: "ghcr.io/dependabot/dependabot-updater-docker-compose:v2.0.20260213162512@sha256:337a51f0afb2060208bef674b8411b961746daa295d9f77453cb6c62b410e94c",
145
+ uv: "ghcr.io/dependabot/dependabot-updater-uv:v2.0.20260213162512@sha256:68645e36ee2f0885932f748ddb4ffb319b1fd1c7e24b8674977b6c4eb819264c",
146
+ vcpkg: "ghcr.io/dependabot/dependabot-updater-vcpkg:v2.0.20260213162512@sha256:550dcd199f2a406268bcdd3f2dbadf3bbb1f04cf712a2373c6425514cac460c3",
147
+ helm: "ghcr.io/dependabot/dependabot-updater-helm:v2.0.20260213162512@sha256:3a53bd791b6c2105f3d3609f5778f85a7e1fab8757bc2d55ec8a45f9b4f982e1",
148
+ julia: "ghcr.io/dependabot/dependabot-updater-julia:v2.0.20260213162512@sha256:74c8c400e8bd50760500c1e12c06b332a355886a71fbea6d9789b2724dab6542",
149
+ bazel: "ghcr.io/dependabot/dependabot-updater-bazel:v2.0.20260213162512@sha256:cc84014545823c91e0ebb9802b63d300f52af84583dcc891b6e1d91b4b169ac8",
150
+ opentofu: "ghcr.io/dependabot/dependabot-updater-opentofu:v2.0.20260213162512@sha256:c7c0de725b05b1be6b4a56bf047f76f81f89fee750b473ae220df8958c544c80"
151
151
  };
152
152
 
153
153
  //#endregion
@@ -537,7 +537,7 @@ var ProxyBuilder = class ProxyBuilder {
537
537
 
538
538
  //#endregion
539
539
  //#region package.json
540
- var version = "0.11.1";
540
+ var version = "0.11.2";
541
541
 
542
542
  //#endregion
543
543
  //#region src/updater-builder.ts
@@ -783,4 +783,4 @@ async function isRunningInDocker() {
783
783
 
784
784
  //#endregion
785
785
  export { hasDigest as C, ApiClient as D, updaterImages as E, CredentialFetchingError as O, digestName as S, updaterImageName as T, getOrgFromImage as _, Updater as a, extractUpdaterSha as b, JOB_INPUT_FILENAME as c, UpdaterBuilder as d, CONFIG_FILE_NAME as f, ImageService as g, getJobParameters as h, runJob as i, JobDetailsFetchingError as k, JOB_INPUT_PATH as l, JobParameters as m, JobRunnerUpdaterError as n, CA_CERT_FILENAME as o, ProxyBuilder as p, isRunningInDocker as r, CA_CERT_INPUT_PATH as s, JobRunnerImagingError as t, REPO_CONTENTS_PATH as u, ContainerRuntimeError as v, repositoryName as w, PROXY_IMAGE_NAME as x, ContainerService as y };
786
- //# sourceMappingURL=run-Dk3mWwvc.mjs.map
786
+ //# sourceMappingURL=run-_JPMNsMy.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-Dk3mWwvc.mjs","names":["dockerContainerConfig.proxy","dockerContainerConfig","CA_CERT_INPUT_PATH","packageJson.version"],"sources":["../src/api-client.ts","../docker/containers.json","../src/docker-tags.ts","../src/utils.ts","../src/container-service.ts","../src/image-service.ts","../src/params.ts","../src/proxy.ts","../package.json","../src/updater-builder.ts","../src/updater.ts","../src/run.ts"],"sourcesContent":["import type {\n DependabotCredential,\n DependabotJobConfig,\n DependabotMetric,\n DependabotRecordUpdateJobError,\n} from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport { isHTTPError, type KyInstance, type KyResponse } from 'ky';\nimport type { JobParameters } from './params';\n\nexport class JobDetailsFetchingError extends Error {}\nexport class CredentialFetchingError extends Error {}\nexport type SecretMasker = (value: string) => void;\n\nexport class ApiClient {\n private dependabotApiUrl: string;\n private jobToken: string;\n constructor(\n private readonly client: KyInstance,\n readonly params: JobParameters,\n jobToken: string,\n private readonly credentialsToken: string,\n private readonly secretMasker: SecretMasker,\n ) {\n // if dependabotApiUrl contains \"host.docker.internal\", we need to replace it with \"localhost\" for local calls\n const baseUrl = params.dependabotApiUrl.replace('host.docker.internal', 'localhost');\n this.dependabotApiUrl = baseUrl;\n this.jobToken = jobToken;\n }\n\n // We use a static unknown SHA when marking a job as complete from the action\n // to remain in parity with the existing runner.\n UnknownSha = {\n 'base-commit-sha': 'unknown',\n };\n\n // Getter for jobToken\n getJobToken(): string {\n return this.jobToken;\n }\n\n async getJobDetails(): Promise<DependabotJobConfig> {\n const detailsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/details`;\n try {\n const res = await this.getWithRetry<DependabotJobConfig>(detailsURL, this.jobToken);\n if (res.status !== 200) {\n throw new JobDetailsFetchingError(\n `fetching job details: unexpected status code: ${res.status}: ${JSON.stringify(await res.json())}`,\n );\n }\n const data = await res.json();\n if (!data) {\n throw new JobDetailsFetchingError(`fetching job details: missing response`);\n }\n\n return data;\n } catch (error) {\n if (error instanceof JobDetailsFetchingError) {\n throw error;\n } else if (isHTTPError(error)) {\n throw new JobDetailsFetchingError(\n `fetching job details: unexpected status code: ${error.response.status}: ${error.message}`,\n );\n } else if (error instanceof Error) {\n throw new JobDetailsFetchingError(`fetching job details: ${error.name}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async getCredentials(): Promise<DependabotCredential[]> {\n const credentialsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/credentials`;\n try {\n const res = await this.getWithRetry<DependabotCredential[]>(credentialsURL, this.credentialsToken);\n\n if (res.status !== 200) {\n throw new CredentialFetchingError(\n `fetching credentials: unexpected status code: ${res.status}: ${JSON.stringify(await res.json())}`,\n );\n }\n const data = await res.json();\n if (!data) {\n throw new CredentialFetchingError(`fetching credentials: missing response`);\n }\n\n // Mask any secrets we've just retrieved from environment logs\n for (const credential of data) {\n if (credential.password) {\n this.secretMasker(credential.password);\n }\n if (credential.token) {\n this.secretMasker(credential.token);\n }\n if (credential['auth-key']) {\n this.secretMasker(credential['auth-key']);\n }\n }\n\n return data;\n } catch (error: unknown) {\n if (error instanceof CredentialFetchingError) {\n throw error;\n } else if (isHTTPError(error)) {\n throw new CredentialFetchingError(\n `fetching credentials: unexpected status code: ${error.response.status}: ${error.message}`,\n );\n } else if (error instanceof Error) {\n throw new CredentialFetchingError(`fetching credentials: ${error.name}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async reportJobError(error: DependabotRecordUpdateJobError): Promise<void> {\n const recordErrorURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/record_update_job_error`;\n const res = await this.client.post(recordErrorURL, {\n json: error,\n headers: { Authorization: this.jobToken },\n });\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n async markJobAsProcessed(): Promise<void> {\n const markAsProcessedURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/mark_as_processed`;\n const res = await this.client.patch(markAsProcessedURL, {\n json: this.UnknownSha,\n headers: { Authorization: this.jobToken },\n });\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n async sendMetrics(\n name: string,\n metricType: 'increment' | 'gauge',\n value: number,\n additionalTags: Record<string, string> = {},\n ): Promise<void> {\n try {\n await this.reportMetrics([\n {\n metric: `dependabot.action.${name}`,\n type: metricType,\n value,\n tags: additionalTags,\n },\n ]);\n logger.info(`Successfully sent metric (dependabot.action.${name}) to remote API endpoint`);\n } catch (error) {\n // metrics should typically not cause critical path failure so we log the\n // failure and continue with the job\n logger.warn(`Metrics reporting failed: ${(error as Error).message}`);\n }\n }\n\n async reportMetrics(metrics: DependabotMetric[]): Promise<void> {\n const metricsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/record_metrics`;\n const res = await this.client.post(metricsURL, {\n json: { data: metrics },\n headers: { Authorization: this.jobToken },\n });\n\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n private async getWithRetry<T>(url: string, token: string, options?: RequestInit): Promise<KyResponse<T>> {\n const execute = async (): Promise<KyResponse<T>> => {\n const res = await this.client.get<T>(url, {\n headers: { Authorization: token },\n retry: {\n limit: 3,\n // other default options are sufficient:\n // https://github.com/sindresorhus/ky#retry\n // delay: attemptCount => 0.3 * (2 ** (attemptCount - 1)) * 1000\n // statusCodes: 408 413 429 500 502 503 504\n // afterStatusCodes: 413, 429, 503\n },\n hooks: {\n beforeRetry: [\n async ({ request, options, error, retryCount }) => {\n if (isHTTPError(error)) {\n logger.warn(`Retrying failed request with status code: ${error.response.status}`);\n }\n },\n ],\n },\n ...options,\n });\n\n return res;\n };\n\n return execute();\n }\n}\n","","import dockerContainerConfig from '../docker/containers.json';\n\nexport const PROXY_IMAGE_NAME = dockerContainerConfig.proxy;\n\nexport function updaterImageName(packageManager: string): string {\n return dockerContainerConfig[packageManager as keyof typeof dockerContainerConfig];\n}\n\nconst updaterRegex = /ghcr.io\\/dependabot\\/dependabot-updater-([\\w+])/;\n\nexport function updaterImages(): string[] {\n return Object.values(dockerContainerConfig).filter((image) => image.match(updaterRegex));\n}\n\nconst imageNamePattern =\n '^(?<repository>(([a-zA-Z0-9._-]+([:[0-9]+[^/]))?([a-zA-Z0-9._/-]+)?))(:[a-zA-Z0-9._/-]+)?(?<digest>@sha256:[a-zA-Z0-9]{64})?$';\n\nexport function repositoryName(imageName: string): string {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n return match.groups.repository!;\n } else {\n throw Error('invalid image name');\n }\n}\n\nexport function hasDigest(imageName: string): boolean {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n if (match?.groups.digest) {\n return true;\n }\n return false;\n } else {\n throw Error('invalid image name');\n }\n}\n\nexport function digestName(imageName: string): string {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n return match.groups.repository! + match.groups.digest;\n } else {\n throw Error('invalid image name');\n }\n}\n","import stream, { type Writable } from 'node:stream';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport const nullStream: Writable = new stream.Writable({ write: (__, _, next) => next() });\n\nexport const outStream = (prefix: string): Writable => {\n return new stream.Writable({\n write(chunk, _, next) {\n process.stdout.write(`${prefix} | ${chunk.toString()}`);\n next();\n },\n });\n};\n\nexport const errStream = (prefix: string): Writable => {\n return new stream.Writable({\n write(chunk, _, next) {\n process.stderr.write(`${prefix} | ${chunk.toString()}`);\n next();\n },\n });\n};\n\n/**\n * Extracts the SHA from an updater image string.\n * @param updaterImage - Image string in the format \"image:sha\" or \"registry/image:sha\"\n * @returns The SHA part after the last colon, or null if no colon is found\n */\nexport const extractUpdaterSha = (updaterImage: string): string | null => {\n const match = updaterImage.match(/:([^:]*)$/);\n return match ? match[1]! : null;\n};\n","import type { DependabotProxyConfig, FileFetcherInput, FileUpdaterInput } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type { Container } from 'dockerode';\nimport { pack } from 'tar-stream';\nimport { errStream, outStream } from './utils';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class ContainerRuntimeError extends Error {}\n\nconst RWX_ALL = 0o777;\n\nexport const ContainerService = {\n async storeInput(\n name: string,\n path: string,\n container: Container,\n input: FileFetcherInput | FileUpdaterInput | DependabotProxyConfig,\n ): Promise<void> {\n const tar = pack();\n tar.entry({ name, mode: RWX_ALL }, JSON.stringify(input));\n tar.finalize();\n await container.putArchive(tar, { path });\n },\n\n async storeCert(name: string, path: string, container: Container, cert: string): Promise<void> {\n const tar = pack();\n tar.entry({ name }, cert);\n tar.finalize();\n await container.putArchive(tar, { path });\n },\n\n async run(container: Container, command?: string): Promise<boolean> {\n try {\n // Start the container\n await container.start();\n logger.info(`Started container ${container.id}`);\n\n // Check if this is a dependabot container (has the expected structure)\n const containerInfo = await container.inspect();\n const isDependabotContainer = containerInfo.Config?.Env?.some((env) => env.startsWith('DEPENDABOT_JOB_ID='));\n\n if (isDependabotContainer) {\n // For dependabot containers, run CA certificates update as root first\n await this.execCommand(container, ['/usr/sbin/update-ca-certificates'], 'root');\n\n // Then run the dependabot commands as dependabot user\n const dependabotCommands = [\n 'mkdir -p /home/dependabot/dependabot-updater/output',\n // 'fetch_files' command removed as it is now a no-op\n ];\n\n if (command === 'graph') {\n dependabotCommands.push('$DEPENDABOT_HOME/dependabot-updater/bin/run update_graph');\n } else {\n dependabotCommands.push('$DEPENDABOT_HOME/dependabot-updater/bin/run update_files');\n }\n\n for (const cmd of dependabotCommands) {\n await this.execCommand(container, ['/bin/sh', '-c', cmd], 'dependabot');\n }\n } else {\n // For test containers and other containers, just wait for completion\n const outcome = await container.wait();\n if (outcome.StatusCode !== 0) {\n throw new Error(`Container exited with code ${outcome.StatusCode}`);\n }\n }\n\n return true;\n } catch (error) {\n logger.info(`Failure running container ${container.id}: ${error}`);\n throw new ContainerRuntimeError('The updater encountered one or more errors.');\n } finally {\n try {\n await container.remove({ v: true, force: true });\n logger.info(`Cleaned up container ${container.id}`);\n } catch (error) {\n logger.info(`Failed to clean up container ${container.id}: ${error}`);\n }\n }\n },\n\n async execCommand(container: Container, cmd: string[], user: string): Promise<void> {\n const exec = await container.exec({\n Cmd: cmd,\n User: user,\n AttachStdout: true,\n AttachStderr: true,\n });\n\n const stream = await exec.start({});\n\n // Wait for the stream to end\n await new Promise<void>((resolve, reject) => {\n container.modem.demuxStream(stream, outStream('updater'), errStream('updater'));\n\n stream.on('end', () => {\n resolve();\n });\n\n stream.on('error', (error) => {\n reject(error);\n });\n });\n\n // Wait a bit for the exec to complete properly\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const inspection = await exec.inspect();\n if (inspection.ExitCode !== 0) {\n throw new Error(`Command failed with exit code ${inspection.ExitCode}: ${cmd.join(' ')}`);\n }\n },\n};\n","import { Readable } from 'node:stream';\nimport { logger } from '@paklo/core/logger';\nimport Docker from 'dockerode';\n\nconst MAX_RETRIES = 5; // Maximum number of retries\nconst INITIAL_DELAY_MS = 5000; // Initial delay in milliseconds for backoff\n\n// Code below is borrowed and adapted from dependabot-action\n\nconst sleep = async (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst endOfStream = async (docker: Docker, stream: Readable): Promise<void> => {\n return new Promise((resolve, reject) => {\n docker.modem.followProgress(stream, (err: Error | null) => (err ? reject(err) : resolve(undefined)));\n });\n};\n\nexport function getOrgFromImage(imageName: string): string {\n const parts = imageName.split('/');\n if (parts.length >= 3 && parts[0] === 'ghcr.io') {\n return parts[1]!; // The domain is always the second part\n }\n return 'unknown'; // Fallback case if structure is unexpected\n}\n\nexport type MetricReporter = (\n metricName: string,\n metricType: 'increment' | 'gauge',\n value: number,\n additionalTags?: Record<string, string>,\n) => Promise<void>;\n\n/** Fetch the configured updater image, if it isn't already available. */\nexport const ImageService = {\n async pull(imageName: string, sendMetric?: MetricReporter, force = false): Promise<void> {\n /*\n This method fetches images hosts on GitHub infrastructure.\n\n We expose the `fetch_image` utility method to allow us to pull in arbitrary images for unit tests.\n */\n if (!(imageName.startsWith('ghcr.io/') || imageName.startsWith('docker.pkg.github.com/'))) {\n throw new Error('Only images distributed via docker.pkg.github.com or ghcr.io can be fetched');\n }\n\n const docker = new Docker();\n const org = getOrgFromImage(imageName);\n try {\n const image = await docker.getImage(imageName).inspect();\n if (!force) {\n logger.info(`Resolved ${imageName} to existing ${image.RepoDigests}`);\n return;\n } // else fallthrough to pull\n } catch (e: unknown) {\n if (e instanceof Error && !e.message.includes('no such image')) {\n throw e;\n } // else fallthrough to pull\n }\n\n const auth = {}; // Images are public so not authentication info is required\n await this.fetchImageWithRetry(imageName, auth, docker, sendMetric, org);\n },\n\n /* Retrieve the image using the auth details provided, if any with retry and backoff */\n async fetchImageWithRetry(\n imageName: string,\n auth = {},\n docker = new Docker(),\n sendMetric: MetricReporter | undefined,\n org: string,\n ): Promise<void> {\n let attempt = 0;\n\n while (attempt < MAX_RETRIES) {\n try {\n logger.info(`Pulling image ${imageName} (attempt ${attempt + 1})...`);\n /* To avoid sending metrics during unit tests (fetch_image) */\n if (sendMetric) {\n await sendMetric('ghcr_image_pull', 'increment', 1, {\n org,\n });\n }\n const stream = await docker.pull(imageName, { authconfig: auth });\n await endOfStream(docker, new Readable().wrap(stream));\n logger.info(`Pulled image ${imageName}`);\n return; // Exit on success\n } catch (error) {\n if (!(error instanceof Error)) throw error; // Ensure error is an instance of Error\n\n // Handle 429 Too Many Requests separately\n if (\n error.message.includes('429 Too Many Requests') ||\n error.message.toLowerCase().includes('too many requests')\n ) {\n attempt++; // Only increment attempt on 429\n if (attempt >= MAX_RETRIES) {\n logger.error(`Failed to pull image ${imageName} after ${MAX_RETRIES} attempts.`);\n throw error;\n }\n\n // Add jitter to avoid synchronization issues\n // biome-ignore lint/style/useExponentiationOperator: This is clearer for now\n const baseDelay = INITIAL_DELAY_MS * Math.pow(2, attempt);\n const jitter = Math.random() * baseDelay;\n const delay = baseDelay / 2 + jitter;\n\n logger.warn(`Received Too Many Requests error. Retrying in ${(delay / 1000).toFixed(2)} seconds...`);\n await sleep(delay);\n } else {\n // Non-429 errors should NOT be retried\n logger.error(`Fatal error pulling image ${imageName}: ${error.message}`);\n throw error; // Exit immediately\n }\n }\n }\n },\n};\n","// Code below is borrowed and adapted from dependabot-action\n\n/*\n `jobId` is intentionally a string even though we copied from code that used number\n We generate the job identifiers using Snowflake which produces bigint\n and bigint cannot be serialized to JSON, so we use string everywhere instead.\n The hosted dependabot possible uses auto-incrementing numbers for jobIds in their database,\n but not all databases support this.\n*/\n\nexport class JobParameters {\n constructor(\n readonly jobId: string,\n readonly jobToken: string,\n readonly credentialsToken: string,\n readonly dependabotApiUrl: string,\n readonly dependabotApiDockerUrl: string,\n readonly updaterImage: string,\n ) {}\n}\n\nexport function getJobParameters(input: {\n jobId?: string;\n jobToken?: string;\n credentialsToken?: string;\n dependabotApiUrl?: string;\n dependabotApiDockerUrl?: string;\n updaterImage?: string;\n}): JobParameters | null {\n return new JobParameters(\n input.jobId as string,\n input.jobToken as string,\n input.credentialsToken as string,\n input.dependabotApiUrl as string,\n input.dependabotApiDockerUrl as string,\n input.updaterImage as string,\n );\n}\n","import { readFile } from 'node:fs/promises';\nimport type { CertificateAuthority, DependabotCredential, DependabotProxyConfig } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type Docker from 'dockerode';\nimport type { Container, Network } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport { errStream, nullStream, outStream } from './utils';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport type Proxy = {\n container: Container;\n network: Network;\n networkName: string;\n url: () => Promise<string>;\n cert: string;\n shutdown: () => Promise<void>;\n};\n\nconst KEY_SIZE = 2048;\nconst KEY_EXPIRY_YEARS = 2;\nconst CONFIG_FILE_PATH = '/';\nexport const CONFIG_FILE_NAME = 'config.json';\nconst CA_CERT_INPUT_PATH = '/usr/local/share/ca-certificates';\nconst CUSTOM_CA_CERT_NAME = 'custom-ca-cert.crt';\nconst CERT_SUBJECT = [\n { name: 'commonName', value: 'Dependabot Internal CA' },\n { name: 'organizationName', value: 'GitHub Inc.' },\n { shortName: 'OU', value: 'Dependabot' },\n { name: 'countryName', value: 'US' },\n { shortName: 'ST', value: 'California' },\n { name: 'localityName', value: 'San Francisco' },\n];\n\nexport class ProxyBuilder {\n constructor(\n private readonly docker: Docker,\n private readonly proxyImage: string,\n private readonly cachedMode: boolean,\n private readonly debug: boolean,\n ) {}\n\n async run(\n jobId: string,\n jobToken: string,\n dependabotApiUrl: string,\n credentials: DependabotCredential[],\n ): Promise<Proxy> {\n const name = `dependabot-job-${jobId}-proxy`;\n const config = await this.buildProxyConfig(credentials);\n const cert = config.ca.cert;\n\n const externalNetworkName = `dependabot-job-${jobId}-external-network`;\n const externalNetwork = await this.ensureNetwork(externalNetworkName, false);\n\n const internalNetworkName = `dependabot-job-${jobId}-internal-network`;\n const internalNetwork = await this.ensureNetwork(internalNetworkName, true);\n\n const container = await this.createContainer(\n jobId,\n jobToken,\n dependabotApiUrl,\n name,\n externalNetwork,\n internalNetwork,\n internalNetworkName,\n );\n\n await ContainerService.storeInput(CONFIG_FILE_NAME, CONFIG_FILE_PATH, container, config);\n\n const customCAPath = this.customCAPath();\n if (customCAPath) {\n logger.info('Detected custom CA certificate, adding to proxy');\n\n const customCert = (await readFile(customCAPath, 'utf8')).toString();\n await ContainerService.storeCert(CUSTOM_CA_CERT_NAME, CA_CERT_INPUT_PATH, container, customCert);\n }\n\n const stream = await container.attach({\n stream: true,\n stdout: true,\n stderr: true,\n });\n container.modem.demuxStream(\n stream,\n // proxy generates lots of logs that we do not need unless debugging\n // this should save on disk space in agents running Azure pipelines\n this.debug ? outStream(' proxy') : nullStream,\n this.debug ? errStream(' proxy') : nullStream,\n );\n\n const url = async (): Promise<string> => {\n const containerInfo = await container.inspect();\n\n if (containerInfo.State.Running === true) {\n const ipAddress = containerInfo.NetworkSettings.Networks[`${internalNetworkName}`]!.IPAddress;\n return `http://${ipAddress}:1080`;\n } else {\n throw new Error(\"proxy container isn't running\");\n }\n };\n\n return {\n container,\n network: internalNetwork,\n networkName: internalNetworkName,\n url,\n cert,\n shutdown: async () => {\n await container.stop();\n await container.remove();\n await Promise.all([externalNetwork.remove(), internalNetwork.remove()]);\n },\n };\n }\n\n private async ensureNetwork(name: string, internal = true): Promise<Network> {\n const networks = await this.docker.listNetworks({\n filters: JSON.stringify({ name: [name] }),\n });\n if (networks.length > 0) {\n return this.docker.getNetwork(networks[0]!.Id);\n } else {\n return await this.docker.createNetwork({ Name: name, Internal: internal });\n }\n }\n\n private async buildProxyConfig(credentials: DependabotCredential[]): Promise<DependabotProxyConfig> {\n const ca = await ProxyBuilder.generateCertificateAuthority();\n\n const config: DependabotProxyConfig = { all_credentials: credentials, ca };\n\n return config;\n }\n\n public static async generateCertificateAuthority(): Promise<CertificateAuthority> {\n // node-forge is a CommonJS module, so we need to import it dynamically\n const {\n default: { md, pki },\n } = await import('node-forge');\n const keys = pki.rsa.generateKeyPair(KEY_SIZE);\n const cert = pki.createCertificate();\n\n cert.publicKey = keys.publicKey;\n cert.serialNumber = '01';\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + KEY_EXPIRY_YEARS);\n\n cert.setSubject(CERT_SUBJECT);\n cert.setIssuer(CERT_SUBJECT);\n\n cert.setExtensions([\n {\n name: 'basicConstraints',\n cA: true,\n critical: true,\n },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n keyCertSign: true,\n cRLSign: true,\n critical: true,\n },\n {\n name: 'extKeyUsage',\n serverAuth: true,\n clientAuth: true,\n },\n {\n name: 'subjectKeyIdentifier',\n },\n {\n name: 'authorityKeyIdentifier',\n keyIdentifier: true,\n authorityCertIssuer: true,\n authorityCertSerialNumber: cert.serialNumber,\n },\n ]);\n\n cert.sign(keys.privateKey, md.sha256.create());\n\n const pem = pki.certificateToPem(cert);\n const key = pki.privateKeyToPem(keys.privateKey);\n return { cert: pem, key };\n }\n\n private async createContainer(\n jobId: string,\n jobToken: string,\n dependabotApiUrl: string,\n containerName: string,\n externalNetwork: Network,\n internalNetwork: Network,\n internalNetworkName: string,\n ): Promise<Container> {\n const container = await this.docker.createContainer({\n Image: this.proxyImage,\n name: containerName,\n AttachStdout: true,\n AttachStderr: true,\n Env: [\n `http_proxy=${process.env.http_proxy || process.env.HTTP_PROXY || ''}`,\n `https_proxy=${process.env.https_proxy || process.env.HTTPS_PROXY || ''}`,\n `no_proxy=${process.env.no_proxy || process.env.NO_PROXY || ''}`,\n `JOB_ID=${jobId}`,\n `JOB_TOKEN=${jobToken}`,\n `PROXY_CACHE=${this.cachedMode ? 'true' : 'false'}`,\n `DEPENDABOT_API_URL=${dependabotApiUrl}`,\n `ACTIONS_ID_TOKEN_REQUEST_TOKEN=${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN || ''}`,\n `ACTIONS_ID_TOKEN_REQUEST_URL=${process.env.ACTIONS_ID_TOKEN_REQUEST_URL || ''}`,\n ],\n Entrypoint: ['sh', '-c', '/usr/sbin/update-ca-certificates && /dependabot-proxy'],\n\n HostConfig: {\n NetworkMode: internalNetworkName,\n ExtraHosts: ['host.docker.internal:host-gateway'], // needed for Docker on Linux\n },\n });\n\n await externalNetwork.connect({ Container: container.id });\n\n logger.info(`Created proxy container: ${container.id}`);\n return container;\n }\n\n private customCAPath(): string | undefined {\n if ('CUSTOM_CA_PATH' in process.env) {\n return process.env.CUSTOM_CA_PATH;\n }\n // default to node.js configuration\n return process.env.NODE_EXTRA_CA_CERTS;\n }\n}\n","","// biome-ignore-all lint/suspicious/noShadowRestrictedNames: Proxy is okay\n\nimport type { FileFetcherInput, FileUpdaterInput } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type Docker from 'dockerode';\nimport type { Container } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport type { JobParameters } from './params';\nimport type { Proxy } from './proxy';\nimport { extractUpdaterSha } from './utils';\n\nexport const JOB_INPUT_FILENAME = 'job.json';\nexport const JOB_INPUT_PATH = `/home/dependabot/dependabot-updater`;\nexport const REPO_CONTENTS_PATH = '/home/dependabot/dependabot-updater/repo';\nexport const CA_CERT_INPUT_PATH = '/usr/local/share/ca-certificates';\nexport const CA_CERT_FILENAME = 'dbot-ca.crt';\nconst UPDATER_MAX_MEMORY = 8 * 1024 * 1024 * 1024; // 8GB in bytes\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class UpdaterBuilder {\n constructor(\n private readonly docker: Docker,\n private readonly jobParams: JobParameters,\n private readonly input: FileFetcherInput | FileUpdaterInput,\n private readonly proxy: Proxy,\n\n private readonly updaterImage: string,\n ) {}\n\n async run(containerName: string): Promise<Container> {\n const proxyUrl = await this.proxy.url();\n const updaterSha = extractUpdaterSha(this.updaterImage);\n\n const envVars = [\n `GITHUB_ACTIONS=${process.env.GITHUB_ACTIONS}`,\n `DEPENDABOT_JOB_ID=${this.jobParams.jobId}`,\n `DEPENDABOT_JOB_TOKEN=`,\n `DEPENDABOT_JOB_PATH=${JOB_INPUT_PATH}/${JOB_INPUT_FILENAME}`,\n `DEPENDABOT_OPEN_TIMEOUT_IN_SECONDS=15`,\n `DEPENDABOT_REPO_CONTENTS_PATH=${REPO_CONTENTS_PATH}`,\n `DEPENDABOT_API_URL=${this.jobParams.dependabotApiDockerUrl}`,\n `SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt`,\n `http_proxy=${proxyUrl}`,\n `HTTP_PROXY=${proxyUrl}`,\n `https_proxy=${proxyUrl}`,\n `HTTPS_PROXY=${proxyUrl}`,\n `ENABLE_CONNECTIVITY_CHECK=${process.env.DEPENDABOT_ENABLE_CONNECTIVITY_CHECK || '1'}`,\n\n // for updates relying on .NET (e.g. NuGet) and running on macOS (e.g. dev laptop or local MacMini),\n // we need to disable WriteXorExecute to avoid issues with emulation of Linux containers on macOS hosts\n // with Apple Silicon (M1/M2) chips\n // See - https://github.com/dotnet/runtime/issues/103063#issuecomment-2149599940\n // - https://github.com/dependabot/dependabot-core/issues/5037\n ...(process.platform === 'darwin' ? [`DOTNET_EnableWriteXorExecute=0`] : []),\n ];\n\n // Add DEPENDABOT_UPDATER_SHA if we successfully extracted a SHA\n if (updaterSha !== null) {\n envVars.push(`DEPENDABOT_UPDATER_SHA=${updaterSha}`);\n }\n\n const container = await this.docker.createContainer({\n Image: this.updaterImage,\n name: containerName,\n AttachStdout: true,\n AttachStderr: true,\n User: 'dependabot',\n Env: envVars,\n Cmd: ['/bin/sh'],\n Tty: true,\n HostConfig: {\n Memory: UPDATER_MAX_MEMORY,\n NetworkMode: this.proxy.networkName,\n },\n });\n\n await ContainerService.storeCert(CA_CERT_FILENAME, CA_CERT_INPUT_PATH, container, this.proxy.cert);\n\n await ContainerService.storeInput(JOB_INPUT_FILENAME, JOB_INPUT_PATH, container, this.input);\n\n logger.info(`Created container: ${container.id}`);\n return container;\n }\n}\n","// biome-ignore-all lint/suspicious/noShadowRestrictedNames: Proxy is okay\n\nimport type {\n DependabotCredential,\n DependabotJobConfig,\n FileFetcherInput,\n FileUpdaterInput,\n} from '@paklo/core/dependabot';\nimport Docker, { type Container } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport type { JobParameters } from './params';\nimport { type Proxy, ProxyBuilder } from './proxy';\nimport { UpdaterBuilder } from './updater-builder';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class Updater {\n docker: Docker;\n\n constructor(\n private readonly updaterImage: string,\n private readonly proxyImage: string,\n private readonly params: JobParameters,\n private readonly job: DependabotJobConfig,\n private readonly credentials: DependabotCredential[],\n private readonly debug: boolean,\n ) {\n this.docker = new Docker();\n this.job['credentials-metadata'] = this.generateCredentialsMetadata();\n }\n\n /**\n * Execute an update job and report the result to Dependabot API.\n */\n async runUpdater(): Promise<boolean> {\n const cachedMode = Object.hasOwn(this.job.experiments, 'proxy-cached') === true;\n\n const proxyBuilder = new ProxyBuilder(this.docker, this.proxyImage, cachedMode, this.debug);\n\n const proxy = await proxyBuilder.run(\n this.params.jobId,\n this.params.jobToken,\n this.params.dependabotApiUrl,\n this.credentials,\n );\n await proxy.container.start();\n\n try {\n await this.runUpdate(proxy);\n return true;\n } finally {\n await this.cleanup(proxy);\n }\n }\n\n private generateCredentialsMetadata(): DependabotCredential[] {\n const unique: Set<string> = new Set();\n const result: DependabotCredential[] = [];\n for (const credential of this.credentials) {\n if (credential.type === 'jit_access') {\n continue;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: necessary\n const obj: any = { type: credential.type };\n if (credential.host !== undefined) {\n obj.host = credential.host;\n }\n if (credential.registry !== undefined) {\n obj.registry = credential.registry;\n }\n if (credential.url !== undefined) {\n obj.url = credential.url;\n }\n this.setRegistryFromUrl(obj, credential);\n if (credential['index-url'] !== undefined) {\n obj['index-url'] = credential['index-url'];\n }\n this.setIndexUrlFromUrl(obj, credential);\n if (credential['env-key'] !== undefined) {\n obj['env-key'] = credential['env-key'];\n }\n if (credential.organization !== undefined) {\n obj.organization = credential.organization;\n }\n if (credential['replaces-base'] !== undefined) {\n obj['replaces-base'] = credential['replaces-base'];\n }\n if (credential['public-key-fingerprint'] !== undefined) {\n obj['public-key-fingerprint'] = credential['public-key-fingerprint'];\n }\n if (credential.repo !== undefined) {\n obj.repo = credential.repo;\n }\n const key = JSON.stringify(obj);\n if (!unique.has(key)) {\n unique.add(key);\n result.push(obj as DependabotCredential);\n }\n }\n return result;\n }\n\n private setRegistryFromUrl(obj: DependabotCredential, credential: DependabotCredential): void {\n const typesThatUseRegistryAsHost = ['npm_registry', 'composer_repository', 'docker_registry'];\n\n if (!typesThatUseRegistryAsHost.includes(credential.type)) {\n return;\n }\n\n if (!credential.registry && credential.url) {\n try {\n const parsedURL = new URL(credential.url);\n obj.registry = parsedURL.hostname;\n if (credential.type === 'npm_registry') {\n obj.registry += parsedURL.pathname;\n }\n } catch {\n // If the URL is invalid, we skip setting the registry\n // as it will fall back to the default registry for the given type (e.g., npm, Docker, or Composer).\n }\n }\n }\n\n private setIndexUrlFromUrl(obj: DependabotCredential, credential: DependabotCredential): void {\n if (credential.type !== 'python_index') {\n return;\n }\n if (credential['index-url']) {\n return;\n }\n if (credential.url) {\n try {\n obj['index-url'] = credential.url;\n } catch {\n // If the URL is invalid, we skip setting the index-url\n // as it will fall back to the default index URL for pip.\n }\n }\n }\n\n private async runUpdate(proxy: Proxy): Promise<void> {\n const name = `dependabot-job-${this.params.jobId}`;\n const container = await this.createContainer(proxy, name, {\n job: this.job,\n });\n\n await ContainerService.run(container, this.job.command);\n }\n\n private async createContainer(\n proxy: Proxy,\n containerName: string,\n input: FileFetcherInput | FileUpdaterInput,\n ): Promise<Container> {\n const builder = new UpdaterBuilder(this.docker, this.params, input, proxy, this.updaterImage);\n return builder.run(containerName);\n }\n\n private async cleanup(proxy: Proxy): Promise<void> {\n await proxy.shutdown();\n }\n}\n","import crypto from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport { logger } from '@paklo/core/logger';\nimport type { UsageTelemetryRequestData } from '@paklo/core/usage';\nimport ky from 'ky';\nimport { z } from 'zod';\n\nimport packageJson from '../package.json';\nimport { ApiClient, CredentialFetchingError, type SecretMasker } from './api-client';\nimport { PROXY_IMAGE_NAME, updaterImageName } from './docker-tags';\nimport { ImageService, type MetricReporter } from './image-service';\nimport { getJobParameters } from './params';\nimport { Updater } from './updater';\n\nexport class JobRunnerImagingError extends Error {}\nexport class JobRunnerUpdaterError extends Error {}\n\nexport type RunJobOptions = {\n dependabotApiUrl: string;\n dependabotApiDockerUrl?: string;\n jobId: string;\n jobToken: string;\n credentialsToken: string;\n updaterImage?: string;\n secretMasker: SecretMasker;\n debug: boolean;\n usage: Pick<UsageTelemetryRequestData, 'trigger' | 'provider' | 'owner' | 'project' | 'package-manager'>;\n};\nexport type RunJobResult = { success: true; message?: string } | { success: false; message: string };\n\nexport async function runJob(options: RunJobOptions): Promise<RunJobResult> {\n const { jobId, dependabotApiUrl, dependabotApiDockerUrl, jobToken, credentialsToken, secretMasker, debug, usage } =\n options;\n\n const started = new Date();\n let success = false;\n let message: string | undefined;\n try {\n const params = getJobParameters({\n jobId,\n jobToken,\n credentialsToken,\n dependabotApiUrl,\n dependabotApiDockerUrl: dependabotApiDockerUrl ?? dependabotApiUrl,\n updaterImage: options.updaterImage,\n })!;\n\n const client = ky.create({ headers: { 'User-Agent': `paklo-runner/${packageJson.version}` } });\n const apiClient = new ApiClient(client, params, jobToken, credentialsToken, secretMasker);\n\n // If we fail to succeed in fetching the job details, we cannot be sure the job has entered a 'processing' state,\n // so we do not try attempt to report back an exception if this fails and instead rely on the workflow run\n // webhook as it anticipates scenarios where jobs have failed while 'enqueued'.\n const job = await apiClient.getJobDetails();\n\n // The params can specify which updater image to use. If it doesn't, fall back to the pinned version.\n const updaterImage = params.updaterImage || updaterImageName(job['package-manager']);\n\n // The sendMetrics function is used to send metrics to the API client.\n // It uses the package manager as a tag to identify the metric.\n const sendMetricsWithPackageManager: MetricReporter = async (name, metricType, value, additionalTags = {}) => {\n try {\n await apiClient.sendMetrics(name, metricType, value, {\n package_manager: job['package-manager'],\n ...additionalTags,\n });\n } catch (error) {\n logger.warn(`Metric sending failed for ${name}: ${(error as Error).message}`);\n }\n };\n\n const credentials = (await apiClient.getCredentials()) || [];\n\n const updater = new Updater(updaterImage, PROXY_IMAGE_NAME, params, job, credentials, debug);\n\n try {\n // Using sendMetricsWithPackageManager wrapper to inject package manager tag to\n // avoid passing additional parameters to ImageService.pull method\n await ImageService.pull(updaterImage, sendMetricsWithPackageManager);\n await ImageService.pull(PROXY_IMAGE_NAME, sendMetricsWithPackageManager);\n } catch (err: unknown) {\n if (err instanceof Error) {\n throw new JobRunnerImagingError(err.message);\n }\n }\n\n try {\n await updater.runUpdater();\n } catch (err: unknown) {\n if (err instanceof Error) {\n throw new JobRunnerUpdaterError(err.message);\n }\n }\n success = true;\n } catch (err) {\n if (err instanceof JobRunnerImagingError) {\n message = `Error fetching updater images: ${err.message}`;\n } else if (err instanceof JobRunnerUpdaterError) {\n message = `Error running updater: ${err.message}`;\n } else if (err instanceof CredentialFetchingError) {\n message = `Dependabot was unable to retrieve job credentials: ${err.message}`;\n } else {\n message = `Unknown error: ${(err as Error).message}`;\n }\n }\n\n // send usage telemetry, unless explicitly disabled\n const telemetryDisabled = z.stringbool().optional().parse(process.env.PAKLO_TELEMETRY_DISABLED);\n if (!telemetryDisabled) {\n // detect if we are running inside a Docker container\n const inDocker = await isRunningInDocker();\n const duration = Date.now() - started.getTime();\n const data: UsageTelemetryRequestData = {\n ...usage,\n host: {\n platform: os.platform(),\n release: os.release(),\n arch: os.arch(),\n 'machine-hash': crypto.createHash('sha256').update(os.hostname()).digest('hex'),\n 'docker-container': inDocker,\n },\n version: packageJson.version,\n id: jobId,\n started,\n duration,\n success,\n // error message but truncate to first 1000 characters to avoid sending too much data\n error: message ? { message: message.substring(0, 1000) } : undefined,\n };\n try {\n const json = JSON.stringify(data);\n logger.debug(`Usage telemetry data: ${json}`);\n const resp = await ky.post('https://www.paklo.app/api/usage-telemetry', {\n headers: { 'Content-Type': 'application/json' },\n body: json,\n });\n if (!resp.ok) {\n logger.debug(`Failed to send usage telemetry data: ${resp.status} ${resp.statusText}`);\n }\n } catch (err) {\n logger.debug(`Failed to send usage telemetry data: ${(err as Error).message}`);\n // ignore\n }\n } else {\n logger.debug('Telemetry disabled, not sending usage telemetry data');\n }\n\n logger.info(`Update job ${jobId} completed`);\n return { success, message: message! };\n}\n\n/**\n * Detects if the current process is running inside a Docker container.\n */\nexport async function isRunningInDocker(): Promise<boolean> {\n // Check for .dockerenv file\n if (existsSync('/.dockerenv')) return true;\n\n // Check cgroup\n try {\n const cgroup = await readFile('/proc/self/cgroup', 'utf8');\n return cgroup.includes('docker') || cgroup.includes('kubepods');\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"run-_JPMNsMy.mjs","names":["dockerContainerConfig.proxy","dockerContainerConfig","CA_CERT_INPUT_PATH","packageJson.version"],"sources":["../src/api-client.ts","../docker/containers.json","../src/docker-tags.ts","../src/utils.ts","../src/container-service.ts","../src/image-service.ts","../src/params.ts","../src/proxy.ts","../package.json","../src/updater-builder.ts","../src/updater.ts","../src/run.ts"],"sourcesContent":["import type {\n DependabotCredential,\n DependabotJobConfig,\n DependabotMetric,\n DependabotRecordUpdateJobError,\n} from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport { isHTTPError, type KyInstance, type KyResponse } from 'ky';\nimport type { JobParameters } from './params';\n\nexport class JobDetailsFetchingError extends Error {}\nexport class CredentialFetchingError extends Error {}\nexport type SecretMasker = (value: string) => void;\n\nexport class ApiClient {\n private dependabotApiUrl: string;\n private jobToken: string;\n constructor(\n private readonly client: KyInstance,\n readonly params: JobParameters,\n jobToken: string,\n private readonly credentialsToken: string,\n private readonly secretMasker: SecretMasker,\n ) {\n // if dependabotApiUrl contains \"host.docker.internal\", we need to replace it with \"localhost\" for local calls\n const baseUrl = params.dependabotApiUrl.replace('host.docker.internal', 'localhost');\n this.dependabotApiUrl = baseUrl;\n this.jobToken = jobToken;\n }\n\n // We use a static unknown SHA when marking a job as complete from the action\n // to remain in parity with the existing runner.\n UnknownSha = {\n 'base-commit-sha': 'unknown',\n };\n\n // Getter for jobToken\n getJobToken(): string {\n return this.jobToken;\n }\n\n async getJobDetails(): Promise<DependabotJobConfig> {\n const detailsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/details`;\n try {\n const res = await this.getWithRetry<DependabotJobConfig>(detailsURL, this.jobToken);\n if (res.status !== 200) {\n throw new JobDetailsFetchingError(\n `fetching job details: unexpected status code: ${res.status}: ${JSON.stringify(await res.json())}`,\n );\n }\n const data = await res.json();\n if (!data) {\n throw new JobDetailsFetchingError(`fetching job details: missing response`);\n }\n\n return data;\n } catch (error) {\n if (error instanceof JobDetailsFetchingError) {\n throw error;\n } else if (isHTTPError(error)) {\n throw new JobDetailsFetchingError(\n `fetching job details: unexpected status code: ${error.response.status}: ${error.message}`,\n );\n } else if (error instanceof Error) {\n throw new JobDetailsFetchingError(`fetching job details: ${error.name}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async getCredentials(): Promise<DependabotCredential[]> {\n const credentialsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/credentials`;\n try {\n const res = await this.getWithRetry<DependabotCredential[]>(credentialsURL, this.credentialsToken);\n\n if (res.status !== 200) {\n throw new CredentialFetchingError(\n `fetching credentials: unexpected status code: ${res.status}: ${JSON.stringify(await res.json())}`,\n );\n }\n const data = await res.json();\n if (!data) {\n throw new CredentialFetchingError(`fetching credentials: missing response`);\n }\n\n // Mask any secrets we've just retrieved from environment logs\n for (const credential of data) {\n if (credential.password) {\n this.secretMasker(credential.password);\n }\n if (credential.token) {\n this.secretMasker(credential.token);\n }\n if (credential['auth-key']) {\n this.secretMasker(credential['auth-key']);\n }\n }\n\n return data;\n } catch (error: unknown) {\n if (error instanceof CredentialFetchingError) {\n throw error;\n } else if (isHTTPError(error)) {\n throw new CredentialFetchingError(\n `fetching credentials: unexpected status code: ${error.response.status}: ${error.message}`,\n );\n } else if (error instanceof Error) {\n throw new CredentialFetchingError(`fetching credentials: ${error.name}: ${error.message}`);\n }\n throw error;\n }\n }\n\n async reportJobError(error: DependabotRecordUpdateJobError): Promise<void> {\n const recordErrorURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/record_update_job_error`;\n const res = await this.client.post(recordErrorURL, {\n json: error,\n headers: { Authorization: this.jobToken },\n });\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n async markJobAsProcessed(): Promise<void> {\n const markAsProcessedURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/mark_as_processed`;\n const res = await this.client.patch(markAsProcessedURL, {\n json: this.UnknownSha,\n headers: { Authorization: this.jobToken },\n });\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n async sendMetrics(\n name: string,\n metricType: 'increment' | 'gauge',\n value: number,\n additionalTags: Record<string, string> = {},\n ): Promise<void> {\n try {\n await this.reportMetrics([\n {\n metric: `dependabot.action.${name}`,\n type: metricType,\n value,\n tags: additionalTags,\n },\n ]);\n logger.info(`Successfully sent metric (dependabot.action.${name}) to remote API endpoint`);\n } catch (error) {\n // metrics should typically not cause critical path failure so we log the\n // failure and continue with the job\n logger.warn(`Metrics reporting failed: ${(error as Error).message}`);\n }\n }\n\n async reportMetrics(metrics: DependabotMetric[]): Promise<void> {\n const metricsURL = `${this.dependabotApiUrl}/update_jobs/${this.params.jobId}/record_metrics`;\n const res = await this.client.post(metricsURL, {\n json: { data: metrics },\n headers: { Authorization: this.jobToken },\n });\n\n if (res.status !== 204) {\n throw new Error(`Unexpected status code: ${res.status}`);\n }\n }\n\n private async getWithRetry<T>(url: string, token: string, options?: RequestInit): Promise<KyResponse<T>> {\n const execute = async (): Promise<KyResponse<T>> => {\n const res = await this.client.get<T>(url, {\n headers: { Authorization: token },\n retry: {\n limit: 3,\n // other default options are sufficient:\n // https://github.com/sindresorhus/ky#retry\n // delay: attemptCount => 0.3 * (2 ** (attemptCount - 1)) * 1000\n // statusCodes: 408 413 429 500 502 503 504\n // afterStatusCodes: 413, 429, 503\n },\n hooks: {\n beforeRetry: [\n async ({ request, options, error, retryCount }) => {\n if (isHTTPError(error)) {\n logger.warn(`Retrying failed request with status code: ${error.response.status}`);\n }\n },\n ],\n },\n ...options,\n });\n\n return res;\n };\n\n return execute();\n }\n}\n","","import dockerContainerConfig from '../docker/containers.json';\n\nexport const PROXY_IMAGE_NAME = dockerContainerConfig.proxy;\n\nexport function updaterImageName(packageManager: string): string {\n return dockerContainerConfig[packageManager as keyof typeof dockerContainerConfig];\n}\n\nconst updaterRegex = /ghcr.io\\/dependabot\\/dependabot-updater-([\\w+])/;\n\nexport function updaterImages(): string[] {\n return Object.values(dockerContainerConfig).filter((image) => image.match(updaterRegex));\n}\n\nconst imageNamePattern =\n '^(?<repository>(([a-zA-Z0-9._-]+([:[0-9]+[^/]))?([a-zA-Z0-9._/-]+)?))(:[a-zA-Z0-9._/-]+)?(?<digest>@sha256:[a-zA-Z0-9]{64})?$';\n\nexport function repositoryName(imageName: string): string {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n return match.groups.repository!;\n } else {\n throw Error('invalid image name');\n }\n}\n\nexport function hasDigest(imageName: string): boolean {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n if (match?.groups.digest) {\n return true;\n }\n return false;\n } else {\n throw Error('invalid image name');\n }\n}\n\nexport function digestName(imageName: string): string {\n const match = imageName.match(imageNamePattern);\n\n if (match?.groups) {\n return match.groups.repository! + match.groups.digest;\n } else {\n throw Error('invalid image name');\n }\n}\n","import stream, { type Writable } from 'node:stream';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport const nullStream: Writable = new stream.Writable({ write: (__, _, next) => next() });\n\nexport const outStream = (prefix: string): Writable => {\n return new stream.Writable({\n write(chunk, _, next) {\n process.stdout.write(`${prefix} | ${chunk.toString()}`);\n next();\n },\n });\n};\n\nexport const errStream = (prefix: string): Writable => {\n return new stream.Writable({\n write(chunk, _, next) {\n process.stderr.write(`${prefix} | ${chunk.toString()}`);\n next();\n },\n });\n};\n\n/**\n * Extracts the SHA from an updater image string.\n * @param updaterImage - Image string in the format \"image:sha\" or \"registry/image:sha\"\n * @returns The SHA part after the last colon, or null if no colon is found\n */\nexport const extractUpdaterSha = (updaterImage: string): string | null => {\n const match = updaterImage.match(/:([^:]*)$/);\n return match ? match[1]! : null;\n};\n","import type { DependabotProxyConfig, FileFetcherInput, FileUpdaterInput } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type { Container } from 'dockerode';\nimport { pack } from 'tar-stream';\nimport { errStream, outStream } from './utils';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class ContainerRuntimeError extends Error {}\n\nconst RWX_ALL = 0o777;\n\nexport const ContainerService = {\n async storeInput(\n name: string,\n path: string,\n container: Container,\n input: FileFetcherInput | FileUpdaterInput | DependabotProxyConfig,\n ): Promise<void> {\n const tar = pack();\n tar.entry({ name, mode: RWX_ALL }, JSON.stringify(input));\n tar.finalize();\n await container.putArchive(tar, { path });\n },\n\n async storeCert(name: string, path: string, container: Container, cert: string): Promise<void> {\n const tar = pack();\n tar.entry({ name }, cert);\n tar.finalize();\n await container.putArchive(tar, { path });\n },\n\n async run(container: Container, command?: string): Promise<boolean> {\n try {\n // Start the container\n await container.start();\n logger.info(`Started container ${container.id}`);\n\n // Check if this is a dependabot container (has the expected structure)\n const containerInfo = await container.inspect();\n const isDependabotContainer = containerInfo.Config?.Env?.some((env) => env.startsWith('DEPENDABOT_JOB_ID='));\n\n if (isDependabotContainer) {\n // For dependabot containers, run CA certificates update as root first\n await this.execCommand(container, ['/usr/sbin/update-ca-certificates'], 'root');\n\n // Then run the dependabot commands as dependabot user\n const dependabotCommands = [\n 'mkdir -p /home/dependabot/dependabot-updater/output',\n // 'fetch_files' command removed as it is now a no-op\n ];\n\n if (command === 'graph') {\n dependabotCommands.push('$DEPENDABOT_HOME/dependabot-updater/bin/run update_graph');\n } else {\n dependabotCommands.push('$DEPENDABOT_HOME/dependabot-updater/bin/run update_files');\n }\n\n for (const cmd of dependabotCommands) {\n await this.execCommand(container, ['/bin/sh', '-c', cmd], 'dependabot');\n }\n } else {\n // For test containers and other containers, just wait for completion\n const outcome = await container.wait();\n if (outcome.StatusCode !== 0) {\n throw new Error(`Container exited with code ${outcome.StatusCode}`);\n }\n }\n\n return true;\n } catch (error) {\n logger.info(`Failure running container ${container.id}: ${error}`);\n throw new ContainerRuntimeError('The updater encountered one or more errors.');\n } finally {\n try {\n await container.remove({ v: true, force: true });\n logger.info(`Cleaned up container ${container.id}`);\n } catch (error) {\n logger.info(`Failed to clean up container ${container.id}: ${error}`);\n }\n }\n },\n\n async execCommand(container: Container, cmd: string[], user: string): Promise<void> {\n const exec = await container.exec({\n Cmd: cmd,\n User: user,\n AttachStdout: true,\n AttachStderr: true,\n });\n\n const stream = await exec.start({});\n\n // Wait for the stream to end\n await new Promise<void>((resolve, reject) => {\n container.modem.demuxStream(stream, outStream('updater'), errStream('updater'));\n\n stream.on('end', () => {\n resolve();\n });\n\n stream.on('error', (error) => {\n reject(error);\n });\n });\n\n // Wait a bit for the exec to complete properly\n await new Promise((resolve) => setTimeout(resolve, 100));\n\n const inspection = await exec.inspect();\n if (inspection.ExitCode !== 0) {\n throw new Error(`Command failed with exit code ${inspection.ExitCode}: ${cmd.join(' ')}`);\n }\n },\n};\n","import { Readable } from 'node:stream';\nimport { logger } from '@paklo/core/logger';\nimport Docker from 'dockerode';\n\nconst MAX_RETRIES = 5; // Maximum number of retries\nconst INITIAL_DELAY_MS = 5000; // Initial delay in milliseconds for backoff\n\n// Code below is borrowed and adapted from dependabot-action\n\nconst sleep = async (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms));\n\nconst endOfStream = async (docker: Docker, stream: Readable): Promise<void> => {\n return new Promise((resolve, reject) => {\n docker.modem.followProgress(stream, (err: Error | null) => (err ? reject(err) : resolve(undefined)));\n });\n};\n\nexport function getOrgFromImage(imageName: string): string {\n const parts = imageName.split('/');\n if (parts.length >= 3 && parts[0] === 'ghcr.io') {\n return parts[1]!; // The domain is always the second part\n }\n return 'unknown'; // Fallback case if structure is unexpected\n}\n\nexport type MetricReporter = (\n metricName: string,\n metricType: 'increment' | 'gauge',\n value: number,\n additionalTags?: Record<string, string>,\n) => Promise<void>;\n\n/** Fetch the configured updater image, if it isn't already available. */\nexport const ImageService = {\n async pull(imageName: string, sendMetric?: MetricReporter, force = false): Promise<void> {\n /*\n This method fetches images hosts on GitHub infrastructure.\n\n We expose the `fetch_image` utility method to allow us to pull in arbitrary images for unit tests.\n */\n if (!(imageName.startsWith('ghcr.io/') || imageName.startsWith('docker.pkg.github.com/'))) {\n throw new Error('Only images distributed via docker.pkg.github.com or ghcr.io can be fetched');\n }\n\n const docker = new Docker();\n const org = getOrgFromImage(imageName);\n try {\n const image = await docker.getImage(imageName).inspect();\n if (!force) {\n logger.info(`Resolved ${imageName} to existing ${image.RepoDigests}`);\n return;\n } // else fallthrough to pull\n } catch (e: unknown) {\n if (e instanceof Error && !e.message.includes('no such image')) {\n throw e;\n } // else fallthrough to pull\n }\n\n const auth = {}; // Images are public so not authentication info is required\n await this.fetchImageWithRetry(imageName, auth, docker, sendMetric, org);\n },\n\n /* Retrieve the image using the auth details provided, if any with retry and backoff */\n async fetchImageWithRetry(\n imageName: string,\n auth = {},\n docker = new Docker(),\n sendMetric: MetricReporter | undefined,\n org: string,\n ): Promise<void> {\n let attempt = 0;\n\n while (attempt < MAX_RETRIES) {\n try {\n logger.info(`Pulling image ${imageName} (attempt ${attempt + 1})...`);\n /* To avoid sending metrics during unit tests (fetch_image) */\n if (sendMetric) {\n await sendMetric('ghcr_image_pull', 'increment', 1, {\n org,\n });\n }\n const stream = await docker.pull(imageName, { authconfig: auth });\n await endOfStream(docker, new Readable().wrap(stream));\n logger.info(`Pulled image ${imageName}`);\n return; // Exit on success\n } catch (error) {\n if (!(error instanceof Error)) throw error; // Ensure error is an instance of Error\n\n // Handle 429 Too Many Requests separately\n if (\n error.message.includes('429 Too Many Requests') ||\n error.message.toLowerCase().includes('too many requests')\n ) {\n attempt++; // Only increment attempt on 429\n if (attempt >= MAX_RETRIES) {\n logger.error(`Failed to pull image ${imageName} after ${MAX_RETRIES} attempts.`);\n throw error;\n }\n\n // Add jitter to avoid synchronization issues\n // biome-ignore lint/style/useExponentiationOperator: This is clearer for now\n const baseDelay = INITIAL_DELAY_MS * Math.pow(2, attempt);\n const jitter = Math.random() * baseDelay;\n const delay = baseDelay / 2 + jitter;\n\n logger.warn(`Received Too Many Requests error. Retrying in ${(delay / 1000).toFixed(2)} seconds...`);\n await sleep(delay);\n } else {\n // Non-429 errors should NOT be retried\n logger.error(`Fatal error pulling image ${imageName}: ${error.message}`);\n throw error; // Exit immediately\n }\n }\n }\n },\n};\n","// Code below is borrowed and adapted from dependabot-action\n\n/*\n `jobId` is intentionally a string even though we copied from code that used number\n We generate the job identifiers using Snowflake which produces bigint\n and bigint cannot be serialized to JSON, so we use string everywhere instead.\n The hosted dependabot possible uses auto-incrementing numbers for jobIds in their database,\n but not all databases support this.\n*/\n\nexport class JobParameters {\n constructor(\n readonly jobId: string,\n readonly jobToken: string,\n readonly credentialsToken: string,\n readonly dependabotApiUrl: string,\n readonly dependabotApiDockerUrl: string,\n readonly updaterImage: string,\n ) {}\n}\n\nexport function getJobParameters(input: {\n jobId?: string;\n jobToken?: string;\n credentialsToken?: string;\n dependabotApiUrl?: string;\n dependabotApiDockerUrl?: string;\n updaterImage?: string;\n}): JobParameters | null {\n return new JobParameters(\n input.jobId as string,\n input.jobToken as string,\n input.credentialsToken as string,\n input.dependabotApiUrl as string,\n input.dependabotApiDockerUrl as string,\n input.updaterImage as string,\n );\n}\n","import { readFile } from 'node:fs/promises';\nimport type { CertificateAuthority, DependabotCredential, DependabotProxyConfig } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type Docker from 'dockerode';\nimport type { Container, Network } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport { errStream, nullStream, outStream } from './utils';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport type Proxy = {\n container: Container;\n network: Network;\n networkName: string;\n url: () => Promise<string>;\n cert: string;\n shutdown: () => Promise<void>;\n};\n\nconst KEY_SIZE = 2048;\nconst KEY_EXPIRY_YEARS = 2;\nconst CONFIG_FILE_PATH = '/';\nexport const CONFIG_FILE_NAME = 'config.json';\nconst CA_CERT_INPUT_PATH = '/usr/local/share/ca-certificates';\nconst CUSTOM_CA_CERT_NAME = 'custom-ca-cert.crt';\nconst CERT_SUBJECT = [\n { name: 'commonName', value: 'Dependabot Internal CA' },\n { name: 'organizationName', value: 'GitHub Inc.' },\n { shortName: 'OU', value: 'Dependabot' },\n { name: 'countryName', value: 'US' },\n { shortName: 'ST', value: 'California' },\n { name: 'localityName', value: 'San Francisco' },\n];\n\nexport class ProxyBuilder {\n constructor(\n private readonly docker: Docker,\n private readonly proxyImage: string,\n private readonly cachedMode: boolean,\n private readonly debug: boolean,\n ) {}\n\n async run(\n jobId: string,\n jobToken: string,\n dependabotApiUrl: string,\n credentials: DependabotCredential[],\n ): Promise<Proxy> {\n const name = `dependabot-job-${jobId}-proxy`;\n const config = await this.buildProxyConfig(credentials);\n const cert = config.ca.cert;\n\n const externalNetworkName = `dependabot-job-${jobId}-external-network`;\n const externalNetwork = await this.ensureNetwork(externalNetworkName, false);\n\n const internalNetworkName = `dependabot-job-${jobId}-internal-network`;\n const internalNetwork = await this.ensureNetwork(internalNetworkName, true);\n\n const container = await this.createContainer(\n jobId,\n jobToken,\n dependabotApiUrl,\n name,\n externalNetwork,\n internalNetwork,\n internalNetworkName,\n );\n\n await ContainerService.storeInput(CONFIG_FILE_NAME, CONFIG_FILE_PATH, container, config);\n\n const customCAPath = this.customCAPath();\n if (customCAPath) {\n logger.info('Detected custom CA certificate, adding to proxy');\n\n const customCert = (await readFile(customCAPath, 'utf8')).toString();\n await ContainerService.storeCert(CUSTOM_CA_CERT_NAME, CA_CERT_INPUT_PATH, container, customCert);\n }\n\n const stream = await container.attach({\n stream: true,\n stdout: true,\n stderr: true,\n });\n container.modem.demuxStream(\n stream,\n // proxy generates lots of logs that we do not need unless debugging\n // this should save on disk space in agents running Azure pipelines\n this.debug ? outStream(' proxy') : nullStream,\n this.debug ? errStream(' proxy') : nullStream,\n );\n\n const url = async (): Promise<string> => {\n const containerInfo = await container.inspect();\n\n if (containerInfo.State.Running === true) {\n const ipAddress = containerInfo.NetworkSettings.Networks[`${internalNetworkName}`]!.IPAddress;\n return `http://${ipAddress}:1080`;\n } else {\n throw new Error(\"proxy container isn't running\");\n }\n };\n\n return {\n container,\n network: internalNetwork,\n networkName: internalNetworkName,\n url,\n cert,\n shutdown: async () => {\n await container.stop();\n await container.remove();\n await Promise.all([externalNetwork.remove(), internalNetwork.remove()]);\n },\n };\n }\n\n private async ensureNetwork(name: string, internal = true): Promise<Network> {\n const networks = await this.docker.listNetworks({\n filters: JSON.stringify({ name: [name] }),\n });\n if (networks.length > 0) {\n return this.docker.getNetwork(networks[0]!.Id);\n } else {\n return await this.docker.createNetwork({ Name: name, Internal: internal });\n }\n }\n\n private async buildProxyConfig(credentials: DependabotCredential[]): Promise<DependabotProxyConfig> {\n const ca = await ProxyBuilder.generateCertificateAuthority();\n\n const config: DependabotProxyConfig = { all_credentials: credentials, ca };\n\n return config;\n }\n\n public static async generateCertificateAuthority(): Promise<CertificateAuthority> {\n // node-forge is a CommonJS module, so we need to import it dynamically\n const {\n default: { md, pki },\n } = await import('node-forge');\n const keys = pki.rsa.generateKeyPair(KEY_SIZE);\n const cert = pki.createCertificate();\n\n cert.publicKey = keys.publicKey;\n cert.serialNumber = '01';\n cert.validity.notBefore = new Date();\n cert.validity.notAfter = new Date();\n cert.validity.notAfter.setFullYear(cert.validity.notBefore.getFullYear() + KEY_EXPIRY_YEARS);\n\n cert.setSubject(CERT_SUBJECT);\n cert.setIssuer(CERT_SUBJECT);\n\n cert.setExtensions([\n {\n name: 'basicConstraints',\n cA: true,\n critical: true,\n },\n {\n name: 'keyUsage',\n digitalSignature: true,\n keyEncipherment: true,\n keyCertSign: true,\n cRLSign: true,\n critical: true,\n },\n {\n name: 'extKeyUsage',\n serverAuth: true,\n clientAuth: true,\n },\n {\n name: 'subjectKeyIdentifier',\n },\n {\n name: 'authorityKeyIdentifier',\n keyIdentifier: true,\n authorityCertIssuer: true,\n authorityCertSerialNumber: cert.serialNumber,\n },\n ]);\n\n cert.sign(keys.privateKey, md.sha256.create());\n\n const pem = pki.certificateToPem(cert);\n const key = pki.privateKeyToPem(keys.privateKey);\n return { cert: pem, key };\n }\n\n private async createContainer(\n jobId: string,\n jobToken: string,\n dependabotApiUrl: string,\n containerName: string,\n externalNetwork: Network,\n internalNetwork: Network,\n internalNetworkName: string,\n ): Promise<Container> {\n const container = await this.docker.createContainer({\n Image: this.proxyImage,\n name: containerName,\n AttachStdout: true,\n AttachStderr: true,\n Env: [\n `http_proxy=${process.env.http_proxy || process.env.HTTP_PROXY || ''}`,\n `https_proxy=${process.env.https_proxy || process.env.HTTPS_PROXY || ''}`,\n `no_proxy=${process.env.no_proxy || process.env.NO_PROXY || ''}`,\n `JOB_ID=${jobId}`,\n `JOB_TOKEN=${jobToken}`,\n `PROXY_CACHE=${this.cachedMode ? 'true' : 'false'}`,\n `DEPENDABOT_API_URL=${dependabotApiUrl}`,\n `ACTIONS_ID_TOKEN_REQUEST_TOKEN=${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN || ''}`,\n `ACTIONS_ID_TOKEN_REQUEST_URL=${process.env.ACTIONS_ID_TOKEN_REQUEST_URL || ''}`,\n ],\n Entrypoint: ['sh', '-c', '/usr/sbin/update-ca-certificates && /dependabot-proxy'],\n\n HostConfig: {\n NetworkMode: internalNetworkName,\n ExtraHosts: ['host.docker.internal:host-gateway'], // needed for Docker on Linux\n },\n });\n\n await externalNetwork.connect({ Container: container.id });\n\n logger.info(`Created proxy container: ${container.id}`);\n return container;\n }\n\n private customCAPath(): string | undefined {\n if ('CUSTOM_CA_PATH' in process.env) {\n return process.env.CUSTOM_CA_PATH;\n }\n // default to node.js configuration\n return process.env.NODE_EXTRA_CA_CERTS;\n }\n}\n","","// biome-ignore-all lint/suspicious/noShadowRestrictedNames: Proxy is okay\n\nimport type { FileFetcherInput, FileUpdaterInput } from '@paklo/core/dependabot';\nimport { logger } from '@paklo/core/logger';\nimport type Docker from 'dockerode';\nimport type { Container } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport type { JobParameters } from './params';\nimport type { Proxy } from './proxy';\nimport { extractUpdaterSha } from './utils';\n\nexport const JOB_INPUT_FILENAME = 'job.json';\nexport const JOB_INPUT_PATH = `/home/dependabot/dependabot-updater`;\nexport const REPO_CONTENTS_PATH = '/home/dependabot/dependabot-updater/repo';\nexport const CA_CERT_INPUT_PATH = '/usr/local/share/ca-certificates';\nexport const CA_CERT_FILENAME = 'dbot-ca.crt';\nconst UPDATER_MAX_MEMORY = 8 * 1024 * 1024 * 1024; // 8GB in bytes\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class UpdaterBuilder {\n constructor(\n private readonly docker: Docker,\n private readonly jobParams: JobParameters,\n private readonly input: FileFetcherInput | FileUpdaterInput,\n private readonly proxy: Proxy,\n\n private readonly updaterImage: string,\n ) {}\n\n async run(containerName: string): Promise<Container> {\n const proxyUrl = await this.proxy.url();\n const updaterSha = extractUpdaterSha(this.updaterImage);\n\n const envVars = [\n `GITHUB_ACTIONS=${process.env.GITHUB_ACTIONS}`,\n `DEPENDABOT_JOB_ID=${this.jobParams.jobId}`,\n `DEPENDABOT_JOB_TOKEN=`,\n `DEPENDABOT_JOB_PATH=${JOB_INPUT_PATH}/${JOB_INPUT_FILENAME}`,\n `DEPENDABOT_OPEN_TIMEOUT_IN_SECONDS=15`,\n `DEPENDABOT_REPO_CONTENTS_PATH=${REPO_CONTENTS_PATH}`,\n `DEPENDABOT_API_URL=${this.jobParams.dependabotApiDockerUrl}`,\n `SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt`,\n `http_proxy=${proxyUrl}`,\n `HTTP_PROXY=${proxyUrl}`,\n `https_proxy=${proxyUrl}`,\n `HTTPS_PROXY=${proxyUrl}`,\n `ENABLE_CONNECTIVITY_CHECK=${process.env.DEPENDABOT_ENABLE_CONNECTIVITY_CHECK || '1'}`,\n\n // for updates relying on .NET (e.g. NuGet) and running on macOS (e.g. dev laptop or local MacMini),\n // we need to disable WriteXorExecute to avoid issues with emulation of Linux containers on macOS hosts\n // with Apple Silicon (M1/M2) chips\n // See - https://github.com/dotnet/runtime/issues/103063#issuecomment-2149599940\n // - https://github.com/dependabot/dependabot-core/issues/5037\n ...(process.platform === 'darwin' ? [`DOTNET_EnableWriteXorExecute=0`] : []),\n ];\n\n // Add DEPENDABOT_UPDATER_SHA if we successfully extracted a SHA\n if (updaterSha !== null) {\n envVars.push(`DEPENDABOT_UPDATER_SHA=${updaterSha}`);\n }\n\n const container = await this.docker.createContainer({\n Image: this.updaterImage,\n name: containerName,\n AttachStdout: true,\n AttachStderr: true,\n User: 'dependabot',\n Env: envVars,\n Cmd: ['/bin/sh'],\n Tty: true,\n HostConfig: {\n Memory: UPDATER_MAX_MEMORY,\n NetworkMode: this.proxy.networkName,\n },\n });\n\n await ContainerService.storeCert(CA_CERT_FILENAME, CA_CERT_INPUT_PATH, container, this.proxy.cert);\n\n await ContainerService.storeInput(JOB_INPUT_FILENAME, JOB_INPUT_PATH, container, this.input);\n\n logger.info(`Created container: ${container.id}`);\n return container;\n }\n}\n","// biome-ignore-all lint/suspicious/noShadowRestrictedNames: Proxy is okay\n\nimport type {\n DependabotCredential,\n DependabotJobConfig,\n FileFetcherInput,\n FileUpdaterInput,\n} from '@paklo/core/dependabot';\nimport Docker, { type Container } from 'dockerode';\nimport { ContainerService } from './container-service';\nimport type { JobParameters } from './params';\nimport { type Proxy, ProxyBuilder } from './proxy';\nimport { UpdaterBuilder } from './updater-builder';\n\n// Code below is borrowed and adapted from dependabot-action\n\nexport class Updater {\n docker: Docker;\n\n constructor(\n private readonly updaterImage: string,\n private readonly proxyImage: string,\n private readonly params: JobParameters,\n private readonly job: DependabotJobConfig,\n private readonly credentials: DependabotCredential[],\n private readonly debug: boolean,\n ) {\n this.docker = new Docker();\n this.job['credentials-metadata'] = this.generateCredentialsMetadata();\n }\n\n /**\n * Execute an update job and report the result to Dependabot API.\n */\n async runUpdater(): Promise<boolean> {\n const cachedMode = Object.hasOwn(this.job.experiments, 'proxy-cached') === true;\n\n const proxyBuilder = new ProxyBuilder(this.docker, this.proxyImage, cachedMode, this.debug);\n\n const proxy = await proxyBuilder.run(\n this.params.jobId,\n this.params.jobToken,\n this.params.dependabotApiUrl,\n this.credentials,\n );\n await proxy.container.start();\n\n try {\n await this.runUpdate(proxy);\n return true;\n } finally {\n await this.cleanup(proxy);\n }\n }\n\n private generateCredentialsMetadata(): DependabotCredential[] {\n const unique: Set<string> = new Set();\n const result: DependabotCredential[] = [];\n for (const credential of this.credentials) {\n if (credential.type === 'jit_access') {\n continue;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: necessary\n const obj: any = { type: credential.type };\n if (credential.host !== undefined) {\n obj.host = credential.host;\n }\n if (credential.registry !== undefined) {\n obj.registry = credential.registry;\n }\n if (credential.url !== undefined) {\n obj.url = credential.url;\n }\n this.setRegistryFromUrl(obj, credential);\n if (credential['index-url'] !== undefined) {\n obj['index-url'] = credential['index-url'];\n }\n this.setIndexUrlFromUrl(obj, credential);\n if (credential['env-key'] !== undefined) {\n obj['env-key'] = credential['env-key'];\n }\n if (credential.organization !== undefined) {\n obj.organization = credential.organization;\n }\n if (credential['replaces-base'] !== undefined) {\n obj['replaces-base'] = credential['replaces-base'];\n }\n if (credential['public-key-fingerprint'] !== undefined) {\n obj['public-key-fingerprint'] = credential['public-key-fingerprint'];\n }\n if (credential.repo !== undefined) {\n obj.repo = credential.repo;\n }\n const key = JSON.stringify(obj);\n if (!unique.has(key)) {\n unique.add(key);\n result.push(obj as DependabotCredential);\n }\n }\n return result;\n }\n\n private setRegistryFromUrl(obj: DependabotCredential, credential: DependabotCredential): void {\n const typesThatUseRegistryAsHost = ['npm_registry', 'composer_repository', 'docker_registry'];\n\n if (!typesThatUseRegistryAsHost.includes(credential.type)) {\n return;\n }\n\n if (!credential.registry && credential.url) {\n try {\n const parsedURL = new URL(credential.url);\n obj.registry = parsedURL.hostname;\n if (credential.type === 'npm_registry') {\n obj.registry += parsedURL.pathname;\n }\n } catch {\n // If the URL is invalid, we skip setting the registry\n // as it will fall back to the default registry for the given type (e.g., npm, Docker, or Composer).\n }\n }\n }\n\n private setIndexUrlFromUrl(obj: DependabotCredential, credential: DependabotCredential): void {\n if (credential.type !== 'python_index') {\n return;\n }\n if (credential['index-url']) {\n return;\n }\n if (credential.url) {\n try {\n obj['index-url'] = credential.url;\n } catch {\n // If the URL is invalid, we skip setting the index-url\n // as it will fall back to the default index URL for pip.\n }\n }\n }\n\n private async runUpdate(proxy: Proxy): Promise<void> {\n const name = `dependabot-job-${this.params.jobId}`;\n const container = await this.createContainer(proxy, name, {\n job: this.job,\n });\n\n await ContainerService.run(container, this.job.command);\n }\n\n private async createContainer(\n proxy: Proxy,\n containerName: string,\n input: FileFetcherInput | FileUpdaterInput,\n ): Promise<Container> {\n const builder = new UpdaterBuilder(this.docker, this.params, input, proxy, this.updaterImage);\n return builder.run(containerName);\n }\n\n private async cleanup(proxy: Proxy): Promise<void> {\n await proxy.shutdown();\n }\n}\n","import crypto from 'node:crypto';\nimport { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport os from 'node:os';\nimport { logger } from '@paklo/core/logger';\nimport type { UsageTelemetryRequestData } from '@paklo/core/usage';\nimport ky from 'ky';\nimport { z } from 'zod';\n\nimport packageJson from '../package.json';\nimport { ApiClient, CredentialFetchingError, type SecretMasker } from './api-client';\nimport { PROXY_IMAGE_NAME, updaterImageName } from './docker-tags';\nimport { ImageService, type MetricReporter } from './image-service';\nimport { getJobParameters } from './params';\nimport { Updater } from './updater';\n\nexport class JobRunnerImagingError extends Error {}\nexport class JobRunnerUpdaterError extends Error {}\n\nexport type RunJobOptions = {\n dependabotApiUrl: string;\n dependabotApiDockerUrl?: string;\n jobId: string;\n jobToken: string;\n credentialsToken: string;\n updaterImage?: string;\n secretMasker: SecretMasker;\n debug: boolean;\n usage: Pick<UsageTelemetryRequestData, 'trigger' | 'provider' | 'owner' | 'project' | 'package-manager'>;\n};\nexport type RunJobResult = { success: true; message?: string } | { success: false; message: string };\n\nexport async function runJob(options: RunJobOptions): Promise<RunJobResult> {\n const { jobId, dependabotApiUrl, dependabotApiDockerUrl, jobToken, credentialsToken, secretMasker, debug, usage } =\n options;\n\n const started = new Date();\n let success = false;\n let message: string | undefined;\n try {\n const params = getJobParameters({\n jobId,\n jobToken,\n credentialsToken,\n dependabotApiUrl,\n dependabotApiDockerUrl: dependabotApiDockerUrl ?? dependabotApiUrl,\n updaterImage: options.updaterImage,\n })!;\n\n const client = ky.create({ headers: { 'User-Agent': `paklo-runner/${packageJson.version}` } });\n const apiClient = new ApiClient(client, params, jobToken, credentialsToken, secretMasker);\n\n // If we fail to succeed in fetching the job details, we cannot be sure the job has entered a 'processing' state,\n // so we do not try attempt to report back an exception if this fails and instead rely on the workflow run\n // webhook as it anticipates scenarios where jobs have failed while 'enqueued'.\n const job = await apiClient.getJobDetails();\n\n // The params can specify which updater image to use. If it doesn't, fall back to the pinned version.\n const updaterImage = params.updaterImage || updaterImageName(job['package-manager']);\n\n // The sendMetrics function is used to send metrics to the API client.\n // It uses the package manager as a tag to identify the metric.\n const sendMetricsWithPackageManager: MetricReporter = async (name, metricType, value, additionalTags = {}) => {\n try {\n await apiClient.sendMetrics(name, metricType, value, {\n package_manager: job['package-manager'],\n ...additionalTags,\n });\n } catch (error) {\n logger.warn(`Metric sending failed for ${name}: ${(error as Error).message}`);\n }\n };\n\n const credentials = (await apiClient.getCredentials()) || [];\n\n const updater = new Updater(updaterImage, PROXY_IMAGE_NAME, params, job, credentials, debug);\n\n try {\n // Using sendMetricsWithPackageManager wrapper to inject package manager tag to\n // avoid passing additional parameters to ImageService.pull method\n await ImageService.pull(updaterImage, sendMetricsWithPackageManager);\n await ImageService.pull(PROXY_IMAGE_NAME, sendMetricsWithPackageManager);\n } catch (err: unknown) {\n if (err instanceof Error) {\n throw new JobRunnerImagingError(err.message);\n }\n }\n\n try {\n await updater.runUpdater();\n } catch (err: unknown) {\n if (err instanceof Error) {\n throw new JobRunnerUpdaterError(err.message);\n }\n }\n success = true;\n } catch (err) {\n if (err instanceof JobRunnerImagingError) {\n message = `Error fetching updater images: ${err.message}`;\n } else if (err instanceof JobRunnerUpdaterError) {\n message = `Error running updater: ${err.message}`;\n } else if (err instanceof CredentialFetchingError) {\n message = `Dependabot was unable to retrieve job credentials: ${err.message}`;\n } else {\n message = `Unknown error: ${(err as Error).message}`;\n }\n }\n\n // send usage telemetry, unless explicitly disabled\n const telemetryDisabled = z.stringbool().optional().parse(process.env.PAKLO_TELEMETRY_DISABLED);\n if (!telemetryDisabled) {\n // detect if we are running inside a Docker container\n const inDocker = await isRunningInDocker();\n const duration = Date.now() - started.getTime();\n const data: UsageTelemetryRequestData = {\n ...usage,\n host: {\n platform: os.platform(),\n release: os.release(),\n arch: os.arch(),\n 'machine-hash': crypto.createHash('sha256').update(os.hostname()).digest('hex'),\n 'docker-container': inDocker,\n },\n version: packageJson.version,\n id: jobId,\n started,\n duration,\n success,\n // error message but truncate to first 1000 characters to avoid sending too much data\n error: message ? { message: message.substring(0, 1000) } : undefined,\n };\n try {\n const json = JSON.stringify(data);\n logger.debug(`Usage telemetry data: ${json}`);\n const resp = await ky.post('https://www.paklo.app/api/usage-telemetry', {\n headers: { 'Content-Type': 'application/json' },\n body: json,\n });\n if (!resp.ok) {\n logger.debug(`Failed to send usage telemetry data: ${resp.status} ${resp.statusText}`);\n }\n } catch (err) {\n logger.debug(`Failed to send usage telemetry data: ${(err as Error).message}`);\n // ignore\n }\n } else {\n logger.debug('Telemetry disabled, not sending usage telemetry data');\n }\n\n logger.info(`Update job ${jobId} completed`);\n return { success, message: message! };\n}\n\n/**\n * Detects if the current process is running inside a Docker container.\n */\nexport async function isRunningInDocker(): Promise<boolean> {\n // Check for .dockerenv file\n if (existsSync('/.dockerenv')) return true;\n\n // Check cgroup\n try {\n const cgroup = await readFile('/proc/self/cgroup', 'utf8');\n return cgroup.includes('docker') || cgroup.includes('kubepods');\n } catch {\n return false;\n }\n}\n"],"mappings":"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"}
@@ -64,7 +64,7 @@ declare abstract class LocalDependabotServer {
64
64
  get port(): number;
65
65
  get jobs(): Map<string, {
66
66
  id: string;
67
- 'package-manager': "bundler" | "cargo" | "composer" | "conda" | "pub" | "docker" | "elm" | "github_actions" | "submodules" | "go_modules" | "gradle" | "maven" | "hex" | "nuget" | "npm_and_yarn" | "pip" | "rust_toolchain" | "swift" | "terraform" | "devcontainers" | "dotnet_sdk" | "bun" | "docker_compose" | "uv" | "vcpkg" | "helm" | "julia" | "bazel" | "opentofu";
67
+ 'package-manager': "hex" | "bundler" | "cargo" | "composer" | "conda" | "pub" | "docker" | "elm" | "github_actions" | "submodules" | "go_modules" | "gradle" | "maven" | "nuget" | "npm_and_yarn" | "pip" | "rust_toolchain" | "swift" | "terraform" | "devcontainers" | "dotnet_sdk" | "bun" | "docker_compose" | "uv" | "vcpkg" | "helm" | "julia" | "bazel" | "opentofu";
68
68
  'allowed-updates': {
69
69
  'dependency-name'?: string | null | undefined;
70
70
  'dependency-type'?: string | null | undefined;
@@ -225,4 +225,4 @@ declare abstract class LocalDependabotServer {
225
225
  }
226
226
  //#endregion
227
227
  export { LocalJobsRunner as a, LocalDependabotServerOptions as i, LocalDependabotServer as n, LocalJobsRunnerOptions as o, LocalDependabotServerAddOptions as r, RunJobsResult as s, AffectedPullRequestIds as t };
228
- //# sourceMappingURL=server-CgRF4LrG.d.mts.map
228
+ //# sourceMappingURL=server-B6aYEkTC.d.mts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@paklo/runner",
3
- "version": "0.11.1",
3
+ "version": "0.11.2",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "author": "mburumaxwell",
@@ -48,7 +48,7 @@
48
48
  },
49
49
  "devDependencies": {
50
50
  "@types/dockerode": "4.0.1",
51
- "@types/node": "25.2.0",
51
+ "@types/node": "25.2.3",
52
52
  "@types/node-forge": "1.3.14",
53
53
  "@types/tar-stream": "3.1.4",
54
54
  "tsdown": "0.20.3",