Skip to content

Commit

Permalink
Merge pull request #232 from codeforjapan/develop
Browse files Browse the repository at this point in the history
production deploy by GitHub Actions
  • Loading branch information
ayuki-joto authored May 24, 2021
2 parents a966f86 + a15dbea commit 95fb24a
Show file tree
Hide file tree
Showing 14 changed files with 244 additions and 153 deletions.
84 changes: 77 additions & 7 deletions .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,45 @@ on:
push:
branches:
- develop
- master
tags:
- 'v*'

jobs:
deploy:
create-app-env:
runs-on: ubuntu-latest
timeout-minutes: 60
outputs:
image-tag: ${{ steps.output-app-env.outputs.image-tag }}
eb-environment-name: ${{ steps.output-app-env.outputs.eb-environment-name }}

steps:
- uses: actions/checkout@v2

- name: Set env to staging
id: set-env-staging
if: endsWith(github.ref, 'heads/develop')
run: |
echo "IMAGE_TAG_PREFIX=staging" >> $GITHUB_ENV
echo "EB_ENVIRONMENT_NAME=staging" >> $GITHUB_ENV
- name: Set env to production
id: set-env-production
if: endsWith(github.ref, 'heads/master') || contains(github.ref, 'tags/v')
run: |
echo "IMAGE_TAG_PREFIX=production" >> $GITHUB_ENV
echo "EB_ENVIRONMENT_NAME=production" >> $GITHUB_ENV
- name: Output App Env
id: output-app-env
run: |
echo "::set-output name=image-tag::${IMAGE_TAG_PREFIX}-${GITHUB_SHA::8}"
echo "::set-output name=eb-environment-name::${EB_ENVIRONMENT_NAME}"
build:
runs-on: ubuntu-latest
timeout-minutes: 1200
needs: create-app-env

steps:
- uses: actions/checkout@v2
Expand All @@ -25,14 +59,51 @@ jobs:
uses: aws-actions/amazon-ecr-login@v1

- name: Build, tag, and push image to Amazon ECR
if: endsWith(github.ref, 'heads/master') || endsWith(github.ref, 'heads/develop')
env:
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
IMAGE_TAG: staging
IMAGE_TAG: ${{ needs.create-app-env.outputs.image-tag }}
run: |
docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
deploy:
runs-on: ubuntu-latest
timeout-minutes: 1800
if: endsWith(github.ref, 'heads/develop') || contains(github.ref, 'tags/v')
needs:
- create-app-env
- build

steps:
- 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: ap-northeast-1

- name: Login to Amazon ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v1

- name: Check if ECR Image exists with tag
if: contains(github.ref, 'tags/v')
env:
IMAGE_TAG: ${{ needs.create-app-env.outputs.image-tag }}
ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
run: |
EXIT_CODE=0
aws ecr describe-images --repository-name=$ECR_REPOSITORY --image-ids=imageTag=$IMAGE_TAG 2> /dev/null || EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo "${IMAGE_TAG} image tag not found"
exit 1
fi
- uses: actions/setup-python@master
with:
python-version: "3.7"
Expand All @@ -42,13 +113,12 @@ jobs:

- name: Deploy to Elastic Beanstalk
env:
EB_ENVIRONMENT_NAME: ${{ needs.create-app-env.outputs.eb-environment-name }}
IMAGE_TAG: ${{ needs.create-app-env.outputs.image-tag }}
ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
ECR_REPOSITORY: ${{ secrets.AWS_ECR_REPO_NAME }}
IMAGE_TAG: staging
EB_ENVIRONMENT_NAME: staging
run: |
cp -r .ebextensions/ deployments/.ebextensions
cd deployments
sed -i -e "s|t2.small|t2.micro|g" .ebextensions/00_options.config
cp ${EB_ENVIRONMENT_NAME}/00_options.config .ebextensions/00_options.config
sed -i -e "s|{RepositoryName}|$ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG|g" Dockerrun.aws.json
eb deploy ${EB_ENVIRONMENT_NAME}
eb deploy ${EB_ENVIRONMENT_NAME} --timeout=20
117 changes: 0 additions & 117 deletions .platform/nginx/nginx.conf

This file was deleted.

109 changes: 91 additions & 18 deletions DEPLOYMENT.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,72 @@
# ※GUIでElastic Beanstalkの設定をいじらないでください。デプロイで戻ります。

Elastic Beanstalkの設定はコードで管理されています。

インスタンスタイプやオートスケールの設定が違うため、stagingとproductionで一部ファイルが別です。それ以外の共通の設定は同じファイルを使っているので気を付けて下さい。

共通: [deployments/.ebextensions](deployments/.ebextensions)

staging: [deployments/staging](deployments/staging)
production: [deployments/production](deployments/production)

デプロイの際に上記の設定ファイルを元にデプロイが実行されます。コードでの設定がある場合、インフラも含め反映されます。

急ぎで、GUIで変更することはあると思います。しかし、GUIだけ変更してソースコードを変更しないと、デプロイの際に戻って事故の原因になります。なので、ソースコードに反映してください。

現状、認証情報等の非公開情報の設定方法が検討中なので、環境変数だけはGUIから設定してください。

GUIの設定とコードの書き方は、[公式](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options-general.html#command-options-general-elasticbeanstalkapplicationenvironment)を参考にしてください。

# GitHubからデプロイ

ワークフローの設定:[.github/workflows/deploy.yml](.github/workflows/deploy.yml)
デプロイの基本設定: [./deployments/](./deployments/)

1. ECRにログイン
1. Dockerコンテナをbuild
1. short commit hashを含む環境ごとのタグで、ECRにDockerイメージをpush
1. elastic beanstalkに該当のイメージを指定してデプロイ

Dockerイメージのタグ例: staging-dfasfste

```
[デプロイされる環境名]-[commit-hash]
```

## GitHubに必要な環境変数

- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- AWS_ECR_REPO_NAME

## デプロイ手順

### production

切り戻しを早くするため、masterマージの際、Dockerイメージは毎回buildします。

パイプラインが通ったのを確認後、git上でデプロイしたいコミットに、v○○とタグを打ちます。
タグはvから始まる必要があります。すぐにeb deployが実行されます。

例: v1.0.0

### staging

developブランチにpushすると自動でデプロイされます。

## 切り戻し

### production

普通にデプロイするのと同様に戻したい先commitに対してタグを打ちます。
バグの場合、バグが発生したcommitの1つ前のcommitにたいしてタグを打ちます。

コンテナイメージはbuild済みなので、すぐにeb deployが実行されます。

### staging

revetしてdevelopブランチにpushしてください。

# CfJ Decidim AWS への Install(Beanstalk 編)

## 1. Install AWS tools and setup user
Expand All @@ -21,11 +90,22 @@ bundle install

## 4. Elastic Beanstalk に 環境をセットアップする

[https://platoniq.github.io/decidim-install/decidim-aws/] 手順書の手順3に従って環境を作る
手順書の[手順3](https://platoniq.github.io/decidim-install/decidim-aws/#3-initialize-elasticbeanstalk)に従って環境を作る


[Dockerrun.aws.json](./deployment/Dockerrun.aws.json)`{RepositoryName}`をECRのデプロイしたいイメージパスに修正。作成したい環境の設定をコピー。

[deployments/.elasticbeanstalk/config.yml](deployments/.elasticbeanstalk/config.yml)に設定があるので、基本的に何も聞かれないはずです。

eb create を実施

```bash
cd deployments

// production
cp deployments/production/00_options.config .ebextensions/00_options.config
// staging(台数とかインスタンスタイプが小さい)
cp deployments/staging/00_options.config .ebextensions/00_options.config

eb create production
```

Expand All @@ -39,40 +119,33 @@ eb setenv SECRET_KEY_BASE=$(bin/rails secret)

## 5. Postgres データベースを作成する

EB コンソールの該当環境から、Configuration を選択、Database を選択し、Edit をする

必要な設定を行い、DBを立ち上げる

その後`eb deploy`を実行

## 6. Healthcheck の条件を変更

`/` が301を返すので、一旦 301 でもOKにする

Elastic Beanstalk の Configuration 画面で、Health Check を選び、Process の条件を 80 から 301 にする

![img](https://i.imgur.com/VNZDQxA.png)
![img2](https://i.imgur.com/j595JQF.png)

## 7. CNAME 設定とSSL設定
## 6. CNAME 設定とSSL設定

Elastic Beanstalk のインスタンスをAレコードとして割り当てる

ロードバランサの設定をする(手順[6.2 Configure SSL](https://platoniq.github.io/decidim-install/decidim-aws/#62-configure-ssl)

## 8. 最初のユーザを作る
## 7. 最初のユーザを作る

[6.3 Create the first admin user](https://platoniq.github.io/decidim-install/decidim-aws/#63-create-the-first-admin-user)
に従う(root で)

## 9. SES の設定をする
## 8. SES の設定をする

[6.4 Setup email](https://platoniq.github.io/decidim-install/decidim-aws/#64-setup-email)

## 10. REDIS の設定をする
## 9. REDIS の設定をする

[6.5 Configure the job system with Sidekiq and Redis](https://platoniq.github.io/decidim-install/decidim-aws/#65-configure-the-job-system-with-sidekiq-and-redis)

## 11. S3 の設定をする
stagingはcloud formationで作成しています。

[.cloudformation/elastic_cache.yml](.cloudformation/elastic_cache.yml)

## 10. S3 の設定をする

[6.6 File storage](https://platoniq.github.io/decidim-install/decidim-aws/#66-file-storage)
File renamed without changes.
5 changes: 3 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,9 @@ ENV LANG=C.UTF-8 \
BUNDLER_VERSION=1.17.3 \
APP_HOME=/app \
RAILS_ENV=${RAILS_ENV} \
SECRET_KEY_BASE=placeholder \
RAILS_SERVE_STATIC_FILES=true
RAILS_LOG_TO_STDOUT=true \
RAILS_SERVE_STATIC_FILES=true \
SECRET_KEY_BASE=placeholder

WORKDIR $APP_HOME

Expand Down
Loading

0 comments on commit 95fb24a

Please sign in to comment.