From b086a649ace869761b55c00de183bfe7effa0e4c Mon Sep 17 00:00:00 2001 From: Tahmid Ahmed Date: Thu, 2 Jul 2026 19:18:09 -0400 Subject: [PATCH] refactor: remove secrets file in place of using new gh secrets --- .github/composite/setup/action.yaml | 6 ++- .github/scripts/bun.lock | 22 +++++++++- .github/scripts/package.json | 2 +- .github/scripts/src/build-images/index.ts | 32 ++++----------- .github/scripts/src/create-tag/index.ts | 50 +++++++++-------------- .github/workflows/ci.yaml | 10 +---- Justfile | 14 ++----- secrets.yaml | 16 -------- 8 files changed, 58 insertions(+), 94 deletions(-) delete mode 100644 secrets.yaml diff --git a/.github/composite/setup/action.yaml b/.github/composite/setup/action.yaml index 342f498..48def8c 100644 --- a/.github/composite/setup/action.yaml +++ b/.github/composite/setup/action.yaml @@ -18,18 +18,22 @@ inputs: AZURE_SUBSCRIPTION_ID: description: "Azure subscription ID if azure authentication is required." required: false + SECRETS: + description: "secrets passed in as JSON." + required: false runs: using: "composite" steps: - name: Setup - uses: tahminator/pipeline/actions/setup@1.0.46 + uses: tahminator/pipeline/actions/setup@1.0.65 with: AZURE_CLIENT_ID: ${{ inputs.AZURE_CLIENT_ID }} AZURE_CLIENT_SECRET: ${{ inputs.AZURE_CLIENT_SECRET }} AZURE_TENANT_ID: ${{ inputs.AZURE_TENANT_ID }} AZURE_SUBSCRIPTION_ID: ${{ inputs.AZURE_SUBSCRIPTION_ID }} INSTALL_SOPS: true + SECRETS: ${{ inputs.SECRETS }} - name: Test CI scripts shell: bash diff --git a/.github/scripts/bun.lock b/.github/scripts/bun.lock index 8d3156b..b405e67 100644 --- a/.github/scripts/bun.lock +++ b/.github/scripts/bun.lock @@ -6,7 +6,7 @@ "name": "scripts", "dependencies": { "@octokit/rest": "^22.0.1", - "@tahminator/pipeline": "^1.0.23", + "@tahminator/pipeline": "^1.0.65", "@types/yargs": "^17.0.35", "bun": "^1.3.6", "octokit": "^5.0.5", @@ -119,6 +119,8 @@ "@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="], + "@nodable/entities": ["@nodable/entities@2.2.0", "", {}, "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg=="], + "@npmcli/agent": ["@npmcli/agent@4.0.0", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^11.2.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA=="], "@npmcli/arborist": ["@npmcli/arborist@9.4.2", "", { "dependencies": { "@gar/promise-retry": "^1.0.0", "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^5.0.0", "@npmcli/installed-package-contents": "^4.0.0", "@npmcli/map-workspaces": "^5.0.0", "@npmcli/metavuln-calculator": "^9.0.2", "@npmcli/name-from-folder": "^4.0.0", "@npmcli/node-gyp": "^5.0.0", "@npmcli/package-json": "^7.0.0", "@npmcli/query": "^5.0.0", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", "minimatch": "^10.0.3", "nopt": "^9.0.0", "npm-install-checks": "^8.0.0", "npm-package-arg": "^13.0.0", "npm-pick-manifest": "^11.0.1", "npm-registry-fetch": "^19.0.0", "pacote": "^21.0.2", "parse-conflict-json": "^5.0.1", "proc-log": "^6.0.0", "proggy": "^4.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "semver": "^7.3.7", "ssri": "^13.0.0", "treeverse": "^3.0.0", "walk-up-path": "^4.0.0" }, "bin": { "arborist": "bin/index.js" } }, "sha512-omJgPyzt11cEGrxzgrECoOyxAunmPMgBFTcAB/FbaB+9iOYhGmRdsQqySV8o0LWQ/l2kTeASUIMR4xJufVwmtw=="], @@ -299,7 +301,7 @@ "@sigstore/verify": ["@sigstore/verify@3.1.0", "", { "dependencies": { "@sigstore/bundle": "^4.0.0", "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" } }, "sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag=="], - "@tahminator/pipeline": ["@tahminator/pipeline@1.0.55", "", { "dependencies": { "@octokit/auth-app": "^8.2.0", "@octokit/rest": "^22.0.1", "@pulumi/pulumi": "^3.230.0", "ansi-to-html": "^0.7.2", "neverthrow": "^8.2.0", "semver": "^7.7.4", "yaml": "^2.8.2", "yargs": "^18.0.0", "zod": "^4.3.6" }, "peerDependencies": { "typescript": "^5" } }, "sha512-0ezJ5pGmbzG1L3TOgT2ZAxUBP4yI5L96cjtcWUM5JDJyV7wJ/Cqhp6LbpFw0xt5aYBmX0TRo6RaUgnuEvtbILQ=="], + "@tahminator/pipeline": ["@tahminator/pipeline@1.0.65", "", { "dependencies": { "@octokit/auth-app": "^8.2.0", "@octokit/rest": "^22.0.1", "@pulumi/pulumi": "^3.230.0", "ansi-to-html": "^0.7.2", "fast-xml-builder": "^1.1.5", "fast-xml-parser": "^5.7.2", "neverthrow": "^8.2.0", "semver": "^7.7.4", "xml-trueformat": "^0.9.5", "yaml": "^2.8.2", "yargs": "^18.0.0", "zod": "^4.3.6" }, "peerDependencies": { "typescript": "^5" } }, "sha512-aeGFIomMziJxSb5BXizyWTCI2kehr7FJmqT/9sgNdWk34k4csN2jYbwtvzXb2ADLWQLNy6VdbijHTGVuU0M1SQ=="], "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], @@ -365,6 +367,8 @@ "ansi-to-html": ["ansi-to-html@0.7.2", "", { "dependencies": { "entities": "^2.2.0" }, "bin": { "ansi-to-html": "bin/ansi-to-html" } }, "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g=="], + "anynum": ["anynum@1.0.1", "", {}, "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A=="], + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="], @@ -529,6 +533,10 @@ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + "fast-xml-builder": ["fast-xml-builder@1.2.0", "", { "dependencies": { "path-expression-matcher": "^1.5.0", "xml-naming": "^0.1.0" } }, "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q=="], + + "fast-xml-parser": ["fast-xml-parser@5.9.3", "", { "dependencies": { "@nodable/entities": "^2.2.0", "fast-xml-builder": "^1.2.0", "is-unsafe": "^1.0.1", "path-expression-matcher": "^1.5.0", "strnum": "^2.4.1", "xml-naming": "^0.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-brCNCeScma/kqa54J4PIDriSSSLssRkuYaUCpvHJulGc3HGI/xxKUCTDcYkAdqJsyb//ydpbxecjC3hB9+tb/g=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], @@ -673,6 +681,8 @@ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + "is-unsafe": ["is-unsafe@1.0.1", "", {}, "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA=="], + "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="], "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="], @@ -833,6 +843,8 @@ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + "path-expression-matcher": ["path-expression-matcher@1.6.1", "", {}, "sha512-h7bxdzhHk8Knyc4Tj+jMaa7fEEoUJy7p1qtbVgkYg1Uhpe5Np5VuGXCRZnkZvU+Q42M1vStt0ifa3ueykRJPmQ=="], + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="], @@ -961,6 +973,8 @@ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + "strnum": ["strnum@2.4.1", "", { "dependencies": { "anynum": "^1.0.1" } }, "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg=="], + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="], @@ -1033,6 +1047,10 @@ "write-file-atomic": ["write-file-atomic@7.0.1", "", { "dependencies": { "signal-exit": "^4.0.1" } }, "sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg=="], + "xml-naming": ["xml-naming@0.1.0", "", {}, "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw=="], + + "xml-trueformat": ["xml-trueformat@0.9.5", "", {}, "sha512-npDAcGSttDBmTyfCLExLDceuIhQCkEkAw9wx3JfrcRRevaG8mn+BQLmprK+GB5iULF9yemW+o/3P3ytUpl+dGA=="], + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], diff --git a/.github/scripts/package.json b/.github/scripts/package.json index e8337b7..5d843a2 100644 --- a/.github/scripts/package.json +++ b/.github/scripts/package.json @@ -17,7 +17,7 @@ "license": "MIT", "dependencies": { "@octokit/rest": "^22.0.1", - "@tahminator/pipeline": "^1.0.23", + "@tahminator/pipeline": "^1.0.65", "@types/yargs": "^17.0.35", "bun": "^1.3.6", "octokit": "^5.0.5", diff --git a/.github/scripts/src/build-images/index.ts b/.github/scripts/src/build-images/index.ts index 96db0ef..a1270fb 100644 --- a/.github/scripts/src/build-images/index.ts +++ b/.github/scripts/src/build-images/index.ts @@ -1,12 +1,9 @@ -import { - DockerClient, - EnvClient, - EnvClientStrategy, - Utils, -} from "@tahminator/pipeline"; +import { DockerClient, Utils } from "@tahminator/pipeline"; import yargs from "yargs"; import { hideBin } from "yargs/helpers"; +const { required } = Utils; + const { ver, shouldUpload } = await yargs(hideBin(process.argv)) .option("ver", { type: "string", @@ -23,10 +20,7 @@ const { ver, shouldUpload } = await yargs(hideBin(process.argv)) const targets = ["pg-az"] as const; export async function main() { - const envClient = EnvClient.create(EnvClientStrategy.SOPS); - const { dockerHubPat, dockerHubUsername } = parseCiEnv( - await envClient.readFromEnv("secrets.yaml"), - ); + const { dockerHubPat, dockerHubUsername } = parseCiEnv(); await using dockerClient = await DockerClient.create( dockerHubUsername, dockerHubPat, @@ -45,22 +39,10 @@ export async function main() { } } -function parseCiEnv(ciEnv: Record) { - const dockerHubPat = (() => { - const v = ciEnv["DOCKER_HUB_PAT"]; - if (!v) { - throw new Error("Missing DOCKER_HUB_PAT from .env.ci"); - } - return v; - })(); +function parseCiEnv() { + const dockerHubPat = required(process.env["DOCKER_HUB_PAT"]); - const dockerHubUsername = (() => { - const v = ciEnv["DOCKER_HUB_USERNAME"]; - if (!v) { - throw new Error("Missing DOCKER_HUB_USERNAME from .env.ci"); - } - return v; - })(); + const dockerHubUsername = required(process.env["DOCKER_HUB_USERNAME"]); return { dockerHubPat, dockerHubUsername }; } diff --git a/.github/scripts/src/create-tag/index.ts b/.github/scripts/src/create-tag/index.ts index 6eef96f..16da6bc 100644 --- a/.github/scripts/src/create-tag/index.ts +++ b/.github/scripts/src/create-tag/index.ts @@ -1,14 +1,15 @@ import { - EnvClient, - EnvClientStrategy, GitHubClient, Utils, + VersioningClient, + VersionUpdatingStrategy, } from "@tahminator/pipeline"; +const { required } = Utils; + export async function main() { - const envClient = EnvClient.create(EnvClientStrategy.SOPS); const { githubAppAppId, githubAppInstallationId, githubAppPrivateKey } = - parseCiEnv(await envClient.readFromEnv("secrets.yaml")); + parseCiEnv(); const ghClient = await GitHubClient.createWithGithubAppToken({ appId: githubAppAppId, @@ -16,37 +17,24 @@ export async function main() { privateKey: githubAppPrivateKey, }); + const versioningClient = new VersioningClient( + ghClient, + VersionUpdatingStrategy.NONE, + ); + await ghClient.createTag({ - onPreTagCreate: async (tag) => { - await Utils.updateAllPackageJsonsWithVersion(tag); - }, + nextTag: await versioningClient.next(), }); } -function parseCiEnv(ciEnv: Record) { - const githubAppAppId = (() => { - const v = ciEnv["GITHUB_APP_APP_ID"]; - if (!v) { - throw new Error("Missing GITHUB_APP_APP_ID from .env.ci"); - } - return v; - })(); - - const githubAppInstallationId = (() => { - const v = ciEnv["GITHUB_APP_INSTALLATION_ID"]; - if (!v) { - throw new Error("Missing GITHUB_APP_INSTALLATION_ID from .env.ci"); - } - return v; - })(); - - const githubAppPrivateKey = (() => { - const v = ciEnv["GITHUB_APP_PEM_CONTENT"]; - if (!v) { - throw new Error("Missing GITHUB_APP_PRIVATE_KEY from .env.ci"); - } - return v; - })(); +function parseCiEnv() { + const githubAppAppId = required(process.env["_GITHUB_APP_APP_ID"]); + + const githubAppInstallationId = required( + process.env["_GITHUB_APP_INSTALLATION_ID"], + ); + + const githubAppPrivateKey = required(process.env["_GITHUB_APP_PEM_CONTENT"]); return { githubAppAppId, githubAppInstallationId, githubAppPrivateKey }; } diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7e90584..f4b6642 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,10 +27,7 @@ jobs: - name: Setup pipeline uses: ./.github/composite/setup with: - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + SECRETS: ${{ toJSON(secrets) }} - name: Build images uses: ./.github/composite/build-images @@ -55,10 +52,7 @@ jobs: - name: Setup pipeline uses: ./.github/composite/setup with: - AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }} - AZURE_CLIENT_SECRET: ${{ secrets.AZURE_CLIENT_SECRET }} - AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }} - AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }} + SECRETS: ${{ toJSON(secrets) }} - name: Create new tag uses: ./.github/composite/create-tag diff --git a/Justfile b/Justfile index c17e5ec..d808a4e 100644 --- a/Justfile +++ b/Justfile @@ -1,17 +1,11 @@ -e file *args: - just install-pre-scripts && sops --encrypt --in-place {{ file }} {{ args }} - -d file *args: - just install-pre-scripts && sops --decrypt --in-place {{ file }} {{ args }} - build-pg-az: - just install-pre-scripts && docker build --platform linux/amd64 -t Patina-Network/pg-az -f src/pg-az/Dockerfile . + docker build --platform linux/amd64 -t Patina-Network/pg-az -f src/pg-az/Dockerfile . install-pre-scripts: - just install-pre-commit && just install-pre-push + just install-pre-commit && just install-pre-push install-pre-commit: - cp pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit + cp pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit install-pre-push: - cp pre-commit .git/hooks/pre-push && chmod +x .git/hooks/pre-push + cp pre-commit .git/hooks/pre-push && chmod +x .git/hooks/pre-push diff --git a/secrets.yaml b/secrets.yaml deleted file mode 100644 index 445f372..0000000 --- a/secrets.yaml +++ /dev/null @@ -1,16 +0,0 @@ -GITHUB_APP_APP_ID: ENC[AES256_GCM,data:a6UayMcf0g==,iv:Ora5gr+bo3y5cbdV9o9cKhq2l7E9KQFIT61QsHz5pFA=,tag:a+mB7gVha1QvN3DDIsVWWw==,type:str] -GITHUB_APP_INSTALLATION_ID: ENC[AES256_GCM,data:OKXr3XagggPm,iv:Ob7SCBJYaMSrfu5MjffIj6aGRsrRIA3Lyk/lb8UTmJo=,tag:aYWpPTV4ZVsr8EVT//nhtg==,type:int] -GITHUB_APP_PEM_CONTENT: ENC[AES256_GCM,data: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,iv:z/uhI0IuC7GiMBlClfIP0spLGC3M5orPYTsWJHKjR/g=,tag:KDcewawhSWd7w9cOpWELww==,type:str] -DOCKER_HUB_USERNAME: ENC[AES256_GCM,data:3DU+VGZgaphXDvbv2A==,iv:e/WWxwG6I3HNoNS5kupBYYFmrUcYuXWSK0lW2vyl+EU=,tag:ei/CdHcv62dN1ICkR1BAEQ==,type:str] -DOCKER_HUB_PAT: ENC[AES256_GCM,data:8auzDoxirFYlx+YmRpLe0eU4vGUV5tAUqCmZrkobQdWhZDJo,iv:XepoTkJzE1ilTl3fnCLc2c3VER9ePqpEgjBEbnL/UcM=,tag:fQDMP6sP6shiG6OmgyzHFQ==,type:str] -sops: - azure_kv: - - vault_url: https://sops-master.vault.azure.net - name: sops-key - version: 90784f2986de4514934b4d1f682d3e59 - created_at: "2026-04-23T04:18:28Z" - enc: qaqhtBjwQ-12V7KhgV6E3oKfgFQxVRt4bMMMskN1jqNrV13QcqHoBPIJzVyqQVfDZ9nKqZxOXbOwyRapT9Y6DeSB5TVN9jGAeAmTSoPmRfb9JIVqfswKxTUV9RpjUJl3jI00Humq2wjgc9jrO7Ge7-ng_A7uo12TWqYf1CHZ0vdKxQb2oXVLFOet3ouMgwvTX7LET1HYR7J-wkXvq5MlUOAINvcG6_S2iW3VAT1xVQj_0o2qoYsudsSJfCDZzecgqRmzwZvZ6VUQvhHPJ96t9wfi08fH4oS4BBcdExRJgwqeBXhiJzTlee8lEyxlEfE6wVepdXttPXcahKPvGEKmOA - lastmodified: "2026-04-23T04:18:31Z" - mac: ENC[AES256_GCM,data:UNucWEOFST7Bktk/exAHVRXYaQvjueKG1TKib1b9pvI8uZoVhKJiOz+muBfdnIZjNAY+W1CovTMSSD+qlkq6nzBbtyRn+Y0akJW3Ej0tCyMurL33bZ8BoFmieWqSFx2+hyGOK+oYfCCjZvUEgJEiGhqktUChmiMELAcE/IrGgXY=,iv:fCSsNsvI7DZl/FoMlsndm5QhNWpjq/EbhbuX3vmQGH0=,tag:J42/fCZOo5E1nPvht12HpA==,type:str] - unencrypted_suffix: _unencrypted - version: 3.12.1