Compare commits
50 Commits
jill/handl
...
v4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
92467eb28f | ||
|
|
21f21cb312 | ||
|
|
a82b5b0e62 | ||
|
|
355a4641a8 | ||
|
|
50dbf2f36c | ||
|
|
2a602963c2 | ||
|
|
61e04e231d | ||
|
|
93d1217e3f | ||
|
|
17a79a92a6 | ||
|
|
7a0b59f9ab | ||
|
|
a916812f67 | ||
|
|
15f53e00f6 | ||
|
|
911ae9a9d1 | ||
|
|
18c9485047 | ||
|
|
7eb7055d29 | ||
|
|
ebcbcb60ac | ||
|
|
13dac1510b | ||
|
|
960f48270b | ||
|
|
d87677b04d | ||
|
|
bd0f47e27e | ||
|
|
6352983a5d | ||
|
|
be02de5ede | ||
|
|
2b062ec18c | ||
|
|
f4a6c38f2a | ||
|
|
bc8523c04b | ||
|
|
6ecbf76d39 | ||
|
|
2763f7b0b3 | ||
|
|
934acd2a2a | ||
|
|
affe8f4720 | ||
|
|
ad358d4370 | ||
|
|
dafbe7cb03 | ||
|
|
7f98afc2d7 | ||
|
|
9cdab8f59d | ||
|
|
6a14785fa5 | ||
|
|
7d4e24a43f | ||
|
|
cb7c5acc8a | ||
|
|
ea49b14f1e | ||
|
|
93abacc9df | ||
|
|
40e52b6cef | ||
|
|
38b333095d | ||
|
|
5b2af23419 | ||
|
|
652d567877 | ||
|
|
ee92e1fd32 | ||
|
|
d688c27248 | ||
|
|
a312828d43 | ||
|
|
e6b45e828c | ||
|
|
639ddd6614 | ||
|
|
e5d7353d74 | ||
|
|
a665f2c1ab | ||
|
|
485265b41c |
83
.github/workflows/e2e-tests.yml
vendored
83
.github/workflows/e2e-tests.yml
vendored
@@ -30,6 +30,7 @@ jobs:
|
|||||||
runs-on: ${{ matrix.os }}
|
runs-on: ${{ matrix.os }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
|
max-parallel: 4
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
os: [ubuntu-latest, macos-latest, windows-latest]
|
||||||
version: [latest, 2.30.0]
|
version: [latest, 2.30.0]
|
||||||
@@ -42,9 +43,9 @@ jobs:
|
|||||||
ref: ${{ inputs.ref }}
|
ref: ${{ inputs.ref }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 24
|
||||||
cache: npm
|
cache: npm
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -59,6 +60,9 @@ jobs:
|
|||||||
echo "FILE_SECRET=op://${{ secrets.VAULT }}/test-secret/password" > tests/.env.tpl
|
echo "FILE_SECRET=op://${{ secrets.VAULT }}/test-secret/password" > tests/.env.tpl
|
||||||
echo "FILE_SECRET_IN_SECTION=op://${{ secrets.VAULT }}/test-secret/test-section/password" >> tests/.env.tpl
|
echo "FILE_SECRET_IN_SECTION=op://${{ secrets.VAULT }}/test-secret/test-section/password" >> tests/.env.tpl
|
||||||
echo "FILE_MULTILINE_SECRET=op://${{ secrets.VAULT }}/multiline-secret/notesPlain" >> tests/.env.tpl
|
echo "FILE_MULTILINE_SECRET=op://${{ secrets.VAULT }}/multiline-secret/notesPlain" >> tests/.env.tpl
|
||||||
|
echo "FILE_WEBSITE=op://${{ secrets.VAULT }}/test-secret/website" >> tests/.env.tpl
|
||||||
|
echo "FILE_TEST_SSH_KEY=op://${{ secrets.VAULT }}/test-ssh-key/private key" >> tests/.env.tpl
|
||||||
|
echo "FILE_TEST_SSH_KEY_OPENSSH=op://${{ secrets.VAULT }}/test-ssh-key/private key?ssh-format=openssh" >> tests/.env.tpl
|
||||||
|
|
||||||
- name: Configure Service account
|
- name: Configure Service account
|
||||||
uses: ./configure
|
uses: ./configure
|
||||||
@@ -75,25 +79,52 @@ jobs:
|
|||||||
SECRET: op://${{ secrets.VAULT }}/test-secret/password
|
SECRET: op://${{ secrets.VAULT }}/test-secret/password
|
||||||
SECRET_IN_SECTION: op://${{ secrets.VAULT }}/test-secret/test-section/password
|
SECRET_IN_SECTION: op://${{ secrets.VAULT }}/test-secret/test-section/password
|
||||||
MULTILINE_SECRET: op://${{ secrets.VAULT }}/multiline-secret/notesPlain
|
MULTILINE_SECRET: op://${{ secrets.VAULT }}/multiline-secret/notesPlain
|
||||||
|
WEBSITE: op://${{ secrets.VAULT }}/test-secret/website
|
||||||
|
TEST_SSH_KEY: op://${{ secrets.VAULT }}/test-ssh-key/private key
|
||||||
|
TEST_SSH_KEY_OPENSSH: "op://${{ secrets.VAULT }}/test-ssh-key/private key?ssh-format=openssh"
|
||||||
OP_ENV_FILE: ./tests/.env.tpl
|
OP_ENV_FILE: ./tests/.env.tpl
|
||||||
|
|
||||||
- name: Assert test secret values [step output]
|
- name: Assert test secret values [step output]
|
||||||
if: ${{ !matrix.export-env }}
|
if: ${{ !matrix.export-env }}
|
||||||
shell: bash
|
shell: bash
|
||||||
env:
|
env:
|
||||||
|
ASSERT_WEBSITE: "true"
|
||||||
SECRET: ${{ steps.load_secrets.outputs.SECRET }}
|
SECRET: ${{ steps.load_secrets.outputs.SECRET }}
|
||||||
SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.SECRET_IN_SECTION }}
|
SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.SECRET_IN_SECTION }}
|
||||||
MULTILINE_SECRET: ${{ steps.load_secrets.outputs.MULTILINE_SECRET }}
|
MULTILINE_SECRET: ${{ steps.load_secrets.outputs.MULTILINE_SECRET }}
|
||||||
FILE_SECRET: ${{ steps.load_secrets.outputs.FILE_SECRET }}
|
FILE_SECRET: ${{ steps.load_secrets.outputs.FILE_SECRET }}
|
||||||
FILE_SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.FILE_SECRET_IN_SECTION }}
|
FILE_SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.FILE_SECRET_IN_SECTION }}
|
||||||
FILE_MULTILINE_SECRET: ${{ steps.load_secrets.outputs.FILE_MULTILINE_SECRET }}
|
FILE_MULTILINE_SECRET: ${{ steps.load_secrets.outputs.FILE_MULTILINE_SECRET }}
|
||||||
|
WEBSITE: ${{ steps.load_secrets.outputs.WEBSITE }}
|
||||||
|
FILE_WEBSITE: ${{ steps.load_secrets.outputs.FILE_WEBSITE }}
|
||||||
|
TEST_SSH_KEY: ${{ steps.load_secrets.outputs.TEST_SSH_KEY }}
|
||||||
|
FILE_TEST_SSH_KEY: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY }}
|
||||||
|
TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.TEST_SSH_KEY_OPENSSH }}
|
||||||
|
FILE_TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY_OPENSSH }}
|
||||||
run: ./tests/assert-env-set.sh
|
run: ./tests/assert-env-set.sh
|
||||||
|
|
||||||
|
- name: Assert SSH key env vars [step output]
|
||||||
|
if: ${{ !matrix.export-env }}
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
TEST_SSH_KEY: ${{ steps.load_secrets.outputs.TEST_SSH_KEY }}
|
||||||
|
FILE_TEST_SSH_KEY: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY }}
|
||||||
|
TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.TEST_SSH_KEY_OPENSSH }}
|
||||||
|
FILE_TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY_OPENSSH }}
|
||||||
|
run: ./tests/assert-ssh-keys-set.sh
|
||||||
|
|
||||||
- name: Assert test secret values [exported env]
|
- name: Assert test secret values [exported env]
|
||||||
if: ${{ matrix.export-env }}
|
if: ${{ matrix.export-env }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
ASSERT_WEBSITE: "true"
|
||||||
run: ./tests/assert-env-set.sh
|
run: ./tests/assert-env-set.sh
|
||||||
|
|
||||||
|
- name: Assert SSH key env vars [exported env]
|
||||||
|
if: ${{ matrix.export-env }}
|
||||||
|
shell: bash
|
||||||
|
run: ./tests/assert-ssh-keys-set.sh
|
||||||
|
|
||||||
- name: Remove secrets [exported env]
|
- name: Remove secrets [exported env]
|
||||||
if: ${{ matrix.export-env }}
|
if: ${{ matrix.export-env }}
|
||||||
uses: ./
|
uses: ./
|
||||||
@@ -105,29 +136,12 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: ./tests/assert-env-unset.sh
|
run: ./tests/assert-env-unset.sh
|
||||||
|
|
||||||
- name: Load secrets (invalid ref - expect failure)
|
|
||||||
id: load_invalid
|
|
||||||
continue-on-error: true
|
|
||||||
uses: ./
|
|
||||||
env:
|
|
||||||
BAD_REF: "op://x"
|
|
||||||
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
|
|
||||||
with:
|
|
||||||
export-env: true
|
|
||||||
|
|
||||||
- name: Assert invalid ref failed
|
|
||||||
shell: bash
|
|
||||||
run: ./tests/assert-invalid-ref-failed.sh
|
|
||||||
env:
|
|
||||||
STEP_OUTCOME: ${{ steps.load_invalid.outcome }}
|
|
||||||
|
|
||||||
test-connect:
|
test-connect:
|
||||||
name: Connect (ubuntu-latest, ${{ matrix.version }}, export-env=${{ matrix.export-env }})
|
name: Connect (ubuntu-latest, ${{ matrix.version }}, export-env=${{ matrix.export-env }})
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: true
|
fail-fast: true
|
||||||
matrix:
|
matrix:
|
||||||
os: [ubuntu-latest, macos-latest, windows-latest]
|
|
||||||
version: [latest, 2.30.0]
|
version: [latest, 2.30.0]
|
||||||
export-env: [true, false]
|
export-env: [true, false]
|
||||||
steps:
|
steps:
|
||||||
@@ -138,9 +152,9 @@ jobs:
|
|||||||
ref: ${{ inputs.ref }}
|
ref: ${{ inputs.ref }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 24
|
||||||
cache: npm
|
cache: npm
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
@@ -155,13 +169,16 @@ jobs:
|
|||||||
echo "FILE_SECRET=op://${{ secrets.VAULT }}/test-secret/password" > tests/.env.tpl
|
echo "FILE_SECRET=op://${{ secrets.VAULT }}/test-secret/password" > tests/.env.tpl
|
||||||
echo "FILE_SECRET_IN_SECTION=op://${{ secrets.VAULT }}/test-secret/test-section/password" >> tests/.env.tpl
|
echo "FILE_SECRET_IN_SECTION=op://${{ secrets.VAULT }}/test-secret/test-section/password" >> tests/.env.tpl
|
||||||
echo "FILE_MULTILINE_SECRET=op://${{ secrets.VAULT }}/multiline-secret/notesPlain" >> tests/.env.tpl
|
echo "FILE_MULTILINE_SECRET=op://${{ secrets.VAULT }}/multiline-secret/notesPlain" >> tests/.env.tpl
|
||||||
|
echo "FILE_TEST_SSH_KEY=op://${{ secrets.VAULT }}/test-ssh-key/private key" >> tests/.env.tpl
|
||||||
|
echo "FILE_TEST_SSH_KEY_OPENSSH=op://${{ secrets.VAULT }}/test-ssh-key/private key?ssh-format=openssh" >> tests/.env.tpl
|
||||||
|
|
||||||
- name: Launch 1Password Connect instance
|
- name: Launch 1Password Connect instance
|
||||||
env:
|
env:
|
||||||
OP_CONNECT_CREDENTIALS: ${{ secrets.OP_CONNECT_CREDENTIALS }}
|
OP_CONNECT_CREDENTIALS: ${{ secrets.OP_CONNECT_CREDENTIALS }}
|
||||||
run: |
|
run: |
|
||||||
echo "$OP_CONNECT_CREDENTIALS" > 1password-credentials.json
|
echo "$OP_CONNECT_CREDENTIALS" > 1password-credentials.json
|
||||||
docker compose -f tests/fixtures/docker-compose.yml up -d && sleep 10
|
docker compose -f tests/fixtures/docker-compose.yml up -d
|
||||||
|
timeout 60 bash -c 'until curl -sf http://localhost:8080/health >/dev/null 2>&1; do sleep 2; done'
|
||||||
|
|
||||||
- name: Configure 1Password Connect
|
- name: Configure 1Password Connect
|
||||||
uses: ./configure
|
uses: ./configure
|
||||||
@@ -179,23 +196,45 @@ jobs:
|
|||||||
SECRET: op://${{ secrets.VAULT }}/test-secret/password
|
SECRET: op://${{ secrets.VAULT }}/test-secret/password
|
||||||
SECRET_IN_SECTION: op://${{ secrets.VAULT }}/test-secret/test-section/password
|
SECRET_IN_SECTION: op://${{ secrets.VAULT }}/test-secret/test-section/password
|
||||||
MULTILINE_SECRET: op://${{ secrets.VAULT }}/multiline-secret/notesPlain
|
MULTILINE_SECRET: op://${{ secrets.VAULT }}/multiline-secret/notesPlain
|
||||||
|
TEST_SSH_KEY: op://${{ secrets.VAULT }}/test-ssh-key/private key
|
||||||
|
TEST_SSH_KEY_OPENSSH: "op://${{ secrets.VAULT }}/test-ssh-key/private key?ssh-format=openssh"
|
||||||
OP_ENV_FILE: ./tests/.env.tpl
|
OP_ENV_FILE: ./tests/.env.tpl
|
||||||
|
|
||||||
- name: Assert test secret values [step output]
|
- name: Assert test secret values [step output]
|
||||||
if: ${{ !matrix.export-env }}
|
if: ${{ !matrix.export-env }}
|
||||||
env:
|
env:
|
||||||
|
ASSERT_WEBSITE: "false"
|
||||||
SECRET: ${{ steps.load_secrets.outputs.SECRET }}
|
SECRET: ${{ steps.load_secrets.outputs.SECRET }}
|
||||||
SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.SECRET_IN_SECTION }}
|
SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.SECRET_IN_SECTION }}
|
||||||
MULTILINE_SECRET: ${{ steps.load_secrets.outputs.MULTILINE_SECRET }}
|
MULTILINE_SECRET: ${{ steps.load_secrets.outputs.MULTILINE_SECRET }}
|
||||||
FILE_SECRET: ${{ steps.load_secrets.outputs.FILE_SECRET }}
|
FILE_SECRET: ${{ steps.load_secrets.outputs.FILE_SECRET }}
|
||||||
FILE_SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.FILE_SECRET_IN_SECTION }}
|
FILE_SECRET_IN_SECTION: ${{ steps.load_secrets.outputs.FILE_SECRET_IN_SECTION }}
|
||||||
FILE_MULTILINE_SECRET: ${{ steps.load_secrets.outputs.FILE_MULTILINE_SECRET }}
|
FILE_MULTILINE_SECRET: ${{ steps.load_secrets.outputs.FILE_MULTILINE_SECRET }}
|
||||||
|
TEST_SSH_KEY: ${{ steps.load_secrets.outputs.TEST_SSH_KEY }}
|
||||||
|
FILE_TEST_SSH_KEY: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY }}
|
||||||
|
TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.TEST_SSH_KEY_OPENSSH }}
|
||||||
|
FILE_TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY_OPENSSH }}
|
||||||
run: ./tests/assert-env-set.sh
|
run: ./tests/assert-env-set.sh
|
||||||
|
|
||||||
|
- name: Assert SSH key env vars [step output]
|
||||||
|
if: ${{ !matrix.export-env }}
|
||||||
|
env:
|
||||||
|
TEST_SSH_KEY: ${{ steps.load_secrets.outputs.TEST_SSH_KEY }}
|
||||||
|
FILE_TEST_SSH_KEY: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY }}
|
||||||
|
TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.TEST_SSH_KEY_OPENSSH }}
|
||||||
|
FILE_TEST_SSH_KEY_OPENSSH: ${{ steps.load_secrets.outputs.FILE_TEST_SSH_KEY_OPENSSH }}
|
||||||
|
run: ./tests/assert-ssh-keys-set.sh
|
||||||
|
|
||||||
- name: Assert test secret values [exported env]
|
- name: Assert test secret values [exported env]
|
||||||
if: ${{ matrix.export-env }}
|
if: ${{ matrix.export-env }}
|
||||||
|
env:
|
||||||
|
ASSERT_WEBSITE: "false"
|
||||||
run: ./tests/assert-env-set.sh
|
run: ./tests/assert-env-set.sh
|
||||||
|
|
||||||
|
- name: Assert SSH key env vars [exported env]
|
||||||
|
if: ${{ matrix.export-env }}
|
||||||
|
run: ./tests/assert-ssh-keys-set.sh
|
||||||
|
|
||||||
- name: Remove secrets [exported env]
|
- name: Remove secrets [exported env]
|
||||||
if: ${{ matrix.export-env }}
|
if: ${{ matrix.export-env }}
|
||||||
uses: ./
|
uses: ./
|
||||||
|
|||||||
4
.github/workflows/lint-and-test.yml
vendored
4
.github/workflows/lint-and-test.yml
vendored
@@ -18,9 +18,9 @@ jobs:
|
|||||||
.husky
|
.husky
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: 20
|
node-version: 24
|
||||||
cache: npm
|
cache: npm
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
- name: Load secret
|
- name: Load secret
|
||||||
id: load_secrets
|
id: load_secrets
|
||||||
uses: 1password/load-secrets-action@v3
|
uses: 1password/load-secrets-action@v4
|
||||||
env:
|
env:
|
||||||
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
|
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
|
||||||
SECRET: op://app-cicd/hello-world/secret
|
SECRET: op://app-cicd/hello-world/secret
|
||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Load secret
|
- name: Load secret
|
||||||
uses: 1password/load-secrets-action@v3
|
uses: 1password/load-secrets-action@v4
|
||||||
with:
|
with:
|
||||||
# Export loaded secrets as environment variables
|
# Export loaded secrets as environment variables
|
||||||
export-env: true
|
export-env: true
|
||||||
@@ -77,7 +77,7 @@ When loading SSH keys, you can specify the format using the `ssh-format` query p
|
|||||||
|
|
||||||
```yml
|
```yml
|
||||||
- name: Load SSH key
|
- name: Load SSH key
|
||||||
uses: 1password/load-secrets-action@v3
|
uses: 1password/load-secrets-action@v4
|
||||||
env:
|
env:
|
||||||
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
|
OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
|
||||||
# Load SSH private key in OpenSSH format
|
# Load SSH private key in OpenSSH format
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ inputs:
|
|||||||
description: Specify which 1Password CLI version to install. Defaults to "latest".
|
description: Specify which 1Password CLI version to install. Defaults to "latest".
|
||||||
default: "latest"
|
default: "latest"
|
||||||
runs:
|
runs:
|
||||||
using: "node20"
|
using: "node24"
|
||||||
main: "dist/index.js"
|
main: "dist/index.js"
|
||||||
|
|||||||
@@ -10,6 +10,11 @@ const jestConfig = {
|
|||||||
rootDir: "../src/",
|
rootDir: "../src/",
|
||||||
testEnvironment: "node",
|
testEnvironment: "node",
|
||||||
testRegex: "(/__tests__/.*|(\\.|/)test)\\.ts",
|
testRegex: "(/__tests__/.*|(\\.|/)test)\\.ts",
|
||||||
|
moduleNameMapper: {
|
||||||
|
"^@actions/core$": "<rootDir>/__mocks__/actions-core.ts",
|
||||||
|
"^@actions/tool-cache$": "<rootDir>/__mocks__/actions-tool-cache.ts",
|
||||||
|
"^@actions/exec$": "<rootDir>/__mocks__/actions-exec.ts",
|
||||||
|
},
|
||||||
transform: {
|
transform: {
|
||||||
".ts": [
|
".ts": [
|
||||||
"ts-jest",
|
"ts-jest",
|
||||||
@@ -25,4 +30,4 @@ const jestConfig = {
|
|||||||
verbose: true,
|
verbose: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
export default jestConfig;
|
module.exports = jestConfig;
|
||||||
|
|||||||
@@ -9,5 +9,5 @@ inputs:
|
|||||||
service-account-token:
|
service-account-token:
|
||||||
description: Your 1Password service account token
|
description: Your 1Password service account token
|
||||||
runs:
|
runs:
|
||||||
using: "node20"
|
using: "node24"
|
||||||
main: "dist/index.js"
|
main: "dist/index.js"
|
||||||
|
|||||||
32768
configure/dist/index.js
vendored
32768
configure/dist/index.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,4 +1,4 @@
|
|||||||
const core = require("@actions/core");
|
import * as core from "@actions/core";
|
||||||
|
|
||||||
const configure = () => {
|
const configure = () => {
|
||||||
const OP_CONNECT_HOST =
|
const OP_CONNECT_HOST =
|
||||||
|
|||||||
36341
dist/index.js
vendored
36341
dist/index.js
vendored
File diff suppressed because one or more lines are too long
204
package-lock.json
generated
204
package-lock.json
generated
@@ -1,19 +1,18 @@
|
|||||||
{
|
{
|
||||||
"name": "load-secrets-action",
|
"name": "load-secrets-action",
|
||||||
"version": "3.1.0",
|
"version": "4.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "load-secrets-action",
|
"name": "load-secrets-action",
|
||||||
"version": "3.1.0",
|
"version": "4.0.0",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@1password/op-js": "^0.1.11",
|
"@1password/op-js": "^0.1.11",
|
||||||
"@1password/sdk": "^0.4.0",
|
"@actions/core": "^3.0.0",
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/tool-cache": "^4.0.0",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
|
||||||
"dotenv": "^17.2.2"
|
"dotenv": "^17.2.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -73,74 +72,50 @@
|
|||||||
"prettier": "^2.0.0 || ^3.0.0"
|
"prettier": "^2.0.0 || ^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@1password/sdk": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@1password/sdk/-/sdk-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-RIypujc9R/UeUaobjyClTYokqRFpcaIkHq+EO/X9XoHId98Vg+SbjwGV+yygRC4MyHwYNo1KP1iEbZcqJ4ZTdw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@1password/sdk-core": "0.4.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@1password/sdk-core": {
|
|
||||||
"version": "0.4.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@1password/sdk-core/-/sdk-core-0.4.0.tgz",
|
|
||||||
"integrity": "sha512-vjeI1o4wiONY+t1naA4dtUp6HktdLH1D2S+tN1Lh4l41S9XIUHxrljov9B5u6G+VHr7f2MUoxmzXA9zT3aokQQ==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@actions/core": {
|
"node_modules/@actions/core": {
|
||||||
"version": "1.11.1",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz",
|
||||||
"integrity": "sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A==",
|
"integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/http-client": "^2.0.1"
|
"@actions/http-client": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/exec": {
|
"node_modules/@actions/exec": {
|
||||||
"version": "1.1.1",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz",
|
||||||
"integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
|
"integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/io": "^1.0.1"
|
"@actions/io": "^3.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/http-client": {
|
"node_modules/@actions/http-client": {
|
||||||
"version": "2.2.3",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz",
|
||||||
"integrity": "sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA==",
|
"integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tunnel": "^0.0.6",
|
"tunnel": "^0.0.6",
|
||||||
"undici": "^5.25.4"
|
"undici": "^6.23.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/io": {
|
"node_modules/@actions/io": {
|
||||||
"version": "1.1.3",
|
"version": "3.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz",
|
||||||
"integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q==",
|
"integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw=="
|
||||||
"license": "MIT"
|
|
||||||
},
|
},
|
||||||
"node_modules/@actions/tool-cache": {
|
"node_modules/@actions/tool-cache": {
|
||||||
"version": "2.0.2",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-4.0.0.tgz",
|
||||||
"integrity": "sha512-fBhNNOWxuoLxztQebpOaWu6WeVmuwa77Z+DxIZ1B+OYvGkGQon6kTVg6Z32Cb13WCuw0szqonK+hh03mJV7Z6w==",
|
"integrity": "sha512-L8P9HbXvpvqjZDveb/fdsa55IVC0trfPgQ4ZwGo6r5af6YDVdM9vMGPZ7rgY2fAT9gGj4PSYd6bYlg3p3jD78A==",
|
||||||
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.11.1",
|
"@actions/core": "^3.0.0",
|
||||||
"@actions/exec": "^1.0.0",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/http-client": "^2.0.1",
|
"@actions/http-client": "^4.0.0",
|
||||||
"@actions/io": "^1.1.1",
|
"@actions/io": "^3.0.0",
|
||||||
"semver": "^6.1.0"
|
"semver": "^7.7.3"
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@actions/tool-cache/node_modules/semver": {
|
|
||||||
"version": "6.3.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
|
||||||
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
|
|
||||||
"bin": {
|
|
||||||
"semver": "bin/semver.js"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@ampproject/remapping": {
|
"node_modules/@ampproject/remapping": {
|
||||||
@@ -775,15 +750,6 @@
|
|||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@fastify/busboy": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz",
|
|
||||||
"integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=14"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@humanwhocodes/config-array": {
|
"node_modules/@humanwhocodes/config-array": {
|
||||||
"version": "0.13.0",
|
"version": "0.13.0",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
|
||||||
@@ -1590,32 +1556,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
|
|
||||||
"version": "2.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
|
|
||||||
"version": "9.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
|
|
||||||
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"brace-expansion": "^2.0.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=16 || 14 >=14.17"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/isaacs"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@typescript-eslint/utils": {
|
"node_modules/@typescript-eslint/utils": {
|
||||||
"version": "6.21.0",
|
"version": "6.21.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
|
||||||
@@ -1704,11 +1644,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ajv": {
|
"node_modules/ajv": {
|
||||||
"version": "6.12.6",
|
"version": "6.14.0",
|
||||||
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
|
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz",
|
||||||
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
|
"integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
|
||||||
"peer": true,
|
"peer": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"fast-deep-equal": "^3.1.1",
|
"fast-deep-equal": "^3.1.1",
|
||||||
@@ -2150,14 +2089,13 @@
|
|||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.12",
|
"version": "2.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
||||||
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
|
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"balanced-match": "^1.0.0",
|
"balanced-match": "^1.0.0"
|
||||||
"concat-map": "0.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/braces": {
|
"node_modules/braces": {
|
||||||
@@ -2537,13 +2475,6 @@
|
|||||||
"node": ">= 12.0.0"
|
"node": ">= 12.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/concat-map": {
|
|
||||||
"version": "0.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
|
||||||
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/convert-source-map": {
|
"node_modules/convert-source-map": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
|
||||||
@@ -3767,29 +3698,6 @@
|
|||||||
"minimatch": "^5.0.1"
|
"minimatch": "^5.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/filelist/node_modules/brace-expansion": {
|
|
||||||
"version": "2.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
|
|
||||||
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/filelist/node_modules/minimatch": {
|
|
||||||
"version": "5.1.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
|
|
||||||
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
|
|
||||||
"dev": true,
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
|
||||||
"brace-expansion": "^2.0.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/fill-range": {
|
"node_modules/fill-range": {
|
||||||
"version": "7.1.1",
|
"version": "7.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||||
@@ -3834,11 +3742,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/flatted": {
|
"node_modules/flatted": {
|
||||||
"version": "3.3.2",
|
"version": "3.4.2",
|
||||||
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
|
||||||
"integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==",
|
"integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
|
||||||
"peer": true
|
"peer": true
|
||||||
},
|
},
|
||||||
"node_modules/for-each": {
|
"node_modules/for-each": {
|
||||||
@@ -6212,16 +6119,19 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimatch": {
|
"node_modules/minimatch": {
|
||||||
"version": "3.1.2",
|
"version": "9.0.9",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
|
||||||
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
|
"integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"brace-expansion": "^1.1.7"
|
"brace-expansion": "^2.0.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "*"
|
"node": ">=16 || 14 >=14.17"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/isaacs"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimist": {
|
"node_modules/minimist": {
|
||||||
@@ -7039,9 +6949,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/semver": {
|
"node_modules/semver": {
|
||||||
"version": "7.6.3",
|
"version": "7.7.4",
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
|
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
|
||||||
"integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
|
"integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"bin": {
|
"bin": {
|
||||||
"semver": "bin/semver.js"
|
"semver": "bin/semver.js"
|
||||||
@@ -7908,15 +7818,11 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici": {
|
"node_modules/undici": {
|
||||||
"version": "5.29.0",
|
"version": "6.24.1",
|
||||||
"resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici/-/undici-6.24.1.tgz",
|
||||||
"integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==",
|
"integrity": "sha512-sC+b0tB1whOCzbtlx20fx3WgCXwkW627p4EA9uM+/tNNPkSS+eSEld6pAs9nDv7WbY1UUljBMYPtu9BCOrCWKA==",
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@fastify/busboy": "^2.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=14.0"
|
"node": ">=18.17"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/undici-types": {
|
"node_modules/undici-types": {
|
||||||
|
|||||||
12
package.json
12
package.json
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "load-secrets-action",
|
"name": "load-secrets-action",
|
||||||
"version": "3.1.0",
|
"version": "4.0.0",
|
||||||
"description": "Load Secrets from 1Password",
|
"description": "Load Secrets from 1Password",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
@@ -41,12 +41,14 @@
|
|||||||
"homepage": "https://github.com/1Password/load-secrets-action#readme",
|
"homepage": "https://github.com/1Password/load-secrets-action#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@1password/op-js": "^0.1.11",
|
"@1password/op-js": "^0.1.11",
|
||||||
"@1password/sdk": "^0.4.0",
|
"@actions/core": "^3.0.0",
|
||||||
"@actions/core": "^1.10.1",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/exec": "^1.1.1",
|
"@actions/tool-cache": "^4.0.0",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
|
||||||
"dotenv": "^17.2.2"
|
"dotenv": "^17.2.2"
|
||||||
},
|
},
|
||||||
|
"overrides": {
|
||||||
|
"minimatch": "^9.0.7"
|
||||||
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@1password/eslint-config": "^4.3.1",
|
"@1password/eslint-config": "^4.3.1",
|
||||||
"@1password/prettier-config": "^1.2.0",
|
"@1password/prettier-config": "^1.2.0",
|
||||||
|
|||||||
14
src/__mocks__/actions-core.ts
Normal file
14
src/__mocks__/actions-core.ts
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
module.exports = {
|
||||||
|
getInput: jest.fn(() => ""),
|
||||||
|
getBooleanInput: jest.fn(() => false),
|
||||||
|
setOutput: jest.fn(),
|
||||||
|
setSecret: jest.fn(),
|
||||||
|
exportVariable: jest.fn(),
|
||||||
|
setFailed: jest.fn(),
|
||||||
|
info: jest.fn(),
|
||||||
|
warning: jest.fn(),
|
||||||
|
error: jest.fn(),
|
||||||
|
debug: jest.fn(),
|
||||||
|
addPath: jest.fn(),
|
||||||
|
isDebug: jest.fn(() => false),
|
||||||
|
};
|
||||||
5
src/__mocks__/actions-exec.ts
Normal file
5
src/__mocks__/actions-exec.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
getExecOutput: jest.fn(() => ({
|
||||||
|
stdout: "MOCK_SECRET",
|
||||||
|
})),
|
||||||
|
};
|
||||||
10
src/__mocks__/actions-tool-cache.ts
Normal file
10
src/__mocks__/actions-tool-cache.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
module.exports = {
|
||||||
|
downloadTool: jest.fn(),
|
||||||
|
extractTar: jest.fn(),
|
||||||
|
extractZip: jest.fn(),
|
||||||
|
cacheDir: jest.fn<Promise<string>, [string]>(async (dir) => {
|
||||||
|
await Promise.resolve();
|
||||||
|
return dir;
|
||||||
|
}),
|
||||||
|
find: jest.fn<string, [string, string?, string?]>(() => ""),
|
||||||
|
};
|
||||||
10
src/index.ts
10
src/index.ts
@@ -3,7 +3,7 @@ import * as core from "@actions/core";
|
|||||||
import { validateCli } from "@1password/op-js";
|
import { validateCli } from "@1password/op-js";
|
||||||
import { installCliOnGithubActionRunner } from "./op-cli-installer";
|
import { installCliOnGithubActionRunner } from "./op-cli-installer";
|
||||||
import { loadSecrets, unsetPrevious, validateAuth } from "./utils";
|
import { loadSecrets, unsetPrevious, validateAuth } from "./utils";
|
||||||
import { envFilePath, envConnectHost, envConnectToken } from "./constants";
|
import { envFilePath } from "./constants";
|
||||||
|
|
||||||
const loadSecretsAction = async () => {
|
const loadSecretsAction = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -26,12 +26,8 @@ const loadSecretsAction = async () => {
|
|||||||
dotenv.config({ path: file });
|
dotenv.config({ path: file });
|
||||||
}
|
}
|
||||||
|
|
||||||
const isConnect =
|
// Download and install the CLI
|
||||||
process.env[envConnectHost] && process.env[envConnectToken];
|
await installCLI();
|
||||||
// If Connect is used, download and install the CLI
|
|
||||||
if (isConnect) {
|
|
||||||
await installCLI();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load secrets
|
// Load secrets
|
||||||
await loadSecrets(shouldExportEnv);
|
await loadSecrets(shouldExportEnv);
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import * as exec from "@actions/exec";
|
import * as exec from "@actions/exec";
|
||||||
import { read, setClientInfo } from "@1password/op-js";
|
import { read, setClientInfo } from "@1password/op-js";
|
||||||
import { createClient, Secrets } from "@1password/sdk";
|
|
||||||
import {
|
import {
|
||||||
extractSecret,
|
extractSecret,
|
||||||
loadSecrets,
|
loadSecrets,
|
||||||
@@ -16,20 +15,7 @@ import {
|
|||||||
envServiceAccountToken,
|
envServiceAccountToken,
|
||||||
} from "./constants";
|
} from "./constants";
|
||||||
|
|
||||||
jest.mock("@actions/core");
|
|
||||||
jest.mock("@actions/exec", () => ({
|
|
||||||
getExecOutput: jest.fn(() => ({
|
|
||||||
stdout: "MOCK_SECRET",
|
|
||||||
})),
|
|
||||||
}));
|
|
||||||
jest.mock("@1password/op-js");
|
jest.mock("@1password/op-js");
|
||||||
jest.mock("@1password/sdk", () => ({
|
|
||||||
createClient: jest.fn(),
|
|
||||||
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
||||||
Secrets: {
|
|
||||||
validateSecretReference: jest.fn(),
|
|
||||||
},
|
|
||||||
}));
|
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
@@ -151,13 +137,7 @@ describe("extractSecret", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("loadSecrets when using Connect", () => {
|
describe("loadSecrets", () => {
|
||||||
beforeEach(() => {
|
|
||||||
process.env[envConnectHost] = "https://localhost:8000";
|
|
||||||
process.env[envConnectToken] = "token";
|
|
||||||
process.env[envServiceAccountToken] = "";
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets the client info and gets the executed output", async () => {
|
it("sets the client info and gets the executed output", async () => {
|
||||||
await loadSecrets(true);
|
await loadSecrets(true);
|
||||||
|
|
||||||
@@ -195,199 +175,6 @@ describe("loadSecrets when using Connect", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("loadSecrets when using Service Account", () => {
|
|
||||||
const mockResolve = jest.fn();
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
process.env[envConnectHost] = "";
|
|
||||||
process.env[envConnectToken] = "";
|
|
||||||
process.env[envServiceAccountToken] = "ops_token";
|
|
||||||
|
|
||||||
Object.keys(process.env).forEach((key) => {
|
|
||||||
if (
|
|
||||||
typeof process.env[key] === "string" &&
|
|
||||||
process.env[key]?.startsWith("op://")
|
|
||||||
) {
|
|
||||||
delete process.env[key];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
process.env.MY_SECRET = "op://vault/item/field";
|
|
||||||
|
|
||||||
(createClient as jest.Mock).mockResolvedValue({
|
|
||||||
secrets: { resolve: mockResolve },
|
|
||||||
});
|
|
||||||
|
|
||||||
mockResolve.mockResolvedValue("resolved-secret-value");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not call op env ls when using Service Account", async () => {
|
|
||||||
await loadSecrets(false);
|
|
||||||
expect(exec.getExecOutput).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("sets step output with resolved value when export-env is false", async () => {
|
|
||||||
await loadSecrets(false);
|
|
||||||
expect(core.setOutput).toHaveBeenCalledTimes(1);
|
|
||||||
expect(core.setOutput).toHaveBeenCalledWith(
|
|
||||||
"MY_SECRET",
|
|
||||||
"resolved-secret-value",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("masks secret with setSecret when export-env is false", async () => {
|
|
||||||
await loadSecrets(false);
|
|
||||||
expect(core.setSecret).toHaveBeenCalledTimes(1);
|
|
||||||
expect(core.setSecret).toHaveBeenCalledWith("resolved-secret-value");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not call exportVariable when export-env is false", async () => {
|
|
||||||
await loadSecrets(false);
|
|
||||||
expect(core.exportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("exports env and sets OP_MANAGED_VARIABLES when export-env is true", async () => {
|
|
||||||
await loadSecrets(true);
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith(
|
|
||||||
"MY_SECRET",
|
|
||||||
"resolved-secret-value",
|
|
||||||
);
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith(
|
|
||||||
envManagedVariables,
|
|
||||||
"MY_SECRET",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does not set step output when export-env is true", async () => {
|
|
||||||
await loadSecrets(true);
|
|
||||||
expect(core.setOutput).not.toHaveBeenCalledWith(
|
|
||||||
"MY_SECRET",
|
|
||||||
expect.anything(),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("masks secret with setSecret when export-env is true", async () => {
|
|
||||||
await loadSecrets(true);
|
|
||||||
expect(core.setSecret).toHaveBeenCalledTimes(1);
|
|
||||||
expect(core.setSecret).toHaveBeenCalledWith("resolved-secret-value");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("returns early when no env vars have op:// refs", async () => {
|
|
||||||
Object.keys(process.env).forEach((key) => {
|
|
||||||
if (
|
|
||||||
typeof process.env[key] === "string" &&
|
|
||||||
process.env[key]?.startsWith("op://")
|
|
||||||
) {
|
|
||||||
delete process.env[key];
|
|
||||||
}
|
|
||||||
});
|
|
||||||
await loadSecrets(true);
|
|
||||||
expect(exec.getExecOutput).not.toHaveBeenCalled();
|
|
||||||
expect(core.exportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("wraps createClient errors with a descriptive message", async () => {
|
|
||||||
(createClient as jest.Mock).mockRejectedValue(
|
|
||||||
new Error("invalid token format"),
|
|
||||||
);
|
|
||||||
await expect(loadSecrets(false)).rejects.toThrow(
|
|
||||||
"Service account authentication failed: invalid token format",
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("multiple refs", () => {
|
|
||||||
const ref1 = "op://vault/item/field";
|
|
||||||
const ref2 = "op://vault/other/item";
|
|
||||||
const ref3 = "op://vault/file/secret";
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
process.env.MY_SECRET = ref1;
|
|
||||||
process.env.ANOTHER_SECRET = ref2;
|
|
||||||
process.env.FILE_SECRET = ref3;
|
|
||||||
|
|
||||||
mockResolve
|
|
||||||
.mockResolvedValueOnce("value1")
|
|
||||||
.mockResolvedValueOnce("value2")
|
|
||||||
.mockResolvedValueOnce("value3");
|
|
||||||
});
|
|
||||||
|
|
||||||
it("resolves each ref and sets step output for each when export-env is false", async () => {
|
|
||||||
await loadSecrets(false);
|
|
||||||
|
|
||||||
expect(mockResolve).toHaveBeenCalledTimes(3);
|
|
||||||
expect(mockResolve).toHaveBeenCalledWith(ref1);
|
|
||||||
expect(mockResolve).toHaveBeenCalledWith(ref2);
|
|
||||||
expect(mockResolve).toHaveBeenCalledWith(ref3);
|
|
||||||
|
|
||||||
expect(core.setOutput).toHaveBeenCalledTimes(3);
|
|
||||||
expect(core.setOutput).toHaveBeenCalledWith("MY_SECRET", "value1");
|
|
||||||
expect(core.setOutput).toHaveBeenCalledWith("ANOTHER_SECRET", "value2");
|
|
||||||
expect(core.setOutput).toHaveBeenCalledWith("FILE_SECRET", "value3");
|
|
||||||
|
|
||||||
expect(core.setSecret).toHaveBeenCalledTimes(3);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("resolves each ref and exports each and sets OP_MANAGED_VARIABLES when export-env is true", async () => {
|
|
||||||
await loadSecrets(true);
|
|
||||||
|
|
||||||
expect(mockResolve).toHaveBeenCalledTimes(3);
|
|
||||||
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith("MY_SECRET", "value1");
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith(
|
|
||||||
"ANOTHER_SECRET",
|
|
||||||
"value2",
|
|
||||||
);
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith("FILE_SECRET", "value3");
|
|
||||||
|
|
||||||
const exportVariableCalls = (core.exportVariable as jest.Mock).mock
|
|
||||||
.calls as [string, string][];
|
|
||||||
const managedVarsCall = exportVariableCalls.find(
|
|
||||||
([name]) => name === envManagedVariables,
|
|
||||||
);
|
|
||||||
expect(managedVarsCall).toBeDefined();
|
|
||||||
const managedList = (managedVarsCall as [string, string])[1].split(",");
|
|
||||||
expect(managedList).toContain("MY_SECRET");
|
|
||||||
expect(managedList).toContain("ANOTHER_SECRET");
|
|
||||||
expect(managedList).toContain("FILE_SECRET");
|
|
||||||
expect(managedList).toHaveLength(3);
|
|
||||||
|
|
||||||
expect(core.setSecret).toHaveBeenCalledTimes(3);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("secret reference validation", () => {
|
|
||||||
it("fails with clear message when a secret reference is invalid", async () => {
|
|
||||||
process.env.MY_SECRET = "op://x";
|
|
||||||
(Secrets.validateSecretReference as jest.Mock).mockImplementationOnce(
|
|
||||||
() => {
|
|
||||||
throw new Error("invalid reference format");
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
await expect(loadSecrets(true)).rejects.toThrow(
|
|
||||||
"Invalid secret reference(s): MY_SECRET",
|
|
||||||
);
|
|
||||||
expect(mockResolve).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("validates all refs before resolving any secrets", async () => {
|
|
||||||
process.env.MY_SECRET = "op://vault/item/field";
|
|
||||||
process.env.OTHER = "op://vault/other/item";
|
|
||||||
(Secrets.validateSecretReference as jest.Mock).mockImplementation(
|
|
||||||
(ref: string) => {
|
|
||||||
if (ref === "op://vault/other/item") {
|
|
||||||
throw new Error("invalid");
|
|
||||||
}
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
await expect(loadSecrets(false)).rejects.toThrow(
|
|
||||||
"Invalid secret reference(s): OTHER",
|
|
||||||
);
|
|
||||||
expect(mockResolve).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("unsetPrevious", () => {
|
describe("unsetPrevious", () => {
|
||||||
const testManagedEnv = "TEST_SECRET";
|
const testManagedEnv = "TEST_SECRET";
|
||||||
const testSecretValue = "MyS3cr#T";
|
const testSecretValue = "MyS3cr#T";
|
||||||
|
|||||||
127
src/utils.ts
127
src/utils.ts
@@ -1,7 +1,6 @@
|
|||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import * as exec from "@actions/exec";
|
import * as exec from "@actions/exec";
|
||||||
import { read, setClientInfo, semverToInt } from "@1password/op-js";
|
import { read, setClientInfo, semverToInt } from "@1password/op-js";
|
||||||
import { createClient, Secrets } from "@1password/sdk";
|
|
||||||
import { version } from "../package.json";
|
import { version } from "../package.json";
|
||||||
import {
|
import {
|
||||||
authErr,
|
authErr,
|
||||||
@@ -30,60 +29,12 @@ export const validateAuth = (): void => {
|
|||||||
core.info(`Authenticated with ${authType}.`);
|
core.info(`Authenticated with ${authType}.`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const getEnvVarNamesWithSecretRefs = (): string[] =>
|
|
||||||
Object.keys(process.env).filter(
|
|
||||||
(key) =>
|
|
||||||
typeof process.env[key] === "string" &&
|
|
||||||
process.env[key]?.startsWith("op://"),
|
|
||||||
);
|
|
||||||
|
|
||||||
const validateSecretRefs = (envNames: string[]): void => {
|
|
||||||
const invalid: { name: string; message: string }[] = [];
|
|
||||||
|
|
||||||
for (const envName of envNames) {
|
|
||||||
const ref = process.env[envName];
|
|
||||||
if (!ref) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
Secrets.validateSecretReference(ref);
|
|
||||||
} catch (err) {
|
|
||||||
const message = err instanceof Error ? err.message : String(err);
|
|
||||||
invalid.push({ name: envName, message });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Throw an error if any secret references are invalid
|
|
||||||
if (invalid.length > 0) {
|
|
||||||
const details = invalid
|
|
||||||
.map(({ name, message }) => `${name}: ${message}`)
|
|
||||||
.join("; ");
|
|
||||||
throw new Error(`Invalid secret reference(s): ${details}`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const setResolvedSecret = (
|
|
||||||
envName: string,
|
|
||||||
secretValue: string,
|
|
||||||
shouldExportEnv: boolean,
|
|
||||||
): void => {
|
|
||||||
core.info(`Populating variable: ${envName}`);
|
|
||||||
|
|
||||||
if (shouldExportEnv) {
|
|
||||||
core.exportVariable(envName, secretValue);
|
|
||||||
} else {
|
|
||||||
core.setOutput(envName, secretValue);
|
|
||||||
}
|
|
||||||
if (secretValue) {
|
|
||||||
core.setSecret(secretValue);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const extractSecret = (
|
export const extractSecret = (
|
||||||
envName: string,
|
envName: string,
|
||||||
shouldExportEnv: boolean,
|
shouldExportEnv: boolean,
|
||||||
): void => {
|
): void => {
|
||||||
|
core.info(`Populating variable: ${envName}`);
|
||||||
|
|
||||||
const ref = process.env[envName];
|
const ref = process.env[envName];
|
||||||
if (!ref) {
|
if (!ref) {
|
||||||
return;
|
return;
|
||||||
@@ -94,13 +45,20 @@ export const extractSecret = (
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
setResolvedSecret(envName, secretValue, shouldExportEnv);
|
if (shouldExportEnv) {
|
||||||
|
core.exportVariable(envName, secretValue);
|
||||||
|
} else {
|
||||||
|
core.setOutput(envName, secretValue);
|
||||||
|
}
|
||||||
|
// Skip setSecret for empty strings to avoid the warning:
|
||||||
|
// "Can't add secret mask for empty string in ##[add-mask] command."
|
||||||
|
if (secretValue) {
|
||||||
|
core.setSecret(secretValue);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Connect loads secrets via the 1Password CLI
|
export const loadSecrets = async (shouldExportEnv: boolean): Promise<void> => {
|
||||||
const loadSecretsViaConnect = async (
|
// Pass User-Agent Information to the 1Password CLI
|
||||||
shouldExportEnv: boolean,
|
|
||||||
): Promise<void> => {
|
|
||||||
setClientInfo({
|
setClientInfo({
|
||||||
name: "1Password GitHub Action",
|
name: "1Password GitHub Action",
|
||||||
id: "GHA",
|
id: "GHA",
|
||||||
@@ -125,63 +83,6 @@ const loadSecretsViaConnect = async (
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Service Account loads secrets via the 1Password SDK
|
|
||||||
const loadSecretsViaServiceAccount = async (
|
|
||||||
shouldExportEnv: boolean,
|
|
||||||
): Promise<void> => {
|
|
||||||
const envs = getEnvVarNamesWithSecretRefs();
|
|
||||||
if (envs.length === 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
validateSecretRefs(envs);
|
|
||||||
|
|
||||||
const token = process.env[envServiceAccountToken];
|
|
||||||
if (!token) {
|
|
||||||
throw new Error(authErr);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Authenticate with the 1Password SDK
|
|
||||||
let client;
|
|
||||||
try {
|
|
||||||
client = await createClient({
|
|
||||||
auth: token,
|
|
||||||
integrationName: "1Password GitHub Action",
|
|
||||||
integrationVersion: version,
|
|
||||||
});
|
|
||||||
} catch (err) {
|
|
||||||
const message = err instanceof Error ? err.message : String(err);
|
|
||||||
throw new Error(`Service account authentication failed: ${message}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const envName of envs) {
|
|
||||||
const ref = process.env[envName];
|
|
||||||
if (!ref) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Resolve the secret value using the 1Password SDK
|
|
||||||
// and make it available either as step outputs or as environment variables
|
|
||||||
const secretValue = await client.secrets.resolve(ref);
|
|
||||||
setResolvedSecret(envName, secretValue, shouldExportEnv);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shouldExportEnv) {
|
|
||||||
core.exportVariable(envManagedVariables, envs.join());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
export const loadSecrets = async (shouldExportEnv: boolean): Promise<void> => {
|
|
||||||
const isConnect = process.env[envConnectHost] && process.env[envConnectToken];
|
|
||||||
|
|
||||||
if (isConnect) {
|
|
||||||
await loadSecretsViaConnect(shouldExportEnv);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
await loadSecretsViaServiceAccount(shouldExportEnv);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const unsetPrevious = (): void => {
|
export const unsetPrevious = (): void => {
|
||||||
if (process.env[envManagedVariables]) {
|
if (process.env[envManagedVariables]) {
|
||||||
core.info("Unsetting previous values ...");
|
core.info("Unsetting previous values ...");
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ IApTbyBwbGVhc2UgZG9uJ3QgcmVwb3J0IGl0IQo=
|
|||||||
EOF
|
EOF
|
||||||
)"
|
)"
|
||||||
readonly MULTILINE_SECRET
|
readonly MULTILINE_SECRET
|
||||||
|
readonly WEBSITE="www.test.com"
|
||||||
|
|
||||||
assert_env_equals "SECRET" "${SECRET}"
|
assert_env_equals "SECRET" "${SECRET}"
|
||||||
assert_env_equals "FILE_SECRET" "${SECRET}"
|
assert_env_equals "FILE_SECRET" "${SECRET}"
|
||||||
@@ -35,3 +36,9 @@ assert_env_equals "FILE_SECRET_IN_SECTION" "${SECRET}"
|
|||||||
|
|
||||||
assert_env_equals "MULTILINE_SECRET" "${MULTILINE_SECRET}"
|
assert_env_equals "MULTILINE_SECRET" "${MULTILINE_SECRET}"
|
||||||
assert_env_equals "FILE_MULTILINE_SECRET" "${MULTILINE_SECRET}"
|
assert_env_equals "FILE_MULTILINE_SECRET" "${MULTILINE_SECRET}"
|
||||||
|
|
||||||
|
# WEBSITE/FILE_WEBSITE: required when ASSERT_WEBSITE=true (Service Account), skipped when false (Connect)
|
||||||
|
if [ "${ASSERT_WEBSITE:-false}" = "true" ]; then
|
||||||
|
assert_env_equals "WEBSITE" "${WEBSITE}"
|
||||||
|
assert_env_equals "FILE_WEBSITE" "${WEBSITE}"
|
||||||
|
fi
|
||||||
|
|||||||
@@ -17,3 +17,11 @@ assert_env_unset "FILE_SECRET_IN_SECTION"
|
|||||||
|
|
||||||
assert_env_unset "MULTILINE_SECRET"
|
assert_env_unset "MULTILINE_SECRET"
|
||||||
assert_env_unset "FILE_MULTILINE_SECRET"
|
assert_env_unset "FILE_MULTILINE_SECRET"
|
||||||
|
|
||||||
|
assert_env_unset "WEBSITE"
|
||||||
|
assert_env_unset "FILE_WEBSITE"
|
||||||
|
|
||||||
|
assert_env_unset "TEST_SSH_KEY"
|
||||||
|
assert_env_unset "FILE_TEST_SSH_KEY"
|
||||||
|
assert_env_unset "TEST_SSH_KEY_OPENSSH"
|
||||||
|
assert_env_unset "FILE_TEST_SSH_KEY_OPENSSH"
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
if [ "$STEP_OUTCOME" != "failure" ]; then
|
|
||||||
echo "Expected action to fail on invalid ref, got: $STEP_OUTCOME"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo "Action correctly failed on invalid ref"
|
|
||||||
26
tests/assert-ssh-keys-set.sh
Executable file
26
tests/assert-ssh-keys-set.sh
Executable file
@@ -0,0 +1,26 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
assert_ssh_key_set() {
|
||||||
|
local var="$1"
|
||||||
|
local val
|
||||||
|
val="$(printenv "$var" || true)"
|
||||||
|
if [ -z "$val" ]; then
|
||||||
|
echo "Expected $var to be set"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
[ "$val" = "***" ] && return 0
|
||||||
|
local line
|
||||||
|
line="$(echo "$val" | head -1)"
|
||||||
|
if echo "$var" | grep -q "OPENSSH"; then
|
||||||
|
echo "$line" | grep -q "OPENSSH" || { echo "Expected $var to start with -----BEGIN OPENSSH PRIVATE KEY-----"; exit 1; }
|
||||||
|
else
|
||||||
|
echo "$line" | grep -q "BEGIN.*PRIVATE KEY" || { echo "Expected $var to be a private key"; exit 1; }
|
||||||
|
fi
|
||||||
|
echo "$var OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_ssh_key_set "TEST_SSH_KEY"
|
||||||
|
assert_ssh_key_set "TEST_SSH_KEY_OPENSSH"
|
||||||
|
assert_ssh_key_set "FILE_TEST_SSH_KEY"
|
||||||
|
assert_ssh_key_set "FILE_TEST_SSH_KEY_OPENSSH"
|
||||||
Reference in New Issue
Block a user