もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

elasticbeanstalk に振り回された一日だった

はじめに

こんばんは。 今日は仕事を終わらした後、輪読会の本を読んで、資料を作ってみたいなことをやろうと思ってたら、いまお仕事を頂いている会社の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しました。

packagist.org

    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

ただ、こんなことをしなくても 以下のようにやればもっとスマートに出来そうでした。

stackoverflow.com

やってる時点で、「こんなムリヤリしなければいけないのはおかしいな」と思ってたのですが、案の定別のやり方がありました。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もすごく雰囲気でやっちゃってましたので、疲れました。

無理やり頑張ったので、もっとシンプルにわかりやすく書くとどうなるかが知りたいです。

現場からは以上です。