ようへいの日々精進XP

よかろうもん

CodePipeline をちょっと試す(オンプレの Jenkins と連携させてみる)

はじめに

せっかくなんで

inokara.hateblo.jp

前回は CodePipeline と CodeDeploy を組み合わせてデプロイの自動化みたいなことを試してみたが、あくまでもソースコードの定義とデプロイの実行だけというステップでビルドやテスト等は省略していた。今回はせっかくなので前回の記事で作成した Pipeline にビルドやテストで利用可能な Jenkins を絡めてみたいと思う。

構成図

以下のように前回の検証環境に Jenkins サーバーを追加する。

f:id:inokara:20150717164407p:plain


事前準備

事前に CodePipeline 用のユーザーを作成しておく

今回は jenkins という IAM ユーザーを作成して credential な情報を控えておく。

f:id:inokara:20150717120955p:plain

尚、以下のようなポリシーを定義した。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codedeploy:*",
                "codepipeline:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:Get*",
                "s3:List*"
            ],
            "Resource": [
                "arn:aws:s3:::*/*"
            ]
        }
    ]
}

Jenkins の用意

Jenkins のインストール

Jenkins をインストールするのは Ubuntu 14.04 環境。

wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins -y

上記のようにサクッとインストール完了。一応、以下のように Jenkins が動作しているかを確認する。

$ curl http://localhost:8080/api/json?pretty=true
{
  "assignedLabels" : [
    {

    }
  ],
  "mode" : "NORMAL",
  "nodeDescription" : "the master Jenkins node",
  "nodeName" : "",
  "numExecutors" : 2,
  "description" : null,
  "jobs" : [
  ],
  "overallLoad" : {

  },
  "primaryView" : {
    "name" : "All",
    "url" : "http://localhost:8080/"
  },
  "quietingDown" : false,
  "slaveAgentPort" : 0,
  "unlabeledLoad" : {

  },
  "useCrumbs" : false,
  "useSecurity" : true,
  "views" : [
    {
      "name" : "All",
      "url" : "http://localhost:8080/"
    }
  ]
}

Jenkis は正常に起動しているようだ。

尚、Jenkins は最低限のセキュリティ設定(グローバルセキュリティの設定にて設定)を行っておくこと。

CodePipeline プラグインの導入

CodePipeline と Jenkins を連携させる為には Jenkins プラグインとして CodePipeline プラグインが用意されている。

github.com

導入は「プラグインの管理」からインストールを行う。尚、CodePipeline プラグインGitHubリポジトリから zip ファイルを展開して hpi ファイルをアップロードする方法でインストールを行う。

f:id:inokara:20150717120142p:plain

「インストール済み」タブにて確認を行う。

f:id:inokara:20150717120339p:plain


フリースタイルプロジェクトのジョブを作成

f:id:inokara:20150717121016p:plain

ジョブの設定(1)

ソースコード管理より「CodePipeline」を選択すると以下のような設定項目が現れる。

f:id:inokara:20150717161619p:plain

先ほど控えておいた credential な情報と共に Category から Build を選択する。Build 以外にも Test を選択することが出来る。これが CodePipeline の各 Stage する Action に該当する。また、Provider には任意の名前を設定することが出来るが、下図のように Pipeline のBuild actions で指定する Build provider の名前と合わせておく必要がある。

f:id:inokara:20150717162110p:plain

ジョブの設定(2)

さらに「ビルド・トリガ」と「シェルの実行」を設定する。

f:id:inokara:20150717122106p:plain

「ビルド・トリガ」についてはドキュメントによると...

In Build Triggers, clear any check boxes, and then select Poll SCM. In Schedule, type five asterisks separated by spaces, as follows:

とあるので、SCMをポーリング にチェックしてスケジュールもそのまま利用する。

* * * * *

ビルドに関しては今回はチョー簡単なものを。実際には S3 からダウンロードされたソースコードをビルドしたりテストを行ったりする処理を記述する。

echo "build"

CodePipeline に組み込む

Build アクションに Jenkins のジョブを組み込む

既存の Pipeline で Edit をクリックして Pipeline を修正する。

f:id:inokara:20150717153007p:plain

アクションを追加した後、Save pipeline changes をクリックして保存すると以下のようなエラーが出る。

f:id:inokara:20150717153103p:plain

このエラーは各 Action を関連付ける為の artifact の指定が無い又は誤りがある場合に出力されるエラーなので以下のように設定する。

f:id:inokara:20150717153629p:plain

Build の次の Action である Beta の Input artifact を確認すると以下のように指定している。

f:id:inokara:20150717154837p:plain

個人的に Action の関連付けについてワケワカメな状態になってきたので以下のように図示してみた。

f:id:inokara:20150717154618p:plain

こうやって図示してみるとちょっと判った気がする。

試しに push してみる

ということで、試してにソースコードを S3 に push してデプロイしてみる。

aws deploy push --application-name MyApp --s3-location s3://inokappa-codedeploy/MyApp.zip --source ./ --region us-east-1

S3 にアップロードされたことが認識され Deploy が開始される。

f:id:inokara:20150717160227p:plain

次に Jenkins での Build が開始される。

f:id:inokara:20150717160242p:plain

Jenkins 側では SCM ポーリング(バージョン管理システムのポーリング)を行っている為、ポーリングのログにジョブのリクエストが発生していることが記録されビルドが開始される。

f:id:inokara:20150717160459p:plain

Jenkins でのビルドの結果は以下のように出力されている。

f:id:inokara:20150717170150p:plain

ビルドが正常に終了すると Beta 環境へのデプロイが行われる。

f:id:inokara:20150717160509p:plain

ひとまず Jenkins での処理を挟むことは出来たようだ。

成果物は改めて S3 にアップロード

ビルドを行った Jenkins のジョブが出力したログを見ると以下のように記録されている。

f:id:inokara:20150717170202p:plain

S3 バケットを確認するとログに記録されている通りのバケットが作成されオブジェクトが作成されている。

f:id:inokara:20150717170244p:plain

オブジェクトをダウンロードして展開すると push されたコンテンツファイルを確認することが出来た。(※本来であればビルドした成果物がアップロードされて次の Action に利用されると思われる。)


ということで

CodePipeline で Jenkins の連携を試してみたが、意外に簡単に連携することが出来た。また、外部からアクセスが出来ない内部ネットワーク上で稼働している Jenkins サーバーも利用出来るのは嬉しい誤算だった。(試す前は Jenkins は外部からアクセスが必要になると思っていた)

今回はちょっと触れてみるレベルの連携を試してみたが、次回はビルドしてテストしてまでの連携を Jenkins を利用して検証していきたい。