Docker で AngularアプリをビルドしてAWS S3へデプロイする

## やりたい事

1. git repo からソースを clone する（複数の repo を clone する必要がある)
2. それは Angular のアプリなので、 ``ng --prod build`` する
3. ビルドされたアプリのファイル群を aws cli を使って S3 にアップロードする

## Dockerfile

[AWS CLIをDocker環境で実行する](https://qiita.com/ABCompany1/items/c92ac5087519c103f056) で紹介されていた Dockerfile に、 node と Angular をインストールするスクリプトを追加したものです。

```dockerfile
FROM python:3.6

ARG pip_installer="https://bootstrap.pypa.io/get-pip.py"
ARG awscli_version="1.16.76"

# Install awscli
RUN pip install awscli==${awscli_version}

# Install sam
RUN pip install --user --upgrade aws-sam-cli
RUN mkdir /data
RUN chmod -x /data

# Install nodejs
RUN apt-get update 
RUN apt-get install curl software-properties-common -y
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash -
RUN apt-get install nodejs

# Install angular
RUN npm install -g @angular/cli@7.3.6

ENV PATH $PATH:/root/.local/bin
```

## 実行スクリプト

次に Docker 内で実行するスクリプトです。
ファイル名は ``Deploy.sh`` としておきます。

```bash
#!/bin/sh

# Setup git user/password
echo -e "machine $GIT_DOMAIN\nlogin $GIT_USER\npassword $GIT_PW" > ~/.netrc

# Create work directory
mkdir work
cd work

# Clone projects
git clone -b $GIT_BRANCH https://xxxx/my-awesome-lib.git
git clone -b $GIT_BRANCH https://xxxx/my-awesome-app.git

# Restore node_modules
cd my-awesome-lib
npm ci
cd ..

# Build angular prod
cd my-awesome-app
npm ci
ng --base-href=./ --prod build

# Deploy to S3
aws s3 sync ./dist/my-awesome-app/ s3://my-awesome-bucket/www --acl public-read
```

冒頭で言ったように、複数のリポジトリから Clone する必要があるプロジェクトです。
また Private なので user/password が必要ですが、どうせ docker コンテナは使い捨てだし ``.netrc`` でいっか、と思ってますがどうなんでしょう？

clone した後、それぞれのディレクトリに移動して ``npm ci`` をして node_modules を復元します。

その後、Angular アプリをビルド (``ng --prod build``)します。

最後に、 ``s3 sync`` で AWS S3 の指定バケットにアップロードしています。``--acl public-read`` は、誰でも閲覧できるサイトにするために付けています。

### 必要な環境変数

Dockerコンテナ内で、次の環境変数が必要です。

* Git アクセス
    * GIT_DOMAIN - git リポジトリのドメイン
    * GIT_USER - git ユーザー
    * GIT_PW - ↑のパスワード
    * GIT_BRANCH - 取得する branch 名
* AWS S3 アクセス
    * AWS_ACCESS_KEY_ID - S3 への書込権限を持った IAMユーザーのアクセスキー
    * AWS_SECRET_ACCESS_KEY - ↑のシークレットキー
    * AWS_DEFAULT_REGION - リージョン（S3 だから要らないかも）

これらの値は、後述の ``docker run`` する時に渡します。

## Docker イメージのビルドとコンテナの実行

### Docker イメージのビルド

``Dockerfile`` のあるディレクトリで、以下のコマンドを実行します。

```
docker build -t aws-angular .
```

``docker images`` で aws-angular が作成されていれば成功です。


### コンテナ実行スクリプト

実行スクリプトファイル ``Deploy.sh`` があるディレクトリで、以下のコマンドを実行します。
環境変数に入れる値はそれぞれ準備してください。

```bash
docker run -it \
 -e AWS_ACCESS_KEY_ID=xxxx \
 -e AWS_SECRET_ACCESS_KEY=xxxxxxx \
 -e AWS_DEFAULT_REGION=ap-northeast-1 \
 -e GIT_DOMAIN=your.repo.com \
 -e GIT_USER=your_user_id \
 -e GIT_PW=your_password \
 -e GIT_BRANCH=master \
 -v $(pwd):/data \
 aws-angular sh /data/deploy.sh
```

これを実行すると、

1. git repo からソースを clone する（複数の repo を clone する必要がある)
2. それは Angular のアプリなので、 ``ng --prod build`` する
3. ビルドされたアプリのファイル群を aws cli を使って S3 にアップロードする

が順次実行されます。


## 参考

* [AWS CLIをDocker環境で実行する - Qiita](https://qiita.com/ABCompany1/items/c92ac5087519c103f056)
* [How to Install Latest Nodejs with Npm on Ubuntu 18.04 (Linux)](http://www.codebind.com/linux-tutorials/install-latest-nodejs-npm-ubuntu-18-04-linux/)
* [GitHubでユーザ名・パスワード省略（push, pull） - Qiita](https://qiita.com/azusanakano/items/8dc1d7e384b00239d4d9#1-netrc%E3%81%AB%E3%83%A6%E3%83%BC%E3%82%B6%E5%90%8D%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F)
* [Using High-Level (s3) Commands with the AWS CLI - AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html)