はじめに
こんばんは。 今日は仕事を終わらした後、輪読会の本を読んで、資料を作ってみたいなことをやろうと思ってたら、いまお仕事を頂いている会社のjenkinsがぶっ壊れたということだったので、それの復旧で体力を使ってしまい何もやる気が起きなくなりました...
とりあえず、悩んだことを備忘録として書き残しておきます。
EBのことはほぼほぼわかってないので、雰囲気でやりました。
まず、前提として、今までのデプロイは、jenkins -> eb deploy というフローをとっており、そのjenkinsがぶっ壊れてしまったのでデプロイができないという状況でした。
社内でjenkinsの面倒をみれる方が退職していらっしゃらないようだったので、 jenkinsからebを叩くというフローを、circleCIから ebを叩くというフローに変更しました。
本題
1. circleCIでawsコマンドを叩くためインストールしたい
直接installしました。 imageとかあるのかな...?
steps: - run: sudo apt update - run: sudo apt install -y python-pip python-dev - run: sudo pip install awsebcli
2. gdライブラリをインストールしたい
デプロイしたいレポジトリで phpspreadsheet
を使ってるのでGDが必要なのでinstallしました。
steps: - run: sudo apt-get install -y libpng-dev libjpeg-dev libwebp-dev - run: sudo docker-php-ext-configure gd --with-jpeg-dir=/usr/lib/x86_64-linux-gnu/ --with-webp-dir==/usr/lib/x86_64-linux-gnu/ - run: sudo docker-php-ext-install gd
3. composerから落としてきたライブラリ群も一緒にデプロイしたい
eb deployは git archive
されたzipファイルをアップロードするので、 composerから落としてきたファイル群は含まれません。
circleCI上にcheckoutしてきたレポジトリで、一回 git commitまですれば git archive
に含まれます。
ただ、基本的に vendors
とかはignore設定されていると思うので、無理やり外しちゃいます。
commit logは直前のcommit logを適用します。
steps: - run: composer install --no-dev -n --prefer-dist - run: sed -i -e "s/vendors//g" .gitignore - run: git config user.email "xxxxxxxxxx@gmail.com" - run: git config user.name "zzzzzzzzzz" - run: git add . - run: git log --pretty=format:"%h - %an, %ar %s" -n 1 | xargs -ICOMMIT_LOG git commit -m COMMIT_LOG
ただ、こんなことをしなくても 以下のようにやればもっとスマートに出来そうでした。
やってる時点で、「こんなムリヤリしなければいけないのはおかしいな」と思ってたのですが、案の定別のやり方がありました。awsむずかしい...
4. StagingにあげたものをProductionにあげたい
環境変数で切り分けているので、StagingにあげたバージョンをそのままProductionに適用したいのですが、そのまま eb deploy
とかしちゃうと別バージョンで作られちゃいます。
--version
を指定できればやりたいことが叶うので今回も無理やりました。
steps: - run: eb status staging | grep "Deployed Version" | cut -d" " -f5 > app_version - run: cat app_version | xargs -IAPP_VERSION eb deploy product --version APP_VERSION
5. PRマージされたらStagingにデプロイしたい
workflows: version: 2 build: jobs: - staging_deploy: filters: branches: only: develop
6. リリースタグ切られたらProductionにデプロイしたい
workflows: version: 2 build: jobs: - production_deploy: filters: tags: only: /^release-.*/ branches: ignore: /.*/
終わりに
今までCircleCIもAWSもすごく雰囲気でやっちゃってましたので、疲れました。
無理やり頑張ったので、もっとシンプルにわかりやすく書くとどうなるかが知りたいです。
現場からは以上です。