Help us understand the problem. What is going on with this article?

弊社ECサイト用APIサーバのCI/CD環境今昔

More than 1 year has passed since last update.

ハンズラボ Advent Calendar 2018 16日目の記事です。

ECサイト担当になって早3年を過ぎ、その間にCI/CD環境を継続して改善し続けてきました。
この度ようやくParavirtualなインスタンスで動作していたJenkinsサーバを停止し、一段落したこともあり、来し方を振り返ってみます。

APIサーバのCI/CD環境今昔

チーム参加時点(2015/09)

  Gitリポジトリ: Atlassian Stash
    - 今はBitbucketに吸収されてしまいました
  CI: Jenkins
    - Antから以下を実行
        - PHP Lint(php -l)
        - PHP Mess Detector
        - PHP Code Sniffer
        - PHPUnit
  CD: Jenkins
    - eb deployコマンドをbashスクリプトで実行

当時を振り返って

  • Atlassian Stashにログインできるメンバーが社内に数名しかいなかった・・・
  • AntジョブがXMLで書いてありメンテナンスできない

Gitリポジトリ移行(2015/12)

+ Gitリポジトリ: Backlog

当時を振り返って

  • BacklogのGitリポジトリでプルリクエスト機能が追加されたこともありBacklogへ移行
    • Githubも社内で利用開始していたが、Backlogは当時からエンタープライズプランで追加費用がなかった

決済APIサーバ分離(2016/02)

+ CI: Jenkins
+    - Antをやめて、composerスクリプトでの実行に修正
+ CD: Jenkins
+    - bashスクリプトで待機系を判定し、待機系へ`eb deploy`

当時を振り返って

  • ステージング環境と本番環境のAWSアカウントの分離にチャレンジした
    • ステージング環境にdeployしたCommitと本番環境に差異を発生させたくなかったため、ステージング環境deploy時に本番環境の待機系へもdeploy
    • 本番環境のCNAMEから待機系を判断
  • Jenkinsユーザが実行するジョブをvisudoで追加するのを忘れていて動かない

決済APIサーバのCI/CD環境移行(2018/06)

+ Gitリポジトリ: CodeCommit
+ CI: CodePipeline + CodeBuild
+   - PHP Parallel Lint に変更
+   - CodeBuildのDockerイメージでhttpdを起動してAPIのテストを実行
+ CD: CodeBuild
+   - CodeBuildからeb deployコマンドをbashスクリプトで実行

当時を振り返って

  • Meltdown/Spectre以降、Paravirtualインスタンスへのメンテナンス頻度が上がり、Jenkins廃止の機運が高まった
  • CodePipelineはBacklogのGitリポジトリからhookできない・・・
    • CodeCommitの使い心地を試してみる
  • CodeBuildでのCIでハマる
    • 今はローカル実行できていいですよね・・・
  • CodePipelineからElastic BeanstalkへdeployしたいがAWSアカウントをまたいでのdeployは素直には無理
    • 仕方なくCodeBuildからeb deployする

APIサーバのCI/CD環境移行(2018/11)

+ Gitリポジトリ: Github
+ CD: CodePipeline + Lambda
+   - CodePipelineからElastic Beanstalkの待機系へdeploy
+   - 手動承認したらLambdaでswap
+   - swap完了後に未deploy側へdeploy
+   - deploy完了したら再swap

当時を振り返って

  • CodeCommit辛い
    • プルリクエストしたらAWSのマネジメントコンソール開くの???
    • httpsにしてもsshにしても辛い
    • 諦めてGithubに移行
  • CodeBuildでのPHPMD/PHPCSで落ちる
    • Jenkinsサーバでは通るが、新環境では落ちる・・・
    • 仕方なく、通るまでチェックルールからルールを一つずつ削除する。辛い。
  • ステージング環境と本番環境のAWSアカウントを分離
    • featureブランチからdevelopブランチにマージ→ステージング環境にdeploy
    • developブランチからmasterブランチにマージ→本番環境にdeploy
  • CodePipelineからのLambda呼び出しでハマる
    • LambdaからCodePipelineへ「ジョブが完了した」と通知する必要がありました
import boto3
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

SOURCE_EB = os.environ['source_eb']
DEST_EB = os.environ['dist_eb']

def lambda_handler(event, context):
    logger.info(event)

    try:
        beanstalk = boto3.client('elasticbeanstalk')
        response = beanstalk.swap_environment_cnames(
            SourceEnvironmentName = SOURCE_EB,
            DestinationEnvironmentName = DEST_EB,
        )

        logger.info(response)

    except Exception as e:
        logger.error(e)
        raise e

    try:
        codepipeline = boto3.client('codepipeline')
        jobid = event['CodePipeline.job']['id']
        response = codepipeline.put_job_success_result(
            jobId=jobid,
        )

        logger.info(response)

    except Exception as e:
        logger.error(e)
        raise e

今後

Elastic BeanstalkへのAmazon Linux2の公式対応待ちです。
その際には決済APIサーバのCI/CD方式をAPIサーバに合わせる予定です。
ECS + Fargate環境にも挑戦したいです。
今後も改善は続きます。

参考資料

ハンズラボ Advent Calendar 2018 明日17日目は@sr-mtmtです!

hands-lab
ハンズラボは小売業特化型ITソリューション企業です。数十万に及ぶ膨大な商品マスタを扱ってきた豊富なノウハウで、お客様の現場に最適なシステムを提案・開発します。 エンジニア募集中
https://www.hands-lab.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした