Skip to content

Commit

Permalink
CI/CD実装
Browse files Browse the repository at this point in the history
  • Loading branch information
fittecs committed Apr 13, 2024
1 parent 6da2d7e commit 0d1041b
Show file tree
Hide file tree
Showing 44 changed files with 501 additions and 184 deletions.
26 changes: 26 additions & 0 deletions .github/actions/setup/action.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: Setup
description: setup a job

inputs:
workload_identity_provider:
description: Workload Identity Provider ID
required: true
service_account:
description: SA for running Terraform CLI
required: true

runs:
using: composite
steps:
- name: Setup Terraform CLI
uses: hashicorp/setup-terraform@v3
with:
terraform_version: "1.7.5"

- name: Auth for Google Cloud
id: auth-for-google-cloud
uses: google-github-actions/auth@v2
with:
create_credentials_file: true
workload_identity_provider: ${{ inputs.workload_identity_provider }}
service_account: ${{ inputs.service_account }}
6 changes: 6 additions & 0 deletions .github/test_matrix.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# シェルの配列構文で定義する必要がある
modules1:
- network
- github
modules2:
- db
112 changes: 112 additions & 0 deletions .github/workflows/test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
name: ci/cd

on:
pull_request:
branches:
- main
types: [opened, synchronize]

permissions:
id-token: write
contents: read

jobs:
test-prep:
runs-on: ubuntu-22.04
env:
TF_VAR_service: ${{ secrets.TEST_SERVICE }}
TF_VAR_env: test
steps:
# - name: Confirm minimum permissions
# uses: GitHubSecurityLab/actions-permissions/monitor@v1
# with:
# config: ${{ vars.PERMISSIONS_CONFIG }}

- name: Checkout project
uses: actions/checkout@v4

- name: Setup job
uses: ./.github/actions/setup
with:
workload_identity_provider: ${{ secrets.TEST_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.TEST_SERVICE_ACCOUNT }}

- name: Run apply command to tier1 on test
run: |
./terraform/environments/test/tier1/apply.sh
test:
needs: test-prep
runs-on: ubuntu-22.04
env:
TF_VAR_service: ${{ secrets.TEST_SERVICE }}
TF_VAR_env: test
strategy:
fail-fast: false
matrix:
shard: [modules1, modules2]
steps:
# - name: Confirm minimum permissions
# uses: GitHubSecurityLab/actions-permissions/monitor@v1
# with:
# config: ${{ vars.PERMISSIONS_CONFIG }}

- name: Checkout project
uses: actions/checkout@v4

- name: Setup job
uses: ./.github/actions/setup
with:
workload_identity_provider: ${{ secrets.TEST_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.TEST_SERVICE_ACCOUNT }}

- name: Run tests
run: |
while IFS= read MODULE; do
./terraform/modules/$MODULE/test.sh
done <<< "$(yq -r .${{ matrix.shard }}[] ./.github/test_matrix.yaml)"
plan:
needs: test
runs-on: ubuntu-22.04
env:
TF_VAR_service: ${{ secrets.STG_SERVICE }}
TF_VAR_env: stg
steps:
# - name: Confirm minimum permissions
# uses: GitHubSecurityLab/actions-permissions/monitor@v1
# with:
# config: ${{ vars.PERMISSIONS_CONFIG }}

- name: Checkout project
uses: actions/checkout@v4

- name: Setup job
uses: ./.github/actions/setup
with:
workload_identity_provider: ${{ secrets.STG_WORKLOAD_IDENTITY_PROVIDER }}
service_account: ${{ secrets.STG_SERVICE_ACCOUNT }}

- name: Run plan command to tier1 on stg
run: |
cd ./terraform/environments/stg/tier1/
terraform init -backend-config="bucket=${{ env.TF_VAR_service }}-${{ env.TF_VAR_env }}-terraform"
terraform plan
- name: Run plan command to tier2 on stg
run: |
cd ./terraform/environments/stg/tier2/
terraform init -backend-config="bucket=${{ env.TF_VAR_service }}-${{ env.TF_VAR_env }}-terraform"
terraform plan
- name: Send the results to Slack channel
id: slack
uses: slackapi/[email protected]
with:
payload: |
{
"key": "value",
"foo": "bar"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

| 変数名 | 説明 |
| ------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| SERVICE | インフラ構築対象のサービス名あるいはプロダクト名。<br/>このプロジェクトでは`infra-testing-google-sample`(実際には存在しないサービス)としている。 |
| SERVICE | インフラ構築対象のサービス名あるいはプロダクト名で 23 文字以内必須。<br/>このプロジェクトでは`infra-testing-google-sample`(実際には存在しないサービス)としている。 |
| ENV | サービスの開発/運用が行われる環境の名前。<br/>詳細は下記`環境`参照。 |
| PROJECT(\_ID) | 各環境に紐づく Google Cloud プロジェクトの名前。<br/>このインフラプロジェクトでは`$SERVICE-$ENV`のルールで命名していて、prod 環境の場合は`infra-testing-google-sample-prod`となる 。<br/>なお Google Cloud のプロジェクト名は 30 文字であるためこのプロジェクト名は実際には使用できない。 |

Expand Down
2 changes: 1 addition & 1 deletion scripts/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

**3\.** 作成したプロジェクトの GCP コンソールにログインして、`請求先アカウントをリンク`で自分の組織に紐付け。

**4\.** 作成したプロジェクトの GCP コンソールにログインして、自分の IAM アカウントにプロジェクト削除保護設定ロールを追加。
**4\. 作成したプロジェクトの GCP コンソールにログインして、自分の IAM アカウントにプロジェクト削除保護設定ロールを追加。**

ロール名は`リーエンの変更 | roles/resourcemanager.lienModifier`

Expand Down
25 changes: 16 additions & 9 deletions scripts/setup_gcp_project.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,10 @@ readonly SERVICES=(
)
readonly ADMIN_SA="infra-admin"
readonly ADMIN_SA_EMAIL="$ADMIN_SA@$PROJECT.iam.gserviceaccount.com"
readonly BUCKET="gs://$PROJECT-terraform"
readonly BUCKETS=(
"gs://$PROJECT-terraform"
"gs://test-$PROJECT-terraform"
)

# functions
function run() {
Expand Down Expand Up @@ -187,15 +190,19 @@ function to_create_service_account() {
run "$cmd" to_create_service_account
# Terraformのstate管理用バケット作成
# "gs://test-$PROJECT-terraform"の方はテストコードで使用するfakeリソース
# ref. https://cloud.google.com/storage/docs/gsutil/commands/mb
cmd=`cat <<EOF
for BUCKET in "${BUCKETS[@]}"; do
cmd=`cat <<EOF
gsutil mb -p $PROJECT -c multi_regional -l Asia $BUCKET
gsutil versioning set on $BUCKET
EOF`
function to_make_bucket() {
if ! gsutil ls -b $BUCKET > /dev/null 2>&1; then
echo "make a bucket for Terraform and enable versioning"
eval "${cmd}"
fi
}
run "$cmd" to_make_bucket
function to_make_bucket() {
if ! gsutil ls -b $BUCKET > /dev/null 2>&1; then
echo "make a bucket for Terraform and enable versioning"
eval "${cmd}"
fi
}
run "$cmd" to_make_bucket
done
56 changes: 28 additions & 28 deletions terraform/environments/prod/tier1/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions terraform/environments/prod/tier1/backend.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ terraform {
# sandbox環境は直書きしても問題ないが、自分用の環境のバケット設定を維持するためにこのフォルダ内の.gitignoreに
# backend.tf(このファイル)を指定するなどしてGit管理されないようにする

bucket = "your-terraform-bucket-name"
prefix = "terraform/tier1-state"
bucket = "your-terraform-bucket-name"
prefix = "terraform/tier1-state"
}
}
2 changes: 1 addition & 1 deletion terraform/environments/prod/tier1/prod-tier1.auto.tfvars
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
subnet_ip = "10.1.1.0/24"
subnet_ip = "10.1.1.0/24"
peering_network_address = "10.1.2.0"
56 changes: 28 additions & 28 deletions terraform/environments/prod/tier2/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions terraform/environments/prod/tier2/backend.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ terraform {
# sandbox環境は直書きしても問題ないが、自分用の環境のバケット設定を維持するためにこのフォルダ内の.gitignoreに
# backend.tf(このファイル)を指定するなどしてGit管理されないようにする

bucket = "your-terraform-bucket-name"
prefix = "terraform/tier2-state"
bucket = "your-terraform-bucket-name"
prefix = "terraform/tier2-state"
}
}
4 changes: 2 additions & 2 deletions terraform/environments/prod/tier2/data.tf
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
data "terraform_remote_state" "tier1" {
backend = "gcs"
config = {
bucket = "${local.project_id}-terraform"
prefix = "terraform/tier1-state"
bucket = "${local.project_id}-terraform"
prefix = "terraform/tier1-state"
}
}
2 changes: 1 addition & 1 deletion terraform/environments/sbx/tier1/sbx-tier1.auto.tfvars
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
subnet_ip = "10.4.1.0/24"
subnet_ip = "10.4.1.0/24"
peering_network_address = "10.4.2.0"
4 changes: 2 additions & 2 deletions terraform/environments/sbx/tier2/backend.tf
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ terraform {
# sandbox環境は直書きしても問題ないが、自分用の環境のバケット設定を維持するためにこのフォルダ内の.gitignoreに
# backend.tf(このファイル)を指定するなどしてGit管理されないようにする

bucket = "your-terraform-bucket-name"
prefix = "terraform/tier2-state"
bucket = "your-terraform-bucket-name"
prefix = "terraform/tier2-state"
}
}
Loading

0 comments on commit 0d1041b

Please sign in to comment.