人生がつまらないのは、面白さに気づいてないだけ

右脳で感じたことを左脳で吐き出すためのブログ。

CodePipelineが面白い

最近はmining expressの記事一色だったので、たまにはエンジニアらしく技術方面の真面目な記事もアップしておきます。

昨今、サーバレスアーキテクチャが人気を博しておりますが、私の勤務先でもサーバレスへの移行が徐々に進んでおります。その中で現在私は、デプロイ周りのシステム構築整備を担当しており、AWSのCodePipelineというサービスに注目しています。

そこで本記事では、gitlabにて管理しているソースコードをCodePipelineとgitlab-ciの機能を活用することにより、まずはgitlabからCodeBuildへソースコードを転送、ビルドさせる方法について紹介したいと思います。最終的には、ビルド後のアーティファクトをさらにCodePipeline上を経由し、CodeDeployにてBlue/Greenデプロイさせるというのが目的になりますが、その内容はまた後日ご紹介します。

本記事で紹介するデプロイフローの大まかな流れを簡単に表すとこんな感じ。 GitLab-CI >> S3 >> CodePipeLineがS3イベント検知 >> CodeBuild >> ビルド

 

では参りましょう。

① gitlab-ci

gitlab-ciの設定は、ソースプロジェクトのルートディレクトリに .gitlab-ci.yml という名前のyamlファイルをおいておくことで設定できます。CIにやらせたいことは大きく2つです。1つはプロジェクト全体をzip化させること。もう1つはzipしたファイルをS3にアップロードすることです。実際のサンプルを以下に示しました。 script という設定項目に注目していただいたら何をしたいのかおわかりいただけるかと思います。

s3-source-upload:
  <<: *deploy_prepare
  stage: production
  script:
    - cd $APPHOME && zip -r ../source.zip .
    - aws s3 cp ../source.zip $S3BUCKET/test_project/
  only:
    - tags
    - master

② CodePipelineの設定

S3からCodeBuild、そしてCodeDeployまでのPipelineはすべてCodePipelineの管理画面上からできちゃうみたいなので、早速CodePipelineを設定します。以下、画像キャプチャにて管理画面での設定方法を載せました。

まずは、「パイプラインの作成」を押す。

f:id:daily_sensor:20191121231607p:plain
CodePipelineを開いた画面

f:id:daily_sensor:20191121232015p:plain
pipeline名をつける

f:id:daily_sensor:20191121232113p:plain
ソースプロバイダはS3に

S3の設定は、gitlab-ciで設定した、ソースコードのアップロード先の情報を入力します

f:id:daily_sensor:20191121232241p:plain
S3の設定

f:id:daily_sensor:20191121232344p:plain
ビルドステージの設定

これで設定完了です。 改めて、CodePipelineの画面に戻ると、、、、 無事、S3からCodeBuildへのパイプラインが完成していますね。

f:id:daily_sensor:20191121232637p:plain
CodePipelineが完成

残念ながらCodeBuild上でのビルド処理でエラーが出ているようですね。 詳細をクリックすると、、、

f:id:daily_sensor:20191121233055p:plain
エラーログ

f:id:daily_sensor:20191121233321p:plain
エラーログ2

画面上でログまで見れちゃうんですね。おもしろい。試しにlsしてるとこを見てもらうとわかるのですが、zipしたアーカイブは自動で最初のカレントディレクトリに解凍されてるみたいでした。

③ codebuildの設定

codebuildを動かすためにもyamlでの設定ファイルが必要です。先程のgitlab-ciと同じく、プロジェクトのルートディレクトリに buildspec.yml という名前でファイルを置いておくと、AWS側が勝手にそれを認識してくれて、そのymlファイルでのビルド設定内容に基づいてビルドを行ってくれるらしいのです。goのアプリなら例えばこんな感じで記述。

version: 0.2
phases:
  pre_build:
    commands:
      - cd /.go/src/test_project
      - dep ensure
  build:
    commands:
      - go build -o test_project

簡単ですね。

というわけで、AWSのCodePipelineで遊んでみた話でした。一度構築できたら、コードをプッシュするだけで、サーバへのデプロイまで終わらせられるのは、とてつもない運用工数削減になりそうで、いまからワクワクしてます。

次は、CodeBuildからCodeDeployへつなげてみようと思います。お楽しみに。