ng --prod build
するAWS CLIをDocker環境で実行する で紹介されていた Dockerfile に、 node と Angular をインストールするスクリプトを追加したものです。
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
としておきます。
#!/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コンテナ内で、次の環境変数が必要です。
これらの値は、後述の docker run
する時に渡します。
Dockerfile
のあるディレクトリで、以下のコマンドを実行します。
docker build -t aws-angular .
docker images
で aws-angular が作成されていれば成功です。
実行スクリプトファイル Deploy.sh
があるディレクトリで、以下のコマンドを実行します。
環境変数に入れる値はそれぞれ準備してください。
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
これを実行すると、
ng --prod build
するが順次実行されます。