From 4147b305c4a387facc51d68bdc3be8d50fa230b8 Mon Sep 17 00:00:00 2001 From: Quramy Date: Sat, 20 Jan 2024 03:03:27 +0900 Subject: [PATCH] feat(s3-plugin): Remove prepare option to create bucket --- packages/reg-publish-s3-plugin/README.md | 43 ++---- .../e2e/clean-up-buckets.sh | 7 - .../e2e/report-fixture/dir_a/sample01.png | Bin 22647 -> 0 bytes .../e2e/report-fixture/dir_b/sample01.png | Bin 22647 -> 0 bytes .../e2e/report-fixture/index.html | 16 --- packages/reg-publish-s3-plugin/e2e/script.ts | 122 ------------------ packages/reg-publish-s3-plugin/package.json | 2 - .../src/s3-bucket-preparer.ts | 91 ++----------- packages/reg-suit-core-testing/package.json | 2 +- 9 files changed, 22 insertions(+), 261 deletions(-) delete mode 100755 packages/reg-publish-s3-plugin/e2e/clean-up-buckets.sh delete mode 100644 packages/reg-publish-s3-plugin/e2e/report-fixture/dir_a/sample01.png delete mode 100644 packages/reg-publish-s3-plugin/e2e/report-fixture/dir_b/sample01.png delete mode 100644 packages/reg-publish-s3-plugin/e2e/report-fixture/index.html delete mode 100644 packages/reg-publish-s3-plugin/e2e/script.ts diff --git a/packages/reg-publish-s3-plugin/README.md b/packages/reg-publish-s3-plugin/README.md index 1ac21a95..4681de0f 100644 --- a/packages/reg-publish-s3-plugin/README.md +++ b/packages/reg-publish-s3-plugin/README.md @@ -9,26 +9,9 @@ npm i reg-publish-s3-plugin -D reg-suit prepare -p publish-s3 ``` -## AWS Credentials +## Requirements -This plugin needs AWS credentials to access S3. You can set them by the following 2 methods. - -### Environment values - -```sh -export AWS_ACCESS_KEY_ID= -export AWS_SECRET_ACCESS_KEY= -``` - -### Create INI file - -Create a file at `~/.aws/credentials` and edit it. For example: - -```ini -[default] -aws_access_key_id = -aws_secret_access_key = -``` +To use this plugin, you need to create an S3 bucket and configure to allow to access it from your CI. ## Configure @@ -40,7 +23,7 @@ aws_secret_access_key = sseKMSKeyId?: string; customDomain?: string; pathPrefix?: string; - sdkOptions?: S3.Types.ClientConfiguration; + sdkOptions?: S3ClientConfig; } ``` @@ -51,19 +34,19 @@ aws_secret_access_key = - `sseKMSKeyId` - _Optional_ - Specify server-side encryption KMS KEY ID. If provided, is passed as SSEKMSKeyId to s3.putObject. - `customDomain` - _Optional_ - Set if you have your domain and host S3 on it. If set, the HTML report will be published with this custom domain(e.g. `https://your-sub.example.com/...`). - `pathPrefix` - _Optional_ - Specify paths. For example if you set `some_dir`, the report is published with URL such as `https://your-backet-name.s3.amazonaws.com/some_dir/xxxxxxxxx/index.html`. -- `sdkOptions` - _Optional_ - Specify SDK options to pass to the S3 client. For details about the options, refer to the [AWS JavaScript SDK docs](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#constructor_details). +- `sdkOptions` - _Optional_ - Specify options to pass to `S3Client` constructor. For details about the options, refer to the [AWS JavaScript SDK docs](https://www.npmjs.com/package/@aws-sdk/client-s3#usage). ## IAM Role Policy -This plugin needs follwings role policy. +This plugin needs following role policy. ``` - "Action": [ - "s3:DeleteObject", - "s3:GetObject", - "s3:GetObjectAcl", - "s3:PutObject", - "s3:PutObjectAcl", - "s3:ListBucket" - ] + "Action": [ + "s3:DeleteObject", + "s3:GetObject", + "s3:GetObjectAcl", + "s3:PutObject", + "s3:PutObjectAcl", + "s3:ListObject" + ] ``` diff --git a/packages/reg-publish-s3-plugin/e2e/clean-up-buckets.sh b/packages/reg-publish-s3-plugin/e2e/clean-up-buckets.sh deleted file mode 100755 index fda65be8..00000000 --- a/packages/reg-publish-s3-plugin/e2e/clean-up-buckets.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -for b in $(aws s3api list-buckets | jq -r ".Buckets[].Name" | grep -e "reg-publish-bucket-"); do - echo Delete bucket $b - aws s3 rm s3://$b --recursive - aws s3api delete-bucket --bucket $b -done diff --git a/packages/reg-publish-s3-plugin/e2e/report-fixture/dir_a/sample01.png b/packages/reg-publish-s3-plugin/e2e/report-fixture/dir_a/sample01.png deleted file mode 100644 index 6022810ce332b7bafa9e13c929e1b0dc4b407766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22647 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 diff --git a/packages/reg-publish-s3-plugin/e2e/report-fixture/dir_b/sample01.png b/packages/reg-publish-s3-plugin/e2e/report-fixture/dir_b/sample01.png deleted file mode 100644 index 6022810ce332b7bafa9e13c929e1b0dc4b407766..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22647 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 diff --git a/packages/reg-publish-s3-plugin/e2e/report-fixture/index.html b/packages/reg-publish-s3-plugin/e2e/report-fixture/index.html deleted file mode 100644 index 1b05fb70..00000000 --- a/packages/reg-publish-s3-plugin/e2e/report-fixture/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - -

Dummy report

-
- -
-
- -
- - diff --git a/packages/reg-publish-s3-plugin/e2e/script.ts b/packages/reg-publish-s3-plugin/e2e/script.ts deleted file mode 100644 index c5f64e4e..00000000 --- a/packages/reg-publish-s3-plugin/e2e/script.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { createLogger } from "reg-suit-util"; -import { S3PublisherPlugin } from "../lib/s3-publisher-plugin"; -import { S3BucketPreparer } from "../lib/s3-bucket-preparer"; -import glob from "glob"; -import assert from "assert"; -import { DeleteBucketCommand, DeleteObjectsCommand, ListObjectsV2Command, S3Client } from "@aws-sdk/client-s3"; - -const preparer = new S3BucketPreparer(); - -const logger = createLogger(); -logger.setLevel("verbose"); -const baseConf = { - coreConfig: { actualDir: "", workingDir: "" }, - logger, - noEmit: false, -}; - -const dirsA = { - base: __dirname + "/../e2e/report-fixture", - actualDir: __dirname + "/../e2e/report-fixture/dir_a", - expectedDir: __dirname + "/../e2e/report-fixture/dir_b", - diffDir: "", -}; - -const dirsB = { - base: __dirname + "/../e2e/report-fixture-expected", - actualDir: __dirname + "/../e2e/report-fixture-expected/dir_a", - expectedDir: __dirname + "/../e2e/report-fixture-expected/dir_b", - diffDir: "", -}; -async function after(bn: string) { - const S3 = new S3Client(); - const result = await S3.send( - new ListObjectsV2Command({ - Bucket: bn, - }), - ); - - if (result.Contents?.length) { - await S3.send( - new DeleteObjectsCommand({ - Bucket: bn, - Delete: { Objects: result.Contents.map(c => ({ Key: c.Key as any })) }, - }), - ); - } - - await S3.send(new DeleteBucketCommand({ Bucket: bn })); -} - -async function case1() { - const { bucketName } = await preparer.prepare({ ...baseConf, options: { createBucket: true }, workingDirs: dirsA }); - const plugin = new S3PublisherPlugin(); - plugin.init({ - ...baseConf, - options: { - bucketName, - }, - workingDirs: dirsA, - }); - await plugin.publish("abcdef12345"); - - plugin.init({ - ...baseConf, - options: { - bucketName, - }, - workingDirs: dirsB, - }); - await plugin.fetch("abcdef12345"); - - const list = glob.sync("dir_b/sample01.png", { cwd: dirsB.base }); - assert.equal(list[0], "dir_b/sample01.png"); - - await after(bucketName); -} - -async function case2() { - const { bucketName } = await preparer.prepare({ ...baseConf, options: { createBucket: true }, workingDirs: dirsA }); - const plugin = new S3PublisherPlugin(); - plugin.init({ - ...baseConf, - options: { - bucketName, - pathPrefix: "artifacts", - sse: true, - }, - workingDirs: dirsA, - }); - await plugin.publish("abcdef12345"); - plugin.init({ - ...baseConf, - options: { - bucketName, - pathPrefix: "artifacts", - sse: true, - }, - workingDirs: dirsB, - }); - await plugin.fetch("abcdef12345"); - - const list = glob.sync("dir_b/sample01.png", { cwd: dirsB.base }); - assert.equal(list[0], "dir_b/sample01.png"); - - await after(bucketName); -} - -async function main() { - try { - await case1(); - await case2(); - // eslint-disable-next-line no-console - console.log(" 🌟 Test was ended successfully! 🌟 "); - process.exit(0); - } catch (err) { - // eslint-disable-next-line no-console - console.error(err); - process.exit(1); - } -} - -main(); diff --git a/packages/reg-publish-s3-plugin/package.json b/packages/reg-publish-s3-plugin/package.json index 3bfdb053..bcb05619 100644 --- a/packages/reg-publish-s3-plugin/package.json +++ b/packages/reg-publish-s3-plugin/package.json @@ -8,8 +8,6 @@ "main": "lib/index.js", "scripts": { "prepublish": "tsc -p tsconfig.build.json", - "clean:e2e": "rimraf e2e/report-fixture-expected", - "test.bk": "npm run clean:e2e && ts-node e2e/script.ts", "test": "echo skip" }, "keywords": [ diff --git a/packages/reg-publish-s3-plugin/src/s3-bucket-preparer.ts b/packages/reg-publish-s3-plugin/src/s3-bucket-preparer.ts index 9d6ef1af..6491a1ce 100644 --- a/packages/reg-publish-s3-plugin/src/s3-bucket-preparer.ts +++ b/packages/reg-publish-s3-plugin/src/s3-bucket-preparer.ts @@ -1,104 +1,29 @@ -import { v4 as uuid } from "uuid"; -import { CreateBucketCommand, PutBucketPolicyCommand, S3Client } from "@aws-sdk/client-s3"; import { PluginPreparer, PluginCreateOptions, PluginLogger } from "reg-suit-interface"; import { PluginConfig } from "./s3-publisher-plugin"; export interface SetupInquireResult { - createBucket: boolean; - bucketName?: string; + bucketName: string; } -function createPolicy(bucketName: string) { - return { - Version: "2012-10-17", - Id: "Policy1498486961145", - Statement: [ - { - Sid: "Stmt1498486956732", - Effect: "Allow", - Principal: "*", - Action: "s3:GetObject", - Resource: `arn:aws:s3:::${bucketName}/*`, - }, - ], - }; -} - -const BUCKET_PREFIX = "reg-publish-bucket"; - export class S3BucketPreparer implements PluginPreparer { - private _s3client = new S3Client(); _logger!: PluginLogger; inquire() { return [ - { - name: "createBucket", - type: "confirm", - message: "Create a new S3 bucket", - default: true, - }, { name: "bucketName", type: "input", - message: "Existing bucket name", - when: (ctx: any) => !(ctx as { createBucket: boolean }).createBucket, + message: "Bucket name", }, ]; } - prepare(config: PluginCreateOptions) { + async prepare(config: PluginCreateOptions) { this._logger = config.logger; - const ir = config.options; - if (!ir.createBucket) { - return Promise.resolve({ - bucketName: ir.bucketName as string, - }); - } else { - const id = uuid(); - const bucketName = `${BUCKET_PREFIX}-${id}`; - if (config.noEmit) { - this._logger.info(`Skip to create S3 bucket ${bucketName} because noEmit option.`); - return Promise.resolve({ bucketName }); - } - this._logger.info(`Create new S3 bucket: ${this._logger.colors.magenta(bucketName)}`); - const spinner = this._logger.getSpinner(`creating bucket...`); - spinner.start(); - return this._createBucket(bucketName) - .then(bucketName => { - return this._updatePolicy(bucketName); - }) - .then(bucketName => { - spinner.stop(); - return { bucketName }; - }); - } - } - - _updatePolicy(bucketName: string) { - return new Promise((resolve, reject) => { - this._s3client - .send( - new PutBucketPolicyCommand({ - Bucket: bucketName, - Policy: JSON.stringify(createPolicy(bucketName)), - }), - ) - .then(() => resolve(bucketName)) - .catch(err => reject(err)); - }); - } - - _createBucket(bucketName: string) { - return new Promise((resolve, reject) => { - this._s3client - .send( - new CreateBucketCommand({ - Bucket: bucketName, - }), - ) - .then(() => resolve(bucketName)) - .catch(err => reject(err)); - }); + const { bucketName } = config.options; + const pluginConfig: PluginConfig = { + bucketName, + }; + return pluginConfig; } } diff --git a/packages/reg-suit-core-testing/package.json b/packages/reg-suit-core-testing/package.json index 9665298f..072eead8 100644 --- a/packages/reg-suit-core-testing/package.json +++ b/packages/reg-suit-core-testing/package.json @@ -9,7 +9,7 @@ "dependencies": { "reg-notify-gitlab-plugin": "^0.12.3", "reg-notify-slack-plugin": "^0.12.2", - "reg-publish-gcs-plugin": "^0.12.2", + "reg-publish-s3-plugin": "^0.12.2", "reg-simple-keygen-plugin": "^0.12.2", "reg-suit-core": "^0.12.2" },