From 188c2014b15b7528f95dcdabc74ac3106a8484b3 Mon Sep 17 00:00:00 2001 From: RyosukeDTomita Date: Thu, 1 Aug 2024 18:56:22 +0900 Subject: [PATCH 1/3] swith .env only local --- .gitignore | 6 +++--- Dockerfile | 20 +++++++++++++++++++- compose.yaml | 4 ++++ package-lock.json | 37 +++++++++++++++++++++++++++++++++++++ package.json | 3 +++ src/App.tsx | 3 ++- 6 files changed, 68 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 4d29575..88c646a 100644 --- a/.gitignore +++ b/.gitignore @@ -13,10 +13,10 @@ # misc .DS_Store -.env.local -.env.development.local +.env +.env.development .env.test.local -.env.production.local +.env.production npm-debug.log* yarn-debug.log* diff --git a/Dockerfile b/Dockerfile index ef92675..db1b238 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,26 @@ # Build Image FROM node:20 AS build WORKDIR /app + +# defaultをdevelopmentにし,引数でproductionにも切り替えられるようにする +ARG BUILD_ENV=development + COPY . . -RUN npm install && npm run build +# npm startは.env.developmentが優先されるがnpm run buildでは.env.productoinが優先されるので注意。 +RUN <=10" } }, + "node_modules/dotenv-cli": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-7.4.2.tgz", + "integrity": "sha512-SbUj8l61zIbzyhIbg0FwPJq6+wjbzdn9oEtozQpZ6kW2ihCcapKVZj49oCT3oPM+mgQm+itgvUQcG5szxVrZTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-cli/node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli/node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/dotenv-expand": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", diff --git a/package.json b/package.json index 9dee296..9ac9860 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,9 @@ }, "scripts": { "start": "react-scripts start", + "start-prod": "dotenv -e .env.production react-scripts start", "build": "react-scripts build", + "build-dev": "dotenv -e .env.development react-scripts build", "test": "react-scripts test", "eject": "react-scripts eject" }, @@ -41,6 +43,7 @@ }, "devDependencies": { "@typescript-eslint/parser": "^5.62.0", + "dotenv-cli": "^7.4.2", "eslint": "^8.54.0", "prettier": "^2.8.8", "typescript": "^4.9.5" diff --git a/src/App.tsx b/src/App.tsx index 9cc63d9..0e4053c 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,6 +1,7 @@ import React from "react"; import logo from "./logo.svg"; import "./App.css"; +const message: string = process.env.REACT_APP_MESSAGE || "no env"; function App() { return ( @@ -16,7 +17,7 @@ function App() { target="_blank" rel="noopener noreferrer" > - Learn React + Hello, React {message} From 24653928d2ec0d15ec2cfffe47d5d808818b2f29 Mon Sep 17 00:00:00 2001 From: RyosukeDTomita Date: Thu, 1 Aug 2024 19:35:03 +0900 Subject: [PATCH 2/3] delete aws copilot --- Dockerfile | 12 +-- README.md | 80 ++----------------- compose.yaml | 4 - copilot/.workspace | 1 - copilot/dev-svc/manifest.yml | 47 ----------- copilot/environments/dev-env/manifest.yml | 21 ----- copilot/environments/prod-env/manifest.yml | 28 ------- .../react-app-pipeline/buildspec.yml | 75 ----------------- .../pipelines/react-app-pipeline/manifest.yml | 37 --------- copilot/prod-svc/manifest.yml | 47 ----------- doc/tools_doc/pre-commit.md | 4 + pre-commit-test-local.sh | 3 - docker_test.sh => run_local.sh | 10 ++- 13 files changed, 26 insertions(+), 343 deletions(-) delete mode 100644 copilot/.workspace delete mode 100644 copilot/dev-svc/manifest.yml delete mode 100644 copilot/environments/dev-env/manifest.yml delete mode 100644 copilot/environments/prod-env/manifest.yml delete mode 100644 copilot/pipelines/react-app-pipeline/buildspec.yml delete mode 100644 copilot/pipelines/react-app-pipeline/manifest.yml delete mode 100644 copilot/prod-svc/manifest.yml delete mode 100644 pre-commit-test-local.sh rename docker_test.sh => run_local.sh (66%) diff --git a/Dockerfile b/Dockerfile index db1b238..c548447 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,7 @@ WORKDIR /app ARG BUILD_ENV=development COPY . . + # npm startは.env.developmentが優先されるがnpm run buildでは.env.productoinが優先されるので注意。 RUN < [!WARNING] +> Since it costs money to maintain the AWS environment created with copilot-cli for the demo environment, I plan to use `GitHub-Pages` for future demos. I have archived [this branch](https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs). +> デモ環境に対して`copilot-cli`で作ったAWS環境を維持するのにお金がかかるのはもったいないので,以降は`github-pages`を使ってデモを動かそうと思います。[このブランチ](https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs)をアーカイブを残してあります。 + 1. [PREPARING](#preparing)の設定を先にやる。 2. commit時にはpre-commitとgit-secretが作動。 3. push時にはGitHub ActionsによりSAST(semgrep),UnitTest(jest),Dependency Check(trivy)が実行される。 -4. masterブランチにマージしたりmasterにpushした時にCodePipelineによってAWSへリポジトリがクローンされ,ビルド(image scanを含む),developmentへのデプロイが始まる。 -5. developmentで問題がなければCodePipeline上で承認し,productionへデプロイ +4. github-pagesにデプロイされる。 # TODO: more info ## ENVIRONMENT @@ -37,7 +40,7 @@ Sample React application for Trying to Use DevSecOps tools. - [ghalint](./doc/tools_doc/ghalint.md): GitHub Actionsで実行されるworkflows用のlinter - [github-comment](./doc/tools_doc/github-comment.md): GitHub Actionsで実行されるCIが失敗したときにコメントとしてエラーを出力する。 - [semgrep](./doc/tools_doc/semgrep.md): GitHub Actionsで実行するSASTツール -- [trivy](./doc/tools_doc/trivy.md): イメージのスキャンやdependency checkができる。dependency checkはGitHub Actionsで実行,イメージスキャンはAWS Code Pipelineで実行。 +- [trivy](./doc/tools_doc/trivy.md): イメージのスキャンやdependency checkができる。dependency checkはGitHub Actionsで実行,イメージスキャンは#TODO - [aqua](./doc/tools_doc/aqua.md): GitHub Actionsで使用するCLIツールのバージョン管理ができる。 - [pinact](./doc/tools_doc/pinact.md): GitHub Actionsで使うactionsのバージョンをフルコミットハッシュに変換。 @@ -63,34 +66,13 @@ Sample React application for Trying to Use DevSecOps tools. --- -### AWSの構成 - -AWS: ECS on FargateにCode Pipeline経由でデプロイする。サンプルではdevとprod環境を用意し、dev環境で動作確認後に承認ボタンを押すとprod環境のデプロイが進む形になっている。 - -- app-infrastructure-roles - ![app-infrastructure-roles](./doc/fig/cfn/app-infrastructure-roles.png) -- app-infrastructure - ![app-infrastructure](./doc/fig/cfn/app-infrastructure.png) -- environment - ![env](./doc/fig/cfn/env.png) -- service - ![svc](./doc/fig/cfn/svc.png) -- pipeline - ![pipeline](./doc/fig/cfn/pipeline.png) - ---- ## PREPARING -### AWSの設定 - -[initialsettings_aws](./initialsettings_aws.md)を参照。 - ---- +TODO ## HOW TO USE -- [PREPARING](#preparing)をやる。 - ローカルでのセットアップが必用なのは git-secretsのセットアップ。 ```shell @@ -118,52 +100,4 @@ pre-commit install
今まで詰まったエラー一覧
-### Code Build のエラー - -以下コマンドでログが見られる。ブラウザのAWS Code Deploy - -```shell -copilot svc logs --previous -``` - -#### nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied) - -- [ECS の仕様で非特権ユーザを使用したコンテナでは 80 番ポートが使えないっぽい](https://repost.aws/questions/QU1bCV9wT4T5iBrrP1c2ISfg/container-cannot-bind-to-port-80-running-as-non-root-user-on-ecs-fargate) --> つまり,localのdockerで80でサービスが起動できてもECSだと権限エラーになる。このため,コンテナで開放するportは8080としている(ALBに対して8080がマッピングされているためブラウザからは80でアクセスできる)。 - -#### toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: - -- Docker Hubに短期間にアクセスしすぎているだけなので放置でOK - -#### Error response from daemon: dockerfile parse error - -- DockerfileのRUNをヒアドキュメントで書いていたら怒られた(ローカルでは動いてたのに...) - -```dockerfile -# 修正前Dockerfile -RUN <
diff --git a/compose.yaml b/compose.yaml index 6dc74c3..3a4af55 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,7 +1,3 @@ -# .env.developmentでbuild -# docker buildx bake --set react-app.args.BUILD_ENV=development -# .env.productionでbuild -# docker buildx bake --set react-app.args.BUILD_ENV=production version: '3' services: diff --git a/copilot/.workspace b/copilot/.workspace deleted file mode 100644 index a9afdd4..0000000 --- a/copilot/.workspace +++ /dev/null @@ -1 +0,0 @@ -application: react-app diff --git a/copilot/dev-svc/manifest.yml b/copilot/dev-svc/manifest.yml deleted file mode 100644 index fe3a5f3..0000000 --- a/copilot/dev-svc/manifest.yml +++ /dev/null @@ -1,47 +0,0 @@ -# The manifest for the "dev-svc" service. -# Read the full specification for the "Load Balanced Web Service" type at: -# https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/ - -# Your service name will be used in naming your resources like log groups, ECS services, etc. -name: dev-svc -type: Load Balanced Web Service - -# Distribute traffic to your service. -http: - # Requests to this path will be forwarded to your service. - # To match all requests you can use the "/" path. - path: '/' - # You can specify a custom health check path. The default is "/". - # healthcheck: '/' - -# Configuration for your containers and service. -image: - # Docker build arguments. For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#image-build - build: Dockerfile - # Port exposed through your container to route traffic to it. - port: 8080 - -cpu: 256 # Number of CPU units for the task. -memory: 512 # Amount of memory in MiB used by the task. -count: 1 # Number of tasks that should be running in your service. -exec: true # Enable running commands in your container. -network: - connect: true # Enable Service Connect for intra-environment traffic between services. - -# storage: - # readonly_fs: true # Limit to read-only access to mounted root filesystems. - -# Optional fields for more advanced use-cases. -# -#variables: # Pass environment variables as key value pairs. -# LOG_LEVEL: info - -#secrets: # Pass secrets from AWS Systems Manager (SSM) Parameter Store. -# GITHUB_TOKEN: GITHUB_TOKEN # The key is the name of the environment variable, the value is the name of the SSM parameter. - -# You can override any of the values defined above by environment. -#environments: -# test: -# count: 2 # Number of tasks to run for the "test" environment. -# deployment: # The deployment strategy for the "test" environment. -# rolling: 'recreate' # Stops existing tasks before new ones are started for faster deployments. diff --git a/copilot/environments/dev-env/manifest.yml b/copilot/environments/dev-env/manifest.yml deleted file mode 100644 index 1c14f97..0000000 --- a/copilot/environments/dev-env/manifest.yml +++ /dev/null @@ -1,21 +0,0 @@ -# The manifest for the "dev-env" environment. -# Read the full specification for the "Environment" type at: -# https://aws.github.io/copilot-cli/docs/manifest/environment/ - -# Your environment name will be used in naming your resources like VPC, cluster, etc. -name: dev-env -type: Environment - -# Import your own VPC and subnets or configure how they should be created. -# network: -# vpc: -# id: - -# Configure the load balancers in your environment, once created. -# http: -# public: -# private: - -# Configure observability for your environment resources. -observability: - container_insights: false diff --git a/copilot/environments/prod-env/manifest.yml b/copilot/environments/prod-env/manifest.yml deleted file mode 100644 index 8102c47..0000000 --- a/copilot/environments/prod-env/manifest.yml +++ /dev/null @@ -1,28 +0,0 @@ -# The manifest for the "prod-env" environment. -# Read the full specification for the "Environment" type at: -# https://aws.github.io/copilot-cli/docs/manifest/environment/ - -# Your environment name will be used in naming your resources like VPC, cluster, etc. -name: prod-env -type: Environment - -# Import your own VPC and subnets or configure how they should be created. -network: - vpc: - id: vpc-0e2c3939c6159987c - subnets: - public: - - id: subnet-077af848ce2255562 - - id: subnet-074c71e5fac150d04 - private: - - id: subnet-0c572ccc92f2f825f - - id: subnet-0209edab730676d3e - -# Configure the load balancers in your environment, once created. -# http: -# public: -# private: - -# Configure observability for your environment resources. -observability: - container_insights: false diff --git a/copilot/pipelines/react-app-pipeline/buildspec.yml b/copilot/pipelines/react-app-pipeline/buildspec.yml deleted file mode 100644 index 5d35eae..0000000 --- a/copilot/pipelines/react-app-pipeline/buildspec.yml +++ /dev/null @@ -1,75 +0,0 @@ -# Buildspec runs in the build stage of your pipeline. -version: 0.2 -phases: - install: - commands: - - echo "cd into $CODEBUILD_SRC_DIR" - - cd $CODEBUILD_SRC_DIR - # Download the copilot linux binary. - - wget -q https://ecs-cli-v2-release.s3.amazonaws.com/copilot-linux-v1.32.0 -O copilot-linux - - chmod +x ./copilot-linux - # Download trivy. https://aquasecurity.github.io/trivy/v0.48/getting-started/installation/ - - echo "install trivy" - - rpm -ivh https://github.com/aquasecurity/trivy/releases/download/v0.48.0/trivy_0.48.0_Linux-64bit.rpm - - build: - commands: - - echo "Run your tests" - # - make test - post_build: - commands: - - ls -l - - export COLOR="false" - - export CI="true" - - pipeline=$(cat $CODEBUILD_SRC_DIR/copilot/pipelines/react-app-pipeline/manifest.yml | ruby -ryaml -rjson -e 'puts JSON.pretty_generate(YAML.load(ARGF))') - - pl_envs=$(echo $pipeline | jq -r '.stages[].name') - # Find all the local services in the workspace. - - svc_ls_result=$(./copilot-linux svc ls --local --json) - - svc_list=$(echo $svc_ls_result | jq '.services') - - > - if [ ! "$svc_list" = null ]; then - svcs=$(echo $svc_ls_result | jq -r '.services[].name'); - fi - # Find all the local jobs in the workspace. - - job_ls_result=$(./copilot-linux job ls --local --json) - - job_list=$(echo $job_ls_result | jq '.jobs') - - > - if [ ! "$job_list" = null ]; then - jobs=$(echo $job_ls_result | jq -r '.jobs[].name'); - fi - # Raise error if no services or jobs are found. - - > - if [ "$svc_list" = null ] && [ "$job_list" = null ]; then - echo "No services or jobs found for the pipeline to deploy. Please create at least one service or job and push the manifest to the remote." 1>&2; - exit 1; - fi - # Generate the cloudformation templates. - # The tag is the build ID but we replaced the colon ':' with a dash '-'. - # We truncate the tag (from the front) to 128 characters, the limit for Docker tags - # (https://docs.docker.com/engine/reference/commandline/tag/) - # Check if the `svc package` commanded exited with a non-zero status. If so, echo error msg and exit. - - > - for env in $pl_envs; do - tag=$(echo ${CODEBUILD_BUILD_ID##*:}-$env | sed 's/:/-/g' | rev | cut -c 1-128 | rev) - for svc in $svcs; do - ./copilot-linux svc package -n $svc -e $env --output-dir './infrastructure' --tag $tag --upload-assets; - if [ $? -ne 0 ]; then - echo "Cloudformation stack and config files were not generated. Please check build logs to see if there was a manifest validation error." 1>&2; - exit 1; - fi - done; - for job in $jobs; do - ./copilot-linux job package -n $job -e $env --output-dir './infrastructure' --tag $tag --upload-assets; - if [ $? -ne 0 ]; then - echo "Cloudformation stack and config files were not generated. Please check build logs to see if there was a manifest validation error." 1>&2; - exit 1; - fi - done; - done; - - ls -lah ./infrastructure - # Run trivy scan on the docker images. - - trivy image --vuln-type os --no-progress --format table -o container-scanning-report.txt --severity CRITICAL,HIGH $(jq -r '.Parameters.ContainerImage' ./infrastructure/dev-svc-dev-env.params.json) - - cat container-scanning-report.txt -artifacts: - files: - - "infrastructure/*" diff --git a/copilot/pipelines/react-app-pipeline/manifest.yml b/copilot/pipelines/react-app-pipeline/manifest.yml deleted file mode 100644 index 3bd89b3..0000000 --- a/copilot/pipelines/react-app-pipeline/manifest.yml +++ /dev/null @@ -1,37 +0,0 @@ -# The manifest for the "react-app-pipeline" pipeline. -# This YAML file defines your pipeline: the source repository it tracks and the order of the environments to deploy to. -# For more info: https://aws.github.io/copilot-cli/docs/manifest/pipeline/ - -# The name of the pipeline. -name: react-app-pipeline - -# The version of the schema used in this template. -version: 1 - -# This section defines your source, changes to which trigger your pipeline. -source: - # The name of the provider that is used to store the source artifacts. - # (i.e. GitHub, Bitbucket, CodeCommit) - provider: GitHub - # Additional properties that further specify the location of the artifacts. - properties: - branch: master - repository: https://github.com/RyosukeDTomita/devsecops-demo-aws-ecs - # Optional: specify the name of an existing CodeStar Connections connection. - # connection_name: a-connection - -# This section defines the order of the environments your pipeline will deploy to. -stages: - - # The name of the environment. - name: dev-env - # Optional: flag for manual approval action before deployment. - # requires_approval: true - # Optional: use test commands to validate this stage of your build. - # test_commands: [echo 'running tests', make test] - - - # The name of the environment. - name: prod-env - # Optional: flag for manual approval action before deployment. - requires_approval: true - # Optional: use test commands to validate this stage of your build. - # test_commands: [echo 'running tests', make test] diff --git a/copilot/prod-svc/manifest.yml b/copilot/prod-svc/manifest.yml deleted file mode 100644 index 79d94e4..0000000 --- a/copilot/prod-svc/manifest.yml +++ /dev/null @@ -1,47 +0,0 @@ -# The manifest for the "prod-svc" service. -# Read the full specification for the "Load Balanced Web Service" type at: -# https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/ - -# Your service name will be used in naming your resources like log groups, ECS services, etc. -name: prod-svc -type: Load Balanced Web Service - -# Distribute traffic to your service. -http: - # Requests to this path will be forwarded to your service. - # To match all requests you can use the "/" path. - path: 'prod-svc' - # You can specify a custom health check path. The default is "/". - # healthcheck: '/' - -# Configuration for your containers and service. -image: - # Docker build arguments. For additional overrides: https://aws.github.io/copilot-cli/docs/manifest/lb-web-service/#image-build - build: Dockerfile - # Port exposed through your container to route traffic to it. - port: 8080 - -cpu: 256 # Number of CPU units for the task. -memory: 512 # Amount of memory in MiB used by the task. -count: 1 # Number of tasks that should be running in your service. -exec: true # Enable running commands in your container. -network: - connect: true # Enable Service Connect for intra-environment traffic between services. - -# storage: - # readonly_fs: true # Limit to read-only access to mounted root filesystems. - -# Optional fields for more advanced use-cases. -# -#variables: # Pass environment variables as key value pairs. -# LOG_LEVEL: info - -#secrets: # Pass secrets from AWS Systems Manager (SSM) Parameter Store. -# GITHUB_TOKEN: GITHUB_TOKEN # The key is the name of the environment variable, the value is the name of the SSM parameter. - -# You can override any of the values defined above by environment. -#environments: -# test: -# count: 2 # Number of tasks to run for the "test" environment. -# deployment: # The deployment strategy for the "test" environment. -# rolling: 'recreate' # Stops existing tasks before new ones are started for faster deployments. diff --git a/doc/tools_doc/pre-commit.md b/doc/tools_doc/pre-commit.md index a35848e..d418cf2 100644 --- a/doc/tools_doc/pre-commit.md +++ b/doc/tools_doc/pre-commit.md @@ -12,7 +12,11 @@ pip install pre-commit pre-commit sample-config > .pre-commit-config.yaml # すでに本リポジトリでは作成済み pre-commit install + +# ローカルでとりあえず動かしてみる。 +pre-commit run -a ``` +うまく動作してそうなら今後git commit時にツールが動作する。 ### インストール時のエラー diff --git a/pre-commit-test-local.sh b/pre-commit-test-local.sh deleted file mode 100644 index 331311d..0000000 --- a/pre-commit-test-local.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -pre-commit install -pre-commit run -a diff --git a/docker_test.sh b/run_local.sh similarity index 66% rename from docker_test.sh rename to run_local.sh index 4d1f42d..c36e1c0 100755 --- a/docker_test.sh +++ b/run_local.sh @@ -1,15 +1,21 @@ #!/bin/bash ########################################################################## -# Name: docker_test.sh +# Name: run_local.sh # # Usage: Dockerfile build test. This scripts only used local computer. # # Author: Ryosuke Tomita -# Date: 2023/12/06 +# Date: 2024/08/01 ########################################################################## #docker rmi react-app:latest -f #docker build -t react-app:latest . --no-cache #docker run -p 80:8080 react-app:latest # -p localport:containerport + +# .env.developmentでbuildxでbuild +docker buildx bake --set react-app.args.BUILD_ENV=development +# .env.productionでbuildxでbuild +# docker buildx bake --set react-app.args.BUILD_ENV=production + docker compose up # open your browser and go to `localhost:80`. From 25bb9dea2ef398568c9b42f436b97797f7f17546 Mon Sep 17 00:00:00 2001 From: RyosukeDTomita Date: Sun, 4 Aug 2024 13:23:25 +0900 Subject: [PATCH 3/3] fix jest fix jest error2 test3 test4 test5 test6 test7 test7 update document document update2 --- .dockerignore | 4 +- .github/workflows/react-jest.yaml | 32 ++++++++- .gitignore | 1 + Dockerfile | 11 ++-- README.md | 62 +++++++++++++++--- .../archive/initialsettings_aws.md | 0 doc/fig/actions-secrets-set.png | Bin 0 -> 86726 bytes .../cfn/app-infrastructure-roles.png | Bin .../{ => archive}/cfn/app-infrastructure.png | Bin doc/fig/{ => archive}/cfn/env.png | Bin doc/fig/{ => archive}/cfn/pipeline.png | Bin doc/fig/{ => archive}/cfn/svc.png | Bin doc/fig/github-environment.png | Bin 0 -> 32162 bytes doc/fig/pat.png | Bin 0 -> 35020 bytes doc/github-actions.md | 20 +++++- package-lock.json | 32 ++++----- package.json | 10 ++- run_local.sh => run_local_example.sh | 11 ++-- src/App.css | 4 ++ src/App.tsx | 2 +- src/__tests__/App.test.tsx | 39 ++++++++++- update_github_actoins_variables.sh | 7 ++ 22 files changed, 189 insertions(+), 46 deletions(-) rename initialsettings_aws.md => doc/archive/initialsettings_aws.md (100%) create mode 100644 doc/fig/actions-secrets-set.png rename doc/fig/{ => archive}/cfn/app-infrastructure-roles.png (100%) rename doc/fig/{ => archive}/cfn/app-infrastructure.png (100%) rename doc/fig/{ => archive}/cfn/env.png (100%) rename doc/fig/{ => archive}/cfn/pipeline.png (100%) rename doc/fig/{ => archive}/cfn/svc.png (100%) create mode 100644 doc/fig/github-environment.png create mode 100644 doc/fig/pat.png rename run_local.sh => run_local_example.sh (63%) create mode 100644 update_github_actoins_variables.sh diff --git a/.dockerignore b/.dockerignore index cbc509d..7a5676a 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,3 @@ -docker_test.sh README.md .gitignore CODEOWNERS @@ -10,4 +9,5 @@ LICENSE src/__tests__/* copilot/* Dockerfile -docker-compose.yml +compose.yaml +run_local.sh diff --git a/.github/workflows/react-jest.yaml b/.github/workflows/react-jest.yaml index 5ac81a5..6c61fa7 100644 --- a/.github/workflows/react-jest.yaml +++ b/.github/workflows/react-jest.yaml @@ -1,3 +1,4 @@ +# node_version: 20, 22とenvironment_type: development, staging, productionの計6パターンでテストを実行 name: run-jest on: push: @@ -22,6 +23,9 @@ jobs: strategy: matrix: node_version: [20, 22] + environment_type: ["development", "staging", "production"] + environment: + name: ${{ matrix.environment_type }} steps: # checkout repository to runner @@ -40,5 +44,29 @@ jobs: - name: install dependencies run: github-comment exec --token ${{ secrets.token }} -- npm install - - name: run npm test - run: github-comment exec --token ${{ secrets.token }} -- npm test -- --watchall=false + # 3環境まとめてテスト + - name: run npm run test + env: + GH_TOKEN: ${{ secrets.token }} # gh用 + run: | + if [ ${{ matrix.environment_type }} = "development" ]; then + npm_type="dev" + elif [ ${{ matrix.environment_type }} = "staging" ]; then + npm_type="stg" + elif [ ${{ matrix.environment_type }} = "production" ]; then + npm_type="prod" + else + echo "invalid environment_type" + exit 1 + fi + # environmentにあった名称でenv_fileを作成し,github actions environment variableを書き込み + # NOTE: env_fileはgitで管理したくないため,workflow実行時に作成している。 + env_file=".env.${{ matrix.environment_type }}" + touch $env_file + cat <> $env_file + $(gh variable list --env ${{ matrix.environment_type }} | awk '{print $1"="$2}') + EOF + echo ----[DEBUG]: CHECK $env_file---- + cat .env.${{ matrix.environment_type }} + echo ----[DEBUG]: END---- + github-comment exec --token ${{ secrets.token }} -- npm run test-$npm_type -- --watchall=false diff --git a/.gitignore b/.gitignore index 88c646a..061e554 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,7 @@ .env.development .env.test.local .env.production +.env.staging npm-debug.log* yarn-debug.log* diff --git a/Dockerfile b/Dockerfile index c548447..a861e58 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,16 +10,19 @@ COPY . . # npm startは.env.developmentが優先されるがnpm run buildでは.env.productoinが優先されるので注意。 RUN < .env.${environment} +done +``` + +- github actions enrironment variablesに登録/更新する。 + +```shell +source ./update_github_actions_variables.sh +``` + +### GitHub Actionsで実行したスキャン結果をアップロードできるようにGitHubリポジトリの設定を変更する + +- GitHub Actionsがスキャン結果のファイルをアップロードできるようにGitHubリポジトリの設定を変更。詳細は[semgrepのyaml](./.github/workflows/react-semgrep.yaml)を参照。 + +--- ## HOW TO USE -- ローカルでのセットアップが必用なのは git-secretsのセットアップ。 +### コミット時の検査セットアップ + +- git-secretsのセットアップ。 ```shell cd devsecops-demo-aws-ecs @@ -90,14 +135,13 @@ pip install pre-commit pre-commit install ``` -- VSCodeのExtensionsもお好みでインストール。 -- GitHub Actionsがスキャン結果のファイルをアップロードできるように権限をつける。詳細は[semgrepのyaml](./.github/workflows/react-semgrep.yaml)を参照。 - --- ## ERROR LOG
-今まで詰まったエラー一覧
- -
+今まで詰まったエラー一覧 +
+TODO +
+ diff --git a/initialsettings_aws.md b/doc/archive/initialsettings_aws.md similarity index 100% rename from initialsettings_aws.md rename to doc/archive/initialsettings_aws.md diff --git a/doc/fig/actions-secrets-set.png b/doc/fig/actions-secrets-set.png new file mode 100644 index 0000000000000000000000000000000000000000..56965c9a2cba00ab943f7900111d7e7560aa18fb GIT binary patch literal 86726 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�}HCSHZyAz5+N3-sBe2s}NDs9sf! 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

%nugia`8MO- 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 literal 0 HcmV?d00001 diff --git a/doc/fig/cfn/app-infrastructure-roles.png b/doc/fig/archive/cfn/app-infrastructure-roles.png similarity index 100% rename from doc/fig/cfn/app-infrastructure-roles.png rename to doc/fig/archive/cfn/app-infrastructure-roles.png diff --git a/doc/fig/cfn/app-infrastructure.png b/doc/fig/archive/cfn/app-infrastructure.png similarity index 100% rename from doc/fig/cfn/app-infrastructure.png rename to doc/fig/archive/cfn/app-infrastructure.png diff --git a/doc/fig/cfn/env.png b/doc/fig/archive/cfn/env.png similarity index 100% rename from doc/fig/cfn/env.png rename to doc/fig/archive/cfn/env.png diff --git a/doc/fig/cfn/pipeline.png b/doc/fig/archive/cfn/pipeline.png similarity index 100% rename from doc/fig/cfn/pipeline.png rename to doc/fig/archive/cfn/pipeline.png diff --git a/doc/fig/cfn/svc.png b/doc/fig/archive/cfn/svc.png similarity index 100% rename from doc/fig/cfn/svc.png rename to doc/fig/archive/cfn/svc.png diff --git a/doc/fig/github-environment.png b/doc/fig/github-environment.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ff21dfb48556fee9429538d02f770d11310b67 GIT binary patch literal 32162 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�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 literal 0 HcmV?d00001 diff --git a/doc/fig/pat.png b/doc/fig/pat.png new file mode 100644 index 0000000000000000000000000000000000000000..23c33dd89cebf51ac3b653b1a6d9d241852ea9f0 GIT binary patch literal 35020 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 c6+^%9NBkDKuSO_U{s6j(i^vF92 GUIの場合は[公式ドキュメント](https://docs.github.com/ja/actions/security-guides/using-secrets-in-github-actions)参照。 -### 2種類のシークレット +### Secret + +#### 2種類のシークレット - Environment Secret: Environmentを作成して値を区別して使用できる。Environmentはリポジトリに対して複数作成できる。 - Repository Secret: リポジトリで共通の値を使う。 -### 使用方法(CLI) +#### 使用方法(CLI) > [GitHub CLIでリポジトリへsecretを設定する方法](https://zenn.dev/hankei6km/articles/set-secret-to-repo-with-githubcli) > [GitHub ActionsでEnvironment Secretを扱うサンプル](https://qiita.com/ak2ie/items/4fbcdf74e7760c49c1af) @@ -66,6 +68,18 @@ jobs: echo ${{ secrets.API_TOKEN }} ``` +### variables +- 基本はsecretと同じでenvironment variablesとrepository variablesがある。 +- secretと異なり,値を確認することができる。 + +#### 使用例 + +```shell +environment=development +gh variable set --env $environment --env-file .env.$environment +gh variable list --env $environment +``` + --- ## path filterを使って特定のファイル変更時のみCIを走らせる diff --git a/package-lock.json b/package-lock.json index a31e4ca..858eb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "dotenv": "^16.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", @@ -6053,11 +6054,14 @@ } }, "node_modules/dotenv": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", - "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-cli": { @@ -6075,18 +6079,6 @@ "dotenv": "cli.js" } }, - "node_modules/dotenv-cli/node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, "node_modules/dotenv-cli/node_modules/dotenv-expand": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", @@ -13591,6 +13583,14 @@ "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" }, + "node_modules/react-scripts/node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, "node_modules/react-scripts/node_modules/emittery": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", diff --git a/package.json b/package.json index 9ac9860..6fe17e2 100644 --- a/package.json +++ b/package.json @@ -10,17 +10,23 @@ "@types/node": "^16.18.66", "@types/react": "^18.2.39", "@types/react-dom": "^18.2.17", + "dotenv": "^16.4.5", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" }, "scripts": { + "discription": "startはデフォルトで.env.developmentを使うがbuildはデフォルトで.env.productionを使う", "start": "react-scripts start", + "start-stg": "dotenv -e .env.staging react-scripts start", "start-prod": "dotenv -e .env.production react-scripts start", - "build": "react-scripts build", "build-dev": "dotenv -e .env.development react-scripts build", - "test": "react-scripts test", + "build-stg": "dotenv -e .env.staging react-scripts build", + "build": "react-scripts build", + "test-dev": "dotenv -e .env.development react-scripts test", + "test-stg": "dotenv -e .env.staging react-scripts test", + "test-prod": "dotenv -e .env.production react-scripts test", "eject": "react-scripts eject" }, "eslintConfig": { diff --git a/run_local.sh b/run_local_example.sh similarity index 63% rename from run_local.sh rename to run_local_example.sh index c36e1c0..08bae27 100755 --- a/run_local.sh +++ b/run_local_example.sh @@ -7,15 +7,18 @@ # Author: Ryosuke Tomita # Date: 2024/08/01 ########################################################################## -#docker rmi react-app:latest -f -#docker build -t react-app:latest . --no-cache -#docker run -p 80:8080 react-app:latest # -p localport:containerport +# -----composeを使わない場合----- +# docker build -t react-app:latest . --build-arg BUILD_ENV=production +# docker run -p 80:8080 react-app:latest # -p localport:containerport +# -----composeを使う----- # .env.developmentでbuildxでbuild docker buildx bake --set react-app.args.BUILD_ENV=development # .env.productionでbuildxでbuild # docker buildx bake --set react-app.args.BUILD_ENV=production - +# buildxを使わない場合の引数の設定方法 +#docker compose build --build-arg BUILD_ENV=production +# 起動 docker compose up # open your browser and go to `localhost:80`. diff --git a/src/App.css b/src/App.css index 74b5e05..a69922e 100644 --- a/src/App.css +++ b/src/App.css @@ -7,9 +7,11 @@ pointer-events: none; } +/* [`@media prefers-reduced-motion`](https://developer.mozilla.org/ja/docs/Web/CSS/@media/prefers-reduced-motion)はユーザがページの動きを少なくする設定時の動作を規定しており,no-preferenceになっているので該当時にはアニメーションは動きません。 */ @media (prefers-reduced-motion: no-preference) { .App-logo { animation: App-logo-spin infinite 20s linear; + /* animation: アニメーション名 無限ループ 1サイクルの速度(変えると回転速度が変わる) 一定速度で実行 */ } } @@ -28,7 +30,9 @@ color: #61dafb; } +/*[@keyframes](https://developer.mozilla.org/ja/docs/Web/CSS/@keyframes)はキーフレームを制御するため,fromとtoでアニメーションの始まりと終わりを定義している。*/ @keyframes App-logo-spin { + /* 360度回転する*/ from { transform: rotate(0deg); } diff --git a/src/App.tsx b/src/App.tsx index 0e4053c..51de2f2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import React from "react"; import logo from "./logo.svg"; import "./App.css"; -const message: string = process.env.REACT_APP_MESSAGE || "no env"; +const message: string = process.env.REACT_APP_MESSAGE || ""; function App() { return ( diff --git a/src/__tests__/App.test.tsx b/src/__tests__/App.test.tsx index 7f6509e..743cf92 100644 --- a/src/__tests__/App.test.tsx +++ b/src/__tests__/App.test.tsx @@ -1,10 +1,43 @@ +// import React from "react"; +// import { render, screen } from "@testing-library/react"; +// import App from "../App"; +// const message: string = process.env.REACT_APP_MESSAGE || ""; + +// // 画面にHello, Reactの文字が出るかテスト +// test("renders Hello, React link", () => { +// render(); +// const linkElement = screen.getByText(new RegExp(`Hello, React ${message}`, 'i')); +// expect(linkElement).toBeInTheDocument(); +// }); + import React from "react"; import { render, screen } from "@testing-library/react"; import App from "../App"; -// 画面にLearn Reactの文字が出るかテスト -test("renders learn react link", () => { +// 環境変数をテストの前に設定 +const originalEnv = process.env; +beforeEach(() => { + jest.resetModules(); // モジュールキャッシュをクリア + process.env = { ...originalEnv }; // 環境変数をリセット +}); + +afterAll(() => { + process.env = originalEnv; // 全テスト後に環境変数を元に戻す +}); + +// 画面に"Hello, React"の文字が出るかテスト(環境変数なし) +test("renders 'Hello, React' text without environment variable", () => { + process.env.REACT_APP_MESSAGE = ""; // 環境変数をクリア + render(); + const linkElement = screen.getByText(/Hello, React/i); + expect(linkElement).toBeInTheDocument(); +}); + +// 画面に"Hello, React"と環境変数のメッセージが出るかテスト(環境変数あり) +test("renders 'Hello, React' text with environment variable", () => { + const message: string = process.env.REACT_APP_MESSAGE || ""; + const testMessage: string = "Hello, React " + message; render(); - const linkElement = screen.getByText(/learn react/i); + const linkElement = screen.getByText(new RegExp(testMessage, "i")); expect(linkElement).toBeInTheDocument(); }); diff --git a/update_github_actoins_variables.sh b/update_github_actoins_variables.sh new file mode 100644 index 0000000..94f0928 --- /dev/null +++ b/update_github_actoins_variables.sh @@ -0,0 +1,7 @@ +#!/bin/bash +for environment in "development" "staging" "production"; +do + echo $environment + gh variable set --env $environment --env-file .env.$environment + gh variable list --env $environment +done