From d833f7c2adb7f96bdc2505dd669982760e4aac36 Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Fri, 21 Aug 2020 15:27:22 +0200 Subject: [PATCH] Handle AWS CLI v2 --- .github/workflows/ci.yml | 6 +++++- README.md | 1 + dist/index.js | 39 +++++++++++++++++++++++++-------------- src/aws.ts | 22 +++++++++++++++++----- src/docker.ts | 20 ++++++++++---------- 5 files changed, 58 insertions(+), 30 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e88befa..7470fde 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,10 +8,14 @@ on: jobs: dockerhub: - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: + os: + - ubuntu-20.04 + - ubuntu-18.04 + - ubuntu-16.04 logout: - true - false diff --git a/README.md b/README.md index ea73931..915f5cd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ [![GitHub release](https://img.shields.io/github/release/crazy-max/ghaction-docker-login.svg?style=flat-square)](https://github.com/crazy-max/ghaction-docker-login/releases/latest) [![GitHub marketplace](https://img.shields.io/badge/marketplace-docker--login-blue?logo=github&style=flat-square)](https://github.com/marketplace/actions/docker-login) +[![CI workflow](https://img.shields.io/github/workflow/status/crazy-max/ghaction-docker-login/test?label=ci&logo=github&style=flat-square)](https://github.com/crazy-max/ghaction-docker-login/actions?workflow=ci) [![Test workflow](https://img.shields.io/github/workflow/status/crazy-max/ghaction-docker-login/test?label=test&logo=github&style=flat-square)](https://github.com/crazy-max/ghaction-docker-login/actions?workflow=test) [![Codecov](https://img.shields.io/codecov/c/github/crazy-max/ghaction-docker-login?logo=codecov&style=flat-square)](https://codecov.io/gh/crazy-max/ghaction-docker-login) [![Become a sponsor](https://img.shields.io/badge/sponsor-crazy--max-181717.svg?logo=github&style=flat-square)](https://github.com/sponsors/crazy-max) diff --git a/dist/index.js b/dist/index.js index a5d690d..66383bb 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3019,19 +3019,18 @@ function loginECR(registry, username, password) { return __awaiter(this, void 0, void 0, function* () { const cliPath = yield aws.getCLI(); const cliVersion = yield aws.getCLIVersion(); - const ecrRegion = yield aws.getRegion(registry); - core.info(`💡 AWS ECR registry detected with ${ecrRegion} region`); + const region = yield aws.getRegion(registry); + core.info(`💡 AWS ECR registry detected with ${region} region`); process.env.AWS_ACCESS_KEY_ID = username; process.env.AWS_SECRET_ACCESS_KEY = password; core.info(`⬇️ Retrieving docker login command through AWS CLI ${cliVersion} (${cliPath})...`); - aws.getCLICmdOutput(['ecr', 'get-login', '--region', ecrRegion, '--no-include-email']).then(stdout => { - core.info(`🔑 Logging into ${registry}...`); - execm.exec(stdout, [], true).then(res => { - if (res.stderr != '' && !res.success) { - throw new Error(res.stderr); - } - core.info('🎉 Login Succeeded!'); - }); + const loginCmd = yield aws.getECRLoginCmd(cliVersion, registry, region); + core.info(`🔑 Logging into ${registry}...`); + execm.exec(loginCmd, [], true).then(res => { + if (res.stderr != '' && !res.success) { + throw new Error(res.stderr); + } + core.info('🎉 Login Succeeded!'); }); }); } @@ -4099,7 +4098,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.parseCLIVersion = exports.getCLIVersion = exports.getCLICmdOutput = exports.getCLI = exports.getRegion = exports.isECR = void 0; +exports.getECRLoginCmd = exports.parseCLIVersion = exports.getCLIVersion = exports.getCLICmdOutput = exports.getCLI = exports.getRegion = exports.isECR = void 0; const semver = __importStar(__webpack_require__(383)); const io = __importStar(__webpack_require__(436)); const execm = __importStar(__webpack_require__(757)); @@ -4130,10 +4129,22 @@ exports.getCLIVersion = () => __awaiter(void 0, void 0, void 0, function* () { }); exports.parseCLIVersion = (stdout) => __awaiter(void 0, void 0, void 0, function* () { const matches = /aws-cli\/([0-9.]+)/.exec(stdout); - if (matches) { - return semver.clean(matches[1]); + if (!matches) { + throw new Error(`Cannot parse AWS CLI version`); + } + return semver.clean(matches[1]); +}); +exports.getECRLoginCmd = (cliVersion, registry, region) => __awaiter(void 0, void 0, void 0, function* () { + if (semver.satisfies(cliVersion, '>=2.0.0')) { + return exports.getCLICmdOutput(['ecr', 'get-login-password', '--region', region]).then(pwd => { + return `docker login --username AWS --password ${pwd} ${registry}`; + }); + } + else { + return exports.getCLICmdOutput(['ecr', 'get-login', '--region', region, '--no-include-email']).then(dockerLoginCmd => { + return dockerLoginCmd; + }); } - return undefined; }); //# sourceMappingURL=aws.js.map diff --git a/src/aws.ts b/src/aws.ts index 4a809bd..775eb19 100644 --- a/src/aws.ts +++ b/src/aws.ts @@ -26,14 +26,26 @@ export const getCLICmdOutput = async (args: string[]): Promise => { }); }; -export const getCLIVersion = async (): Promise => { +export const getCLIVersion = async (): Promise => { return parseCLIVersion(await getCLICmdOutput(['--version'])); }; -export const parseCLIVersion = async (stdout: string): Promise => { +export const parseCLIVersion = async (stdout: string): Promise => { const matches = /aws-cli\/([0-9.]+)/.exec(stdout); - if (matches) { - return semver.clean(matches[1]); + if (!matches) { + throw new Error(`Cannot parse AWS CLI version`); + } + return semver.clean(matches[1]); +}; + +export const getECRLoginCmd = async (cliVersion: string, registry: string, region: string): Promise => { + if (semver.satisfies(cliVersion, '>=2.0.0')) { + return getCLICmdOutput(['ecr', 'get-login-password', '--region', region]).then(pwd => { + return `docker login --username AWS --password ${pwd} ${registry}`; + }); + } else { + return getCLICmdOutput(['ecr', 'get-login', '--region', region, '--no-include-email']).then(dockerLoginCmd => { + return dockerLoginCmd; + }); } - return undefined; }; diff --git a/src/docker.ts b/src/docker.ts index bd17275..7ea9cb2 100644 --- a/src/docker.ts +++ b/src/docker.ts @@ -42,20 +42,20 @@ export async function loginStandard(registry: string, username: string, password export async function loginECR(registry: string, username: string, password: string): Promise { const cliPath = await aws.getCLI(); const cliVersion = await aws.getCLIVersion(); - const ecrRegion = await aws.getRegion(registry); - core.info(`💡 AWS ECR registry detected with ${ecrRegion} region`); + const region = await aws.getRegion(registry); + core.info(`💡 AWS ECR registry detected with ${region} region`); process.env.AWS_ACCESS_KEY_ID = username; process.env.AWS_SECRET_ACCESS_KEY = password; core.info(`⬇️ Retrieving docker login command through AWS CLI ${cliVersion} (${cliPath})...`); - aws.getCLICmdOutput(['ecr', 'get-login', '--region', ecrRegion, '--no-include-email']).then(stdout => { - core.info(`🔑 Logging into ${registry}...`); - execm.exec(stdout, [], true).then(res => { - if (res.stderr != '' && !res.success) { - throw new Error(res.stderr); - } - core.info('🎉 Login Succeeded!'); - }); + const loginCmd = await aws.getECRLoginCmd(cliVersion, registry, region); + + core.info(`🔑 Logging into ${registry}...`); + execm.exec(loginCmd, [], true).then(res => { + if (res.stderr != '' && !res.success) { + throw new Error(res.stderr); + } + core.info('🎉 Login Succeeded!'); }); }