mirror of
https://github.com/aws-actions/configure-aws-credentials.git
synced 2026-09-01 05:45:06 +09:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ee662900a5 | |||
| db6655e0af | |||
| 82c08e4055 | |||
| 816f5cc0cf | |||
| a5771a059f | |||
| dc0dd17052 | |||
| 9f5d66e392 | |||
| fb645e2d6b | |||
| 64d137fefc | |||
| af8cbf10db | |||
| da090bd22d | |||
| 3c4f95f73f | |||
| 96c6f7e07b | |||
| 47312577c9 | |||
| 1c435bbd5e | |||
| 4d0082acf8 | |||
| 058322d68a | |||
| 18a20dfee9 | |||
| 9b3e97711b | |||
| 55f6a14016 | |||
| e8a907912d | |||
| 3a0d6924fb | |||
| d317dedbb3 |
@@ -3,3 +3,7 @@ update_configs:
|
|||||||
- package_manager: "javascript"
|
- package_manager: "javascript"
|
||||||
directory: "/"
|
directory: "/"
|
||||||
update_schedule: "monthly"
|
update_schedule: "monthly"
|
||||||
|
automerged_updates:
|
||||||
|
- match:
|
||||||
|
dependency_type: "all"
|
||||||
|
update_type: "semver:minor"
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
pull_request_rules:
|
||||||
|
- name: Automatically merge on CI success and review approval
|
||||||
|
conditions:
|
||||||
|
- base~=master|integ-tests
|
||||||
|
- "#approved-reviews-by>=1"
|
||||||
|
- approved-reviews-by=@aws-actions/aws-ecs-devx
|
||||||
|
- -approved-reviews-by~=author
|
||||||
|
- status-success=Run Unit Tests
|
||||||
|
- status-success=Semantic Pull Request
|
||||||
|
- label!=work-in-progress
|
||||||
|
- -title~=(WIP|wip)
|
||||||
|
- -merged
|
||||||
|
- -closed
|
||||||
|
- author!=dependabot[bot]
|
||||||
|
- author!=dependabot-preview[bot]
|
||||||
|
actions:
|
||||||
|
merge:
|
||||||
|
method: squash
|
||||||
|
strict: smart
|
||||||
|
strict_method: merge
|
||||||
|
|
||||||
|
- name: Automatically approve Dependabot PRs
|
||||||
|
conditions:
|
||||||
|
- base=master
|
||||||
|
- author~=^dependabot(|-preview)\[bot\]$
|
||||||
|
- -title~=(WIP|wip)
|
||||||
|
- -label~=(blocked|do-not-merge)
|
||||||
|
- -merged
|
||||||
|
- -closed
|
||||||
|
actions:
|
||||||
|
review:
|
||||||
|
type: APPROVE
|
||||||
@@ -2,6 +2,29 @@
|
|||||||
|
|
||||||
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
|
||||||
|
|
||||||
|
## [1.2.0](https://github.com/aws-actions/configure-aws-credentials/compare/v1.1.2...v1.2.0) (2020-03-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add option to provide external ID ([#32](https://github.com/aws-actions/configure-aws-credentials/issues/32)) ([1c435bb](https://github.com/aws-actions/configure-aws-credentials/commit/1c435bbd5e1f1d36cdd703da5c4d6ee1ad91efac)), closes [#28](https://github.com/aws-actions/configure-aws-credentials/issues/28)
|
||||||
|
* Have an ability to configure session name ([#29](https://github.com/aws-actions/configure-aws-credentials/issues/29)) ([4d0082a](https://github.com/aws-actions/configure-aws-credentials/commit/4d0082acf8b4102597f2570a056a320194f13e63))
|
||||||
|
* infer role ARN if given role name ([#35](https://github.com/aws-actions/configure-aws-credentials/issues/35)) ([96c6f7e](https://github.com/aws-actions/configure-aws-credentials/commit/96c6f7e07b5fabc5a907fce84745ea625eeb005d))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* mask both source and role credentials ([#40](https://github.com/aws-actions/configure-aws-credentials/issues/40)) ([816f5cc](https://github.com/aws-actions/configure-aws-credentials/commit/816f5cc0cf79541b2a6d639e8f93ae43aadaf09c))
|
||||||
|
|
||||||
|
### [1.1.2](https://github.com/aws-actions/configure-aws-credentials/compare/v1.1.1...v1.1.2) (2020-02-12)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* change sanitization character from '*' to '_' ([55f6a14](https://github.com/aws-actions/configure-aws-credentials/commit/55f6a14016cb47190b15751dcce450441bba35e3))
|
||||||
|
|
||||||
|
### [1.1.1](https://github.com/aws-actions/configure-aws-credentials/compare/v1.1.0...v1.1.1) (2020-02-07)
|
||||||
|
|
||||||
## [1.1.0](https://github.com/aws-actions/configure-aws-credentials/compare/v1.0.1...v1.1.0) (2020-02-06)
|
## [1.1.0](https://github.com/aws-actions/configure-aws-credentials/compare/v1.0.1...v1.1.0) (2020-02-06)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,30 @@ Add the following step to your workflow:
|
|||||||
aws-region: us-east-2
|
aws-region: us-east-2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For example, you can use this action with the AWS CLI available in [GitHub's hosted virtual environments](https://help.github.com/en/actions/reference/software-installed-on-github-hosted-runners).
|
||||||
|
|
||||||
|
```
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
name: Upload to Amazon S3
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Configure AWS credentials
|
||||||
|
uses: aws-actions/configure-aws-credentials@v1
|
||||||
|
with:
|
||||||
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
|
aws-region: us-east-2
|
||||||
|
|
||||||
|
- name: Copy files to S3 with the AWS CLI
|
||||||
|
run: |
|
||||||
|
aws s3 sync . s3://my-s3-website-bucket
|
||||||
|
```
|
||||||
|
|
||||||
See [action.yml](action.yml) for the full documentation for this action's inputs and outputs.
|
See [action.yml](action.yml) for the full documentation for this action's inputs and outputs.
|
||||||
|
|
||||||
## Credentials
|
## Credentials
|
||||||
@@ -27,9 +51,10 @@ We recommend following [Amazon IAM best practices](https://docs.aws.amazon.com/I
|
|||||||
* [Monitor the activity](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#keep-a-log) of the credentials used in GitHub Actions workflows.
|
* [Monitor the activity](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#keep-a-log) of the credentials used in GitHub Actions workflows.
|
||||||
|
|
||||||
## Assuming a role
|
## Assuming a role
|
||||||
If you would like to use the credentials you provide to this action to assume a role, you can do so by specifying the role ARN in `role-to-assume`.
|
If you would like to use the static credentials you provide to this action to assume a role, you can do so by specifying the role ARN in `role-to-assume`.
|
||||||
The role credentials will then be output instead of the ones you have provided.
|
The role credentials will then be configured in the Actions environment instead of the static credentials you have provided.
|
||||||
The default session duration is 6 hours, but if you would like to adjust this you can pass a duration to `role-duration-seconds`.
|
The default session duration is 6 hours, but if you would like to adjust this you can pass a duration to `role-duration-seconds`.
|
||||||
|
The default session name is GitHubActions, and you can modify it by specifying the desired name in `role-session-name`.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
```yaml
|
```yaml
|
||||||
@@ -39,12 +64,58 @@ Example:
|
|||||||
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
|
||||||
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
|
||||||
aws-region: us-east-2
|
aws-region: us-east-2
|
||||||
role-to-assume: arn:aws:iam::123456789100:role/role-to-assume
|
role-to-assume: ${{ secrets.AWS_ROLE_TO_ASSUME }}
|
||||||
|
role-external-id: ${{ secrets.AWS_ROLE_EXTERNAL_ID }}
|
||||||
role-duration-seconds: 1200
|
role-duration-seconds: 1200
|
||||||
|
role-session-name: MySessionName
|
||||||
|
```
|
||||||
|
In this example, the secret `AWS_ROLE_TO_ASSUME` contains a string like `arn:aws:iam::123456789100:role/my-github-actions-role`. To assume a role in the same account as the static credentials, you can simply specify the role name, like `role-to-assume: my-github-actions-role`.
|
||||||
|
|
||||||
|
### Permissions
|
||||||
|
|
||||||
|
In order to assume a role, the IAM user for the static credentials must have the following permissions:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Action": [
|
||||||
|
"sts:AssumeRole",
|
||||||
|
"sts:TagSession"
|
||||||
|
],
|
||||||
|
"Resource": "arn:aws:iam::123456789012:role/my-github-actions-role",
|
||||||
|
"Effect": "Allow"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The role's trust policy must allow the IAM user to assume the role:
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Version": "2012-10-17",
|
||||||
|
"Statement": [
|
||||||
|
{
|
||||||
|
"Sid": "AllowIamUserAssumeRole",
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Action": "sts:AssumeRole",
|
||||||
|
"Principal": {"AWS": "arn:aws:iam::123456789012:user/my-github-actions-user"},
|
||||||
|
"Condition": {
|
||||||
|
"StringEquals": {"sts:ExternalId": "Example987"}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"Sid": "AllowPassSessionTags",
|
||||||
|
"Effect": "Allow",
|
||||||
|
"Action": "sts:TagSession",
|
||||||
|
"Principal": {"AWS": "arn:aws:iam::123456789012:user/my-github-actions-user"}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### Session tagging
|
### Session tagging
|
||||||
The session will have the name "GitHubActions" and be tagged with the following tags:
|
The session will have the name "GitHubActions" and be tagged with the following tags:
|
||||||
(`GITHUB_` environment variable definitions can be [found here](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/using-environment-variables#default-environment-variables))
|
(`GITHUB_` environment variable definitions can be [found here](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/using-environment-variables#default-environment-variables))
|
||||||
|
|
||||||
| Key | Value|
|
| Key | Value|
|
||||||
|
|||||||
+14
-2
@@ -17,14 +17,26 @@ inputs:
|
|||||||
description: 'AWS Region, e.g. us-east-2'
|
description: 'AWS Region, e.g. us-east-2'
|
||||||
required: true
|
required: true
|
||||||
mask-aws-account-id:
|
mask-aws-account-id:
|
||||||
description: "Whether to set the AWS account ID for these credentials as a secret value, so that it is masked in logs. Valid values are 'true' and 'false'. Defaults to true"
|
description: >-
|
||||||
|
Whether to set the AWS account ID for these credentials as a secret value,
|
||||||
|
so that it is masked in logs. Valid values are 'true' and 'false'.
|
||||||
|
Defaults to true
|
||||||
required: false
|
required: false
|
||||||
role-to-assume:
|
role-to-assume:
|
||||||
description: "Use the provided credentials to assume a Role and output the assumed credentials for that Role rather than the provided credentials"
|
description: >-
|
||||||
|
Use the provided credentials to assume an IAM role and configure the Actions
|
||||||
|
environment with the assumed role credentials rather than with the provided
|
||||||
|
credentials
|
||||||
required: false
|
required: false
|
||||||
role-duration-seconds:
|
role-duration-seconds:
|
||||||
description: "Role duration in seconds (default: 6 hours)"
|
description: "Role duration in seconds (default: 6 hours)"
|
||||||
required: false
|
required: false
|
||||||
|
role-session-name:
|
||||||
|
description: 'Role session name (default: GitHubActions)'
|
||||||
|
required: false
|
||||||
|
role-external-id:
|
||||||
|
description: 'The external ID of the role to assume'
|
||||||
|
required: false
|
||||||
outputs:
|
outputs:
|
||||||
aws-account-id:
|
aws-account-id:
|
||||||
description: 'The AWS account ID for the provided credentials'
|
description: 'The AWS account ID for the provided credentials'
|
||||||
|
|||||||
Vendored
+218
-140
File diff suppressed because one or more lines are too long
@@ -8,15 +8,23 @@ const util = require('util');
|
|||||||
const MAX_ACTION_RUNTIME = 6 * 3600;
|
const MAX_ACTION_RUNTIME = 6 * 3600;
|
||||||
const USER_AGENT = 'configure-aws-credentials-for-github-actions';
|
const USER_AGENT = 'configure-aws-credentials-for-github-actions';
|
||||||
const MAX_TAG_VALUE_LENGTH = 256;
|
const MAX_TAG_VALUE_LENGTH = 256;
|
||||||
const SANITIZATION_CHARACTER = '*'
|
const SANITIZATION_CHARACTER = '_';
|
||||||
|
const ROLE_SESSION_NAME = 'GitHubActions';
|
||||||
|
|
||||||
async function assumeRole(params) {
|
async function assumeRole(params) {
|
||||||
// Assume a role to get short-lived credentials using longer-lived credentials.
|
// Assume a role to get short-lived credentials using longer-lived credentials.
|
||||||
const isDefined = i => !!i;
|
const isDefined = i => !!i;
|
||||||
|
|
||||||
const {roleToAssume, roleDurationSeconds, accessKeyId, secretAccessKey, sessionToken, region} = params;
|
const {
|
||||||
|
sourceAccountId,
|
||||||
|
roleToAssume,
|
||||||
|
roleExternalId,
|
||||||
|
roleDurationSeconds,
|
||||||
|
roleSessionName,
|
||||||
|
region,
|
||||||
|
} = params;
|
||||||
assert(
|
assert(
|
||||||
[roleToAssume, roleDurationSeconds, accessKeyId, secretAccessKey, region].every(isDefined),
|
[sourceAccountId, roleToAssume, roleDurationSeconds, roleSessionName, region].every(isDefined),
|
||||||
"Missing required input when assuming a Role."
|
"Missing required input when assuming a Role."
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -26,14 +34,17 @@ async function assumeRole(params) {
|
|||||||
'Missing required environment value. Are you running in GitHub Actions?'
|
'Missing required environment value. Are you running in GitHub Actions?'
|
||||||
);
|
);
|
||||||
|
|
||||||
const endpoint = util.format('https://sts.%s.amazonaws.com', region);
|
const sts = getStsClient(region);
|
||||||
|
|
||||||
const sts = new aws.STS({
|
let roleArn = roleToAssume;
|
||||||
accessKeyId, secretAccessKey, sessionToken, region, endpoint, customUserAgent: USER_AGENT
|
if (!roleArn.startsWith('arn:aws')) {
|
||||||
});
|
// Supports only 'aws' partition. Customers in other partitions ('aws-cn') will need to provide full ARN
|
||||||
return sts.assumeRole({
|
roleArn = `arn:aws:iam::${sourceAccountId}:role/${roleArn}`;
|
||||||
RoleArn: roleToAssume,
|
}
|
||||||
RoleSessionName: 'GitHubActions',
|
|
||||||
|
const assumeRoleRequest = {
|
||||||
|
RoleArn: roleArn,
|
||||||
|
RoleSessionName: roleSessionName,
|
||||||
DurationSeconds: roleDurationSeconds,
|
DurationSeconds: roleDurationSeconds,
|
||||||
Tags: [
|
Tags: [
|
||||||
{Key: 'GitHub', Value: 'Actions'},
|
{Key: 'GitHub', Value: 'Actions'},
|
||||||
@@ -44,7 +55,13 @@ async function assumeRole(params) {
|
|||||||
{Key: 'Branch', Value: GITHUB_REF},
|
{Key: 'Branch', Value: GITHUB_REF},
|
||||||
{Key: 'Commit', Value: GITHUB_SHA},
|
{Key: 'Commit', Value: GITHUB_SHA},
|
||||||
]
|
]
|
||||||
})
|
};
|
||||||
|
|
||||||
|
if (roleExternalId) {
|
||||||
|
assumeRoleRequest.ExternalId = roleExternalId;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sts.assumeRole(assumeRoleRequest)
|
||||||
.promise()
|
.promise()
|
||||||
.then(function (data) {
|
.then(function (data) {
|
||||||
return {
|
return {
|
||||||
@@ -100,15 +117,25 @@ function exportRegion(region) {
|
|||||||
core.exportVariable('AWS_REGION', region);
|
core.exportVariable('AWS_REGION', region);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function exportAccountId(maskAccountId) {
|
async function exportAccountId(maskAccountId, region) {
|
||||||
// Get the AWS account ID
|
// Get the AWS account ID
|
||||||
const sts = new aws.STS({customUserAgent: USER_AGENT});
|
const sts = getStsClient(region);
|
||||||
const identity = await sts.getCallerIdentity().promise();
|
const identity = await sts.getCallerIdentity().promise();
|
||||||
const accountId = identity.Account;
|
const accountId = identity.Account;
|
||||||
core.setOutput('aws-account-id', accountId);
|
core.setOutput('aws-account-id', accountId);
|
||||||
if (!maskAccountId || maskAccountId.toLowerCase() == 'true') {
|
if (!maskAccountId || maskAccountId.toLowerCase() == 'true') {
|
||||||
core.setSecret(accountId);
|
core.setSecret(accountId);
|
||||||
}
|
}
|
||||||
|
return accountId;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStsClient(region) {
|
||||||
|
const endpoint = util.format('https://sts.%s.amazonaws.com', region);
|
||||||
|
return new aws.STS({
|
||||||
|
region,
|
||||||
|
endpoint,
|
||||||
|
customUserAgent: USER_AGENT
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async function run() {
|
async function run() {
|
||||||
@@ -120,21 +147,32 @@ async function run() {
|
|||||||
const sessionToken = core.getInput('aws-session-token', { required: false });
|
const sessionToken = core.getInput('aws-session-token', { required: false });
|
||||||
const maskAccountId = core.getInput('mask-aws-account-id', { required: false });
|
const maskAccountId = core.getInput('mask-aws-account-id', { required: false });
|
||||||
const roleToAssume = core.getInput('role-to-assume', {required: false});
|
const roleToAssume = core.getInput('role-to-assume', {required: false});
|
||||||
|
const roleExternalId = core.getInput('role-external-id', { required: false });
|
||||||
const roleDurationSeconds = core.getInput('role-duration-seconds', {required: false}) || MAX_ACTION_RUNTIME;
|
const roleDurationSeconds = core.getInput('role-duration-seconds', {required: false}) || MAX_ACTION_RUNTIME;
|
||||||
|
const roleSessionName = core.getInput('role-session-name', { required: false }) || ROLE_SESSION_NAME;
|
||||||
|
|
||||||
|
// Always export the source credentials and account ID.
|
||||||
|
// The STS client for calling AssumeRole pulls creds from the environment.
|
||||||
|
// Plus, in the assume role case, if the AssumeRole call fails, we want
|
||||||
|
// the source credentials and accound ID to already be masked as secrets
|
||||||
|
// in any error messages.
|
||||||
|
exportRegion(region);
|
||||||
|
exportCredentials({accessKeyId, secretAccessKey, sessionToken});
|
||||||
|
const sourceAccountId = await exportAccountId(maskAccountId, region);
|
||||||
|
|
||||||
// Get role credentials if configured to do so
|
// Get role credentials if configured to do so
|
||||||
if (roleToAssume) {
|
if (roleToAssume) {
|
||||||
const roleCredentials = await assumeRole(
|
const roleCredentials = await assumeRole({
|
||||||
{accessKeyId, secretAccessKey, sessionToken, region, roleToAssume, roleDurationSeconds}
|
sourceAccountId,
|
||||||
);
|
region,
|
||||||
|
roleToAssume,
|
||||||
|
roleExternalId,
|
||||||
|
roleDurationSeconds,
|
||||||
|
roleSessionName
|
||||||
|
});
|
||||||
exportCredentials(roleCredentials);
|
exportCredentials(roleCredentials);
|
||||||
} else {
|
await exportAccountId(maskAccountId, region);
|
||||||
exportCredentials({accessKeyId, secretAccessKey, sessionToken});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
exportRegion(region);
|
|
||||||
|
|
||||||
await exportAccountId(maskAccountId);
|
|
||||||
}
|
}
|
||||||
catch (error) {
|
catch (error) {
|
||||||
core.setFailed(error.message);
|
core.setFailed(error.message);
|
||||||
|
|||||||
+114
-23
@@ -13,7 +13,9 @@ const FAKE_STS_SECRET_ACCESS_KEY = 'STS-AWS-SECRET-ACCESS-KEY';
|
|||||||
const FAKE_STS_SESSION_TOKEN = 'STS-AWS-SESSION-TOKEN';
|
const FAKE_STS_SESSION_TOKEN = 'STS-AWS-SESSION-TOKEN';
|
||||||
const FAKE_REGION = 'fake-region-1';
|
const FAKE_REGION = 'fake-region-1';
|
||||||
const FAKE_ACCOUNT_ID = '123456789012';
|
const FAKE_ACCOUNT_ID = '123456789012';
|
||||||
|
const FAKE_ROLE_ACCOUNT_ID = '111111111111';
|
||||||
const ROLE_NAME = 'MY-ROLE';
|
const ROLE_NAME = 'MY-ROLE';
|
||||||
|
const ROLE_ARN = 'arn:aws:iam::111111111111:role/MY-ROLE';
|
||||||
const ENVIRONMENT_VARIABLE_OVERRIDES = {
|
const ENVIRONMENT_VARIABLE_OVERRIDES = {
|
||||||
SHOW_STACK_TRACE: 'true',
|
SHOW_STACK_TRACE: 'true',
|
||||||
GITHUB_REPOSITORY: 'MY-REPOSITORY-NAME',
|
GITHUB_REPOSITORY: 'MY-REPOSITORY-NAME',
|
||||||
@@ -23,7 +25,7 @@ const ENVIRONMENT_VARIABLE_OVERRIDES = {
|
|||||||
GITHUB_REF: 'MY-BRANCH',
|
GITHUB_REF: 'MY-BRANCH',
|
||||||
GITHUB_SHA: 'MY-COMMIT-ID',
|
GITHUB_SHA: 'MY-COMMIT-ID',
|
||||||
};
|
};
|
||||||
const GITHUB_ACTOR_SANITIZED = 'MY-USERNAME*bot*'
|
const GITHUB_ACTOR_SANITIZED = 'MY-USERNAME_bot_'
|
||||||
|
|
||||||
function mockGetInput(requestResponse) {
|
function mockGetInput(requestResponse) {
|
||||||
return function (name, options) { // eslint-disable-line no-unused-vars
|
return function (name, options) { // eslint-disable-line no-unused-vars
|
||||||
@@ -40,7 +42,7 @@ const DEFAULT_INPUTS = {
|
|||||||
'aws-region': FAKE_REGION,
|
'aws-region': FAKE_REGION,
|
||||||
'mask-aws-account-id': 'TRUE'
|
'mask-aws-account-id': 'TRUE'
|
||||||
};
|
};
|
||||||
const ASSUME_ROLE_INPUTS = {...REQUIRED_INPUTS, 'role-to-assume': ROLE_NAME, 'aws-region': FAKE_REGION};
|
const ASSUME_ROLE_INPUTS = {...REQUIRED_INPUTS, 'role-to-assume': ROLE_ARN, 'aws-region': FAKE_REGION};
|
||||||
|
|
||||||
const mockStsCallerIdentity = jest.fn();
|
const mockStsCallerIdentity = jest.fn();
|
||||||
const mockStsAssumeRole = jest.fn();
|
const mockStsAssumeRole = jest.fn();
|
||||||
@@ -67,13 +69,18 @@ describe('Configure AWS Credentials', () => {
|
|||||||
.fn()
|
.fn()
|
||||||
.mockImplementation(mockGetInput(DEFAULT_INPUTS));
|
.mockImplementation(mockGetInput(DEFAULT_INPUTS));
|
||||||
|
|
||||||
mockStsCallerIdentity.mockImplementation(() => {
|
mockStsCallerIdentity.mockReset();
|
||||||
return {
|
mockStsCallerIdentity
|
||||||
|
.mockReturnValueOnce({
|
||||||
promise() {
|
promise() {
|
||||||
return Promise.resolve({ Account: FAKE_ACCOUNT_ID });
|
return Promise.resolve({ Account: FAKE_ACCOUNT_ID });
|
||||||
}
|
}
|
||||||
};
|
})
|
||||||
});
|
.mockReturnValueOnce({
|
||||||
|
promise() {
|
||||||
|
return Promise.resolve({ Account: FAKE_ROLE_ACCOUNT_ID });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
mockStsAssumeRole.mockImplementation(() => {
|
mockStsAssumeRole.mockImplementation(() => {
|
||||||
return {
|
return {
|
||||||
@@ -153,6 +160,7 @@ describe('Configure AWS Credentials', () => {
|
|||||||
test('error is caught by core.setFailed and caught', async () => {
|
test('error is caught by core.setFailed and caught', async () => {
|
||||||
process.env.SHOW_STACK_TRACE = 'false';
|
process.env.SHOW_STACK_TRACE = 'false';
|
||||||
|
|
||||||
|
mockStsCallerIdentity.mockReset();
|
||||||
mockStsCallerIdentity.mockImplementation(() => {
|
mockStsCallerIdentity.mockImplementation(() => {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
});
|
});
|
||||||
@@ -164,6 +172,7 @@ describe('Configure AWS Credentials', () => {
|
|||||||
|
|
||||||
test('error is caught by core.setFailed and passed', async () => {
|
test('error is caught by core.setFailed and passed', async () => {
|
||||||
|
|
||||||
|
mockStsCallerIdentity.mockReset();
|
||||||
mockStsCallerIdentity.mockImplementation(() => {
|
mockStsCallerIdentity.mockImplementation(() => {
|
||||||
throw new Error();
|
throw new Error();
|
||||||
});
|
});
|
||||||
@@ -180,18 +189,33 @@ describe('Configure AWS Credentials', () => {
|
|||||||
|
|
||||||
await run();
|
await run();
|
||||||
expect(mockStsAssumeRole).toHaveBeenCalledTimes(1);
|
expect(mockStsAssumeRole).toHaveBeenCalledTimes(1);
|
||||||
expect(core.exportVariable).toHaveBeenCalledTimes(5);
|
expect(core.exportVariable).toHaveBeenCalledTimes(7);
|
||||||
expect(core.setSecret).toHaveBeenCalledTimes(4);
|
expect(core.setSecret).toHaveBeenCalledTimes(7);
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith('AWS_ACCESS_KEY_ID', FAKE_STS_ACCESS_KEY_ID);
|
expect(core.setOutput).toHaveBeenCalledTimes(2);
|
||||||
expect(core.setSecret).toHaveBeenCalledWith(FAKE_STS_ACCESS_KEY_ID);
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith('AWS_SECRET_ACCESS_KEY', FAKE_STS_SECRET_ACCESS_KEY);
|
// first the source credentials are exported and masked
|
||||||
expect(core.setSecret).toHaveBeenCalledWith(FAKE_STS_SECRET_ACCESS_KEY);
|
expect(core.setSecret).toHaveBeenNthCalledWith(1, FAKE_ACCESS_KEY_ID);
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith('AWS_SESSION_TOKEN', FAKE_STS_SESSION_TOKEN);
|
expect(core.setSecret).toHaveBeenNthCalledWith(2, FAKE_SECRET_ACCESS_KEY);
|
||||||
expect(core.setSecret).toHaveBeenCalledWith(FAKE_STS_SESSION_TOKEN);
|
expect(core.setSecret).toHaveBeenNthCalledWith(3, FAKE_ACCOUNT_ID);
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith('AWS_DEFAULT_REGION', FAKE_REGION);
|
|
||||||
expect(core.exportVariable).toHaveBeenCalledWith('AWS_REGION', FAKE_REGION);
|
expect(core.exportVariable).toHaveBeenNthCalledWith(1, 'AWS_DEFAULT_REGION', FAKE_REGION);
|
||||||
expect(core.setOutput).toHaveBeenCalledWith('aws-account-id', FAKE_ACCOUNT_ID);
|
expect(core.exportVariable).toHaveBeenNthCalledWith(2, 'AWS_REGION', FAKE_REGION);
|
||||||
expect(core.setSecret).toHaveBeenCalledWith(FAKE_ACCOUNT_ID);
|
expect(core.exportVariable).toHaveBeenNthCalledWith(3, 'AWS_ACCESS_KEY_ID', FAKE_ACCESS_KEY_ID);
|
||||||
|
expect(core.exportVariable).toHaveBeenNthCalledWith(4, 'AWS_SECRET_ACCESS_KEY', FAKE_SECRET_ACCESS_KEY);
|
||||||
|
|
||||||
|
expect(core.setOutput).toHaveBeenNthCalledWith(1, 'aws-account-id', FAKE_ACCOUNT_ID);
|
||||||
|
|
||||||
|
// then the role credentials are exported and masked
|
||||||
|
expect(core.setSecret).toHaveBeenNthCalledWith(4, FAKE_STS_ACCESS_KEY_ID);
|
||||||
|
expect(core.setSecret).toHaveBeenNthCalledWith(5, FAKE_STS_SECRET_ACCESS_KEY);
|
||||||
|
expect(core.setSecret).toHaveBeenNthCalledWith(6, FAKE_STS_SESSION_TOKEN);
|
||||||
|
expect(core.setSecret).toHaveBeenNthCalledWith(7, FAKE_ROLE_ACCOUNT_ID);
|
||||||
|
|
||||||
|
expect(core.exportVariable).toHaveBeenNthCalledWith(5, 'AWS_ACCESS_KEY_ID', FAKE_STS_ACCESS_KEY_ID);
|
||||||
|
expect(core.exportVariable).toHaveBeenNthCalledWith(6, 'AWS_SECRET_ACCESS_KEY', FAKE_STS_SECRET_ACCESS_KEY);
|
||||||
|
expect(core.exportVariable).toHaveBeenNthCalledWith(7, 'AWS_SESSION_TOKEN', FAKE_STS_SESSION_TOKEN);
|
||||||
|
|
||||||
|
expect(core.setOutput).toHaveBeenNthCalledWith(2, 'aws-account-id', FAKE_ROLE_ACCOUNT_ID);
|
||||||
});
|
});
|
||||||
|
|
||||||
test('role assumption tags', async () => {
|
test('role assumption tags', async () => {
|
||||||
@@ -201,7 +225,7 @@ describe('Configure AWS Credentials', () => {
|
|||||||
|
|
||||||
await run();
|
await run();
|
||||||
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
RoleArn: ROLE_NAME,
|
RoleArn: ROLE_ARN,
|
||||||
RoleSessionName: 'GitHubActions',
|
RoleSessionName: 'GitHubActions',
|
||||||
DurationSeconds: 6 * 3600,
|
DurationSeconds: 6 * 3600,
|
||||||
Tags: [
|
Tags: [
|
||||||
@@ -223,7 +247,7 @@ describe('Configure AWS Credentials', () => {
|
|||||||
|
|
||||||
await run();
|
await run();
|
||||||
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
RoleArn: ROLE_NAME,
|
RoleArn: ROLE_ARN,
|
||||||
RoleSessionName: 'GitHubActions',
|
RoleSessionName: 'GitHubActions',
|
||||||
DurationSeconds: 5,
|
DurationSeconds: 5,
|
||||||
Tags: [
|
Tags: [
|
||||||
@@ -238,18 +262,85 @@ describe('Configure AWS Credentials', () => {
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('role assumption session name provided', async () => {
|
||||||
|
core.getInput = jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(mockGetInput({...ASSUME_ROLE_INPUTS, 'role-session-name': 'MySessionName'}));
|
||||||
|
|
||||||
|
await run();
|
||||||
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
|
RoleArn: ROLE_ARN,
|
||||||
|
RoleSessionName: 'MySessionName',
|
||||||
|
DurationSeconds: 6 * 3600,
|
||||||
|
Tags: [
|
||||||
|
{Key: 'GitHub', Value: 'Actions'},
|
||||||
|
{Key: 'Repository', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REPOSITORY},
|
||||||
|
{Key: 'Workflow', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_WORKFLOW},
|
||||||
|
{Key: 'Action', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_ACTION},
|
||||||
|
{Key: 'Actor', Value: GITHUB_ACTOR_SANITIZED},
|
||||||
|
{Key: 'Branch', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REF},
|
||||||
|
{Key: 'Commit', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_SHA},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
test('role name provided instead of ARN', async () => {
|
||||||
|
core.getInput = jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(mockGetInput({...REQUIRED_INPUTS, 'role-to-assume': ROLE_NAME, 'aws-region': FAKE_REGION}));
|
||||||
|
|
||||||
|
await run();
|
||||||
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
|
RoleArn: 'arn:aws:iam::123456789012:role/MY-ROLE',
|
||||||
|
RoleSessionName: 'GitHubActions',
|
||||||
|
DurationSeconds: 6 * 3600,
|
||||||
|
Tags: [
|
||||||
|
{Key: 'GitHub', Value: 'Actions'},
|
||||||
|
{Key: 'Repository', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REPOSITORY},
|
||||||
|
{Key: 'Workflow', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_WORKFLOW},
|
||||||
|
{Key: 'Action', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_ACTION},
|
||||||
|
{Key: 'Actor', Value: GITHUB_ACTOR_SANITIZED},
|
||||||
|
{Key: 'Branch', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REF},
|
||||||
|
{Key: 'Commit', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_SHA},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
test('role external ID provided', async () => {
|
||||||
|
core.getInput = jest
|
||||||
|
.fn()
|
||||||
|
.mockImplementation(mockGetInput({...ASSUME_ROLE_INPUTS, 'role-external-id': 'abcdef'}));
|
||||||
|
|
||||||
|
await run();
|
||||||
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
|
RoleArn: ROLE_ARN,
|
||||||
|
RoleSessionName: 'GitHubActions',
|
||||||
|
DurationSeconds: 6 * 3600,
|
||||||
|
Tags: [
|
||||||
|
{Key: 'GitHub', Value: 'Actions'},
|
||||||
|
{Key: 'Repository', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REPOSITORY},
|
||||||
|
{Key: 'Workflow', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_WORKFLOW},
|
||||||
|
{Key: 'Action', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_ACTION},
|
||||||
|
{Key: 'Actor', Value: GITHUB_ACTOR_SANITIZED},
|
||||||
|
{Key: 'Branch', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_REF},
|
||||||
|
{Key: 'Commit', Value: ENVIRONMENT_VARIABLE_OVERRIDES.GITHUB_SHA},
|
||||||
|
],
|
||||||
|
ExternalId: 'abcdef'
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
test('workflow name sanitized in role assumption tags', async () => {
|
test('workflow name sanitized in role assumption tags', async () => {
|
||||||
core.getInput = jest
|
core.getInput = jest
|
||||||
.fn()
|
.fn()
|
||||||
.mockImplementation(mockGetInput(ASSUME_ROLE_INPUTS));
|
.mockImplementation(mockGetInput(ASSUME_ROLE_INPUTS));
|
||||||
|
|
||||||
process.env = {...process.env, GITHUB_WORKFLOW: 'Workflow!"#$%&\'()*+, -./:;<=>?@[]^_`{|}~🙂💥🍌1yFvMOeD3ZHYsHrGjCceOboMYzBPo0CRNFdcsVRG6UgR3A912a8KfcBtEVvkAS7kRBq80umGff8mux5IN1y55HQWPNBNyaruuVr4islFXte4FDQZexGJRUSMyHQpxJ8OmZnET84oDmbvmIjgxI6IBrdihX9PHMapT4gQvRYnLqNiKb18rEMWDNoZRy51UPX5sWK2GKPipgKSO9kqLckZai9D2AN2RlWCxtMqChNtxuxjqeqhoQZo0oaq39sjcRZgAAAAAAA'};
|
process.env = {...process.env, GITHUB_WORKFLOW: 'Workflow!"#$%&\'()*+, -./:;<=>?@[]^_`{|}~🙂💥🍌1yFvMOeD3ZHYsHrGjCceOboMYzBPo0CRNFdcsVRG6UgR3A912a8KfcBtEVvkAS7kRBq80umGff8mux5IN1y55HQWPNBNyaruuVr4islFXte4FDQZexGJRUSMyHQpxJ8OmZnET84oDmbvmIjgxI6IBrdihX9PHMapT4gQvRYnLqNiKb18rEMWDNoZRy51UPX5sWK2GKPipgKSO9kqLckZai9D2AN2RlWCxtMqChNtxuxjqeqhoQZo0oaq39sjcRZgAAAAAAA'};
|
||||||
|
|
||||||
const sanitizedWorkflowName = 'Workflow**********+, -./:;<=>?@***_********1yFvMOeD3ZHYsHrGjCceOboMYzBPo0CRNFdcsVRG6UgR3A912a8KfcBtEVvkAS7kRBq80umGff8mux5IN1y55HQWPNBNyaruuVr4islFXte4FDQZexGJRUSMyHQpxJ8OmZnET84oDmbvmIjgxI6IBrdihX9PHMapT4gQvRYnLqNiKb18rEMWDNoZRy51UPX5sWK2GKPipgKSO9kqLckZa'
|
const sanitizedWorkflowName = 'Workflow__________+, -./:;<=>?@____________1yFvMOeD3ZHYsHrGjCceOboMYzBPo0CRNFdcsVRG6UgR3A912a8KfcBtEVvkAS7kRBq80umGff8mux5IN1y55HQWPNBNyaruuVr4islFXte4FDQZexGJRUSMyHQpxJ8OmZnET84oDmbvmIjgxI6IBrdihX9PHMapT4gQvRYnLqNiKb18rEMWDNoZRy51UPX5sWK2GKPipgKSO9kqLckZa'
|
||||||
|
|
||||||
await run();
|
await run();
|
||||||
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
expect(mockStsAssumeRole).toHaveBeenCalledWith({
|
||||||
RoleArn: ROLE_NAME,
|
RoleArn: ROLE_ARN,
|
||||||
RoleSessionName: 'GitHubActions',
|
RoleSessionName: 'GitHubActions',
|
||||||
DurationSeconds: 6 * 3600,
|
DurationSeconds: 6 * 3600,
|
||||||
Tags: [
|
Tags: [
|
||||||
|
|||||||
Generated
+13
-18
@@ -1,13 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "aws-actions-configure-aws-credentials",
|
"name": "aws-actions-configure-aws-credentials",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": {
|
"@actions/core": {
|
||||||
"version": "1.2.2",
|
"version": "1.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.3.tgz",
|
||||||
"integrity": "sha512-IbCx7oefq+Gi6FWbSs2Fnw8VkEI6Y4gvjrYprY3RV//ksq/KPMlClOerJ4jRosyal6zkUIc8R9fS/cpRMlGClg=="
|
"integrity": "sha512-Wp4xnyokakM45Uuj4WLUxdsa8fJjKVl1fDTsPbTEcTcuu0Nb26IPQbOtjmnfaCPGcaoPOOqId8H9NapZ8gii4w=="
|
||||||
},
|
},
|
||||||
"@babel/code-frame": {
|
"@babel/code-frame": {
|
||||||
"version": "7.5.5",
|
"version": "7.5.5",
|
||||||
@@ -843,9 +843,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@zeit/ncc": {
|
"@zeit/ncc": {
|
||||||
"version": "0.21.0",
|
"version": "0.21.1",
|
||||||
"resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.21.0.tgz",
|
"resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.21.1.tgz",
|
||||||
"integrity": "sha512-RUMdvVK/w78oo+yBjruZltt0kJXYar2un/1bYQ2LuHG7GmFVm+QjxzEmySwREctaJdEnBvlMdUNWd9hXHxEI3g==",
|
"integrity": "sha512-M9WzgquSOt2nsjRkYM9LRylBLmmlwNCwYbm3Up3PDEshfvdmIfqpFNSK8EJvR18NwZjGHE5z2avlDtYQx2JQnw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"abab": {
|
"abab": {
|
||||||
@@ -1015,9 +1015,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"aws-sdk": {
|
"aws-sdk": {
|
||||||
"version": "2.610.0",
|
"version": "2.633.0",
|
||||||
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.610.0.tgz",
|
"resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.633.0.tgz",
|
||||||
"integrity": "sha512-kqcoCTKjbxrUo2KeLQR2Jw6l4PvkbHXSDk8KqF2hXcpHibiOcMXZZPVe9X+s90RC/B2+qU95M7FImp9ByMcw7A==",
|
"integrity": "sha512-C28/GefIQ+Dk1hjPQrpG1Yt9RdvqeFMP4nb6iActanoGq5JTSJU9103ukpBzrHz96fvjhIRogrvfOhDKubbcjw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"buffer": "4.9.1",
|
"buffer": "4.9.1",
|
||||||
"events": "1.1.1",
|
"events": "1.1.1",
|
||||||
@@ -1030,11 +1030,6 @@
|
|||||||
"xml2js": "0.4.19"
|
"xml2js": "0.4.19"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"sax": {
|
|
||||||
"version": "1.2.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
|
|
||||||
"integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
|
|
||||||
},
|
|
||||||
"uuid": {
|
"uuid": {
|
||||||
"version": "3.3.2",
|
"version": "3.3.2",
|
||||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
|
||||||
@@ -5337,9 +5332,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sax": {
|
"sax": {
|
||||||
"version": "1.2.4",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
|
||||||
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
|
"integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o="
|
||||||
},
|
},
|
||||||
"saxes": {
|
"saxes": {
|
||||||
"version": "3.1.11",
|
"version": "3.1.11",
|
||||||
|
|||||||
+4
-4
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "aws-actions-configure-aws-credentials",
|
"name": "aws-actions-configure-aws-credentials",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"description": "Configure AWS Credentials",
|
"description": "Configure AWS Credentials",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
@@ -25,11 +25,11 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://github.com/aws-actions/configure-aws-credentials#readme",
|
"homepage": "https://github.com/aws-actions/configure-aws-credentials#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.2.2",
|
"@actions/core": "^1.2.3",
|
||||||
"aws-sdk": "^2.610.0"
|
"aws-sdk": "^2.633.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@zeit/ncc": "^0.21.0",
|
"@zeit/ncc": "^0.21.1",
|
||||||
"eslint": "^6.8.0",
|
"eslint": "^6.8.0",
|
||||||
"jest": "^25.1.0"
|
"jest": "^25.1.0"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user