87
AWS Black Belt Online Seminar AWS上のJenkins活用方法 アマゾンウェブサービスジャパン株式会社 トレーニングデリバリマネージャ 大村 幸敬 2017.01.24

AWS Black Belt Online Seminar AWS上のJenkins活用方法

Embed Size (px)

Citation preview

Page 1: AWS Black Belt Online Seminar AWS上のJenkins活用方法

【AWS Black Belt Online Seminar】AWS上のJenkins活用方法

アマゾンウェブサービスジャパン株式会社

トレーニングデリバリマネージャ 大村 幸敬

2017.01.24

Page 2: AWS Black Belt Online Seminar AWS上のJenkins活用方法

自己紹介

• 大村 幸敬 (Yukitaka Ohmura)– トレーニングデリバリマネージャ

• トレーニングの実施とトレーニングコース開発– DevOps Engineering on AWS

– Developing on AWS

– Architecting on AWS

– Data Warehousing on AWS など

– 経歴:SIerで自社サービスの開発・運用金融系のインフラPM

– 好きなもの:アウトドアと日本酒と娘^2

– 好きなサービス:AWS CLI

2

Page 3: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS Black Belt Online Seminar とはAWSJのTechメンバがAWSに関する様々な事を紹介するオンラインセミナーです

【火曜 12:00~13:00】主にAWSのソリューションや業界カットでの使いどころなどを紹介(例:IoT、金融業界向け etc.)

【水曜 18:00~19:00】主にAWSサービスの紹介やアップデートの解説(例:EC2、RDS、Lambda etc.)

※開催曜日と時間帯は変更となる場合がございます。最新の情報は下記をご確認下さい。

オンラインセミナーのスケジュール&申し込みサイト– https://aws.amazon.com/jp/about-aws/events/webinars/

3

Page 4: AWS Black Belt Online Seminar AWS上のJenkins活用方法

内容についての注意点

• 本資料では2017年1月24日時点のサービス内容および価格についてご説明しています。最新の情報はAWS公式ウェブサイト(http://aws.amazon.com)にてご確認ください。

• 資料作成には十分注意しておりますが、資料内の価格とAWS公式ウェブサイト記載の価格に相違があった場合、AWS公式ウェブサイトの価格を優先とさせていただきます。

• 価格は税抜表記となっています。日本居住者のお客様が東京リージョンを使用する場合、別途消費税をご請求させていただきます。

• AWS does not offer binding price quotes. AWS pricing is publicly available and is subject to change in accordance with the AWS Customer Agreement available at http://aws.amazon.com/agreement/. Any pricing information included in this document is provided only as an estimate of usage charges for AWS services based on certain information that you have provided. Monthly charges will be based on your actual use of AWS services, and may vary from the estimates provided.

4

Page 5: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Agenda

1. Jenkinsで何ができるのか?

2. Jenkins サーバ(Master)の構成

3. ビルド処理のオフロード

4. 目的に合わせたパイプライン

5

Page 6: AWS Black Belt Online Seminar AWS上のJenkins活用方法

今回の内容

• 話すこと– JenkinsをAWS上で使用する際のポイント

– JenkinsとAWSサービスとの連携• AWS CodeCommit / AWS CodeBuild/ AWS CodeDeploy / AWS CodePipeline

• AWS CloudFormation / AWS OpsWorks / AWS ElasticBeanstalk / Amazon CloudWatch

• Amazon EC2 / Amazon ECS / Amazon ECR / AWS Lambda / Amazon S3 / Amazon EFS

• 話さないこと– ビルド、テスト、デプロイの詳細

– サードパーティツール・サービス(CircleCI、TravisCIなど)

– サービスのロードマップ

6

Page 7: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsで何ができるのか?

7

Page 8: AWS Black Belt Online Seminar AWS上のJenkins活用方法

DevOpsと自動化

8

DevOps = 文化+プロセス+ツール

開発者 顧客

releasetestbuild

plan monitor

デリバリのパイプライン

フィードバックループ

ソフトウェア開発のライフサイクル高速化

Page 9: AWS Black Belt Online Seminar AWS上のJenkins活用方法

モノリシックな開発プロセス

9

開発者

releasetestbuild

デリバリパイプラインアプリ

Page 10: AWS Black Belt Online Seminar AWS上のJenkins活用方法

10

• Service-Oriented Architecture (SOA)

• 単一の目的

• APIでのみ連携

• “Microservices”

Page 11: AWS Black Belt Online Seminar AWS上のJenkins活用方法

11

• Two-pizza teams

• 全ての主導権

• 全ての責任

• 良くしようとする動機

• “DevOps”

Page 12: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Microserviceの開発ライフサイクル

12

開発者 デリバリパイプラインサービス

releasetestbuild

releasetestbuild

releasetestbuild

releasetestbuild

releasetestbuild

releasetestbuild

Page 13: AWS Black Belt Online Seminar AWS上のJenkins活用方法

DevOps タスク

13

MonitorProvisionDeployTestBuildCode

継続的インテグレーション(CI = Continuous Integration)

継続的デリバリ(CD = Continuous Delivery)

継続的デプロイ(Continuous Deploy)

継続的監視と改善

Page 14: AWS Black Belt Online Seminar AWS上のJenkins活用方法

DevOpsタスクとAWS開発者用サービスの位置付け

14

MonitorProvisionDeployTestBuildCode

Elastic Beanstalk

OpsWorks for Chef Automate OpsWorks Stacks

CloudWatch

CloudFormation

CodeDeploy

CodeCommit

Code Pipeline

Code Build

Page 15: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins

• オープンソースの自動化サーバ– ソフトウェア開発におけるテスト、ビルド、デプロイの自動化

– ビルドパイプラインの構成

– 多彩なプラグインによる拡張

15

画像: https://wiki.jenkins-ci.org/display/JENKINS/Logo

The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.(プロジェクトページ https://jenkins.io/ より)

Page 16: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS開発者用サービスとJenkinsの位置付け

16

MonitorProvisionDeployTestBuildCode

Elastic Beanstalk

OpsWorks for Chef Automate OpsWorks Stacks

CloudWatch

CloudFormation

CodeDeploy

CodeCommit

Code Pipeline

Code Build

Page 17: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsの画面例

• トップ画面– プロジェクト

ステータス一覧

17

Page 18: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsの画面例• プロジェクト設定画面

18

Page 19: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsを使用したビルド実行の例

プロジェクトのビルド履歴

19

個別ビルドのログ

Page 20: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsの基本構成

20

Jenkinsユーザ

DeveloperGitHub

Amazon S3

Artifact(パッケージ)

①commit

②pull

③Build/Test

④パッケージング

JenkinsMaster

Page 21: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkinsサーバ(Master)をどう構成するか?

21

Jenkinsユーザ

DeveloperGitHub

Amazon S3

Artifact(パッケージ)

JenkinsMaster HA化

Page 22: AWS Black Belt Online Seminar AWS上のJenkins活用方法

ビルド処理をどのようにオフロードするか?

22

Jenkinsユーザ

JenkinsMaster

JenkinsWorker

Page 23: AWS Black Belt Online Seminar AWS上のJenkins活用方法

JenkinsとAWSサービスとの連携をどうするか?

23

Jenkinsユーザ

JenkinsMaster

目的に合わせたパイプラインをどのように構成するか

Page 24: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins on AWSの検討ポイント

1. Jenkins サーバ(Master)をどのように構成するか– スペック、セキュリティ、高可用性、ベストプラクティス

2. ビルド処理をどのようにオフロードするか– Jenkins Workerの利用– ビルド環境の多様性、ビルド環境コストの低減

3. 目的に合わせたパイプラインをどのように構成するか– JenkinsとAWSサービスとの連携

24

Page 25: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins サーバ(Master)をどう構成するか

25

Page 26: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Master on EC2

• 構築手順

• スペック

• セキュリティ

• 高可用性

• ベストプラクティス

26

Page 27: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Master on EC2 構築手順1. EC2インスタンスを立てる

1. セキュリティグループは22と8080ポートへの接続を許可

2. Jenkinsをパッケージインストールして起動

3. ブラウザでホストへアクセスしてアンロック– Jenkins 2.x系以降– /var/lib/jenkins/secrets/initialAdminPassword に

記載されているパスワードを入力すると利用可能

4. インストールするプラグインを選択

以上

27

(Amazon Linuxの場合)$ sudo yum update –y$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo$ sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key$ sudo yum install jenkins –y$ sudo service jenkins start

Page 28: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Master のスペック• OS

– Linux / Windows / Docker

• CPUとネットワーク– 処理内容によって必要スペックは大きく変わる(HTTP接続ごとに3スレッド)– Workerを立てることでMasterの処理をオフロード可能

• インスタンスタイプ– 大量の並列処理が継続して行われる場合はM4を– 間欠的な処理はT2でもよいがCPUクレジットの使い切りに注意

• ストレージ– Masterにはログが格納されるためビルド実行総数に注意– ビルドをMaster上で行う場合は、扱うデータ量×プロジェクト数に注意– プロジェクト設定およびビルド記録保護のためEBSスナップショットの取得を行う

28

Page 29: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Master のセキュリティ• SSLを有効化

– ELBをJenkins Masterの前に立ててSSL Terminateすることを推奨

• CSRF防御を有効化– Jenkins 2.xではデフォルトで有効化済み(設定を確認すること)

• Master上でビルドせずWorkerを使う– 誤ったビルド処理によって $JENKINS_HOME (設定、履歴データを配置するディレクトリ)にアクセスされると、

Jenkins環境に悪影響を及ぼす可能性がある

• Workerへのアクセス制御を有効化– Jenkins 1.5.80.x以降ならMaster-Worker間の通信を安全に行う設定を有効化する– Jenkins 2.xならデフォルトで有効化(設定有効化済みを確認すること)

• 適切なユーザ認証を行う– Jenkins独自、OS認証、LDAP認証が利用可能

• ネットワークアクセスの保護– デフォルトは8080ポートで稼働するが、Linuxならiptablesで80ポートへリダイレクト可能– メンテナンスのためのSSH(22番ポート)アクセスが必要– セキュリティグループでこれらのポートへのアクセスを制御する。アクセス元IPを最小限にする

29

Page 30: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Masterの高可用性

• Jenkins Masterの設定を疎結合化して外出し– 設定ファイル($JENKINS_HOME)をNFSストレージなどに置き

Jenkins Masterからマウント

– インスタンス数1で固定したAutoScaling(AutoHealing)を構成し、Jenkins Masterが故障した際に代替インスタンスを自動で起動

• 考慮点– ELBをJenkins Masterの前に立ててエンドポイントを固定する

– NFSストレージにはAmazon EFSなど可用性の高いストレージを使用• マウントのためAZに依存しないDNS Nameが利用可能https://aws.amazon.com/fr/about-aws/whats-new/2016/12/simplified-mounting-of-amazon-efs-file-systems/

– 今後の再利用を考えCloudFormationでテンプレート化する

30

Page 31: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Masterのベストプラクティス

• セキュリティグループによるアクセス制御• 十分なインスタンススペックの確保• バックアップ・リストアの計画

– EBSスナップショット / $JENKINS_HOMEの退避 / S3 Plugin

• Workerの追加・削除が容易になるよう構成• 使用しないときはWorkerノードを止める• MasterおよびWorkerのモニタリングを行う

Jenkinsオフィシャル Best Practiceも参照– https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+Best+Practices

31

Page 32: AWS Black Belt Online Seminar AWS上のJenkins活用方法

ビルド処理をどのようにオフロードするか

32

Page 33: AWS Black Belt Online Seminar AWS上のJenkins活用方法

ビルド処理の特徴

• 実施タイミングが未確定– 迅速な開発のため各々のコミットごとに自動的にテストを実行

• 処理時間は時限的– 数分〜数十分

– 長いとデリバリプロセスが遅延するため通常は短い

• ビルドターゲットに合わせた環境が必要– 複数のライブラリバージョンでテストするなど

33

Page 34: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker

• ビルド処理をJenkins Masterとは異なるインスタンス(Worker)で実行する– ビルド処理をスケールアウト

– 環境ごとに異なるWorkerを用意

– 必要なときだけWorkerを起動する

• AWSにおけるWorkerの構成方法– Amazon EC2

– Amazon EC2 Spot Fleet

– Amazon ECS

– AWS CodeBuild

34

Page 35: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on EC2

• ビルドを実行するaインスタンスがなければ新規にインスタンスを作成– Amazon EC2 Pluginを使用– インスタンスにラベルをつけビルド対象を指定– Jenkins MasterがWorkerインスタンスへSSH接続し、初期設定を実施– Workerインスタンス上でビルドを実行し結果を得る– 指定した時間アイドルが続くとWorkerインスタンスを削除

• スポットインスタンスが利用可能– 使われていないEC2インスタンスに入札して格安利用(最大90%程度のコストカットが可能)– よりコスト効率の高いビルド処理が可能– 起動時に入札価格がスポット価格を下回っているとインスタンスは起動しない– ビルド中にスポット価格が入札価格を上回るとインスタンスが削除されビルドは失敗する

35 https://wiki.jenkins-ci.org/display/JENKINS/Amazon+EC2+Plugin

EC2

EC2 スポットインスタンスSSH

Page 36: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on EC2(設定例)

Jenkinsの管理→システムの設定

36

Jenkinsシステムの設定→「クラウド」の設定

Jenkins MasterインスタンスにIAM Roleを付与していればCredentialsは必要なし(推奨)詳細はPluginのドキュメントを参照

Page 37: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on EC2(設定例)

Jenkinsシステムの設定→ 「クラウド」の設定続き

37

ここで指定した文字列をプロジェクトのラベル式で指定

Jenkins MasterからSSH接続できるようセキュリティグループを指定

サブネットも指定するSSH接続を考慮

Jenkinsシステムの設定→ 「クラウド」の設定続き(拡張設定)

スポットを使う場合にチェックビッド価格を指定

Page 38: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on EC2(設定・実行例)

Jenkinsプロジェクトの設定

38

ビルド実行時の様子

Labelsで指定した文字列を指定(サジェストあり)

インスタンスの起動待ち

インスタンスが起動するとビルド実行

Page 39: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon EC2 Spot Fleet• ビルド実行時Spot Fleet上のインスタンスに処理を指示

– Amazon EC2 Fleet Pluginを使用– ビルド処理の投入数に応じ、Spot Fleetで稼働するインスタンス数をコントロールす

る(最小/最大を指定)– WorkerインスタンスへJenkins MasterがSSH接続し初期設定を実施

• Spot Fleet– 配分戦略に応じて複数のスポットプールを自動的に利用– Fleet全体でターゲット容量(インスタンス数 or vCPU数)を満たす– Jenkinsが指示したWorkerインスタンス数を維持するようコントロール

39 https://wiki.jenkins-ci.org/display/JENKINS/Amazon+EC2+Fleet+Plugin

SSH EC2 Spot Fleet

Page 40: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon EC2 Spot Fleet(設定例)

40

SpotFleetで起動するため「リクエストと維持」を指定

Jenkins MasterからSSH接続できるようキーペアとセキュリティグループを指定

EC2スポットインスタンス作成

Page 41: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon EC2 Spot Fleet(設定例)

41

Jenkinsの管理→システムの設定

ここで指定した台数の範囲でSpotFleetのターゲット容量が調整

ここで指定した文字列をプロジェクトのラベル式で指定

Jenkins MasterインスタンスにIAM Roleを付与していればCredentialsは必要なし(推奨)詳細はPluginのドキュメントを参照

Page 42: AWS Black Belt Online Seminar AWS上のJenkins活用方法

コンテナとは何か?

42

• OS仮想化

• プロセス隔離

• イメージ

• 自動化Server

Guest OS

Bins/Libs Bins/Libs

App2App1

Page 43: AWS Black Belt Online Seminar AWS上のJenkins活用方法

コンテナとCI/CD

• ビルドで使用する環境とアプリケーションをコンテナ上で動作させる– コンテナが動く環境であればどこでも同じように動く

– Workerインスタンスはコンテナさえ動くようにしておけばよい

• 多様な環境のテストを並列して実行可能– ビルドのたびにクリーンな設定のテスト環境が用意される

– 1つのインスタンス上で複数の環境を同時にテスト可能

43

Page 44: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Amazon EC2 Container Service (ECS)

44

• 特徴(https://aws.amazon.com/ecs/)

– 管理ノード不要の、安定かつ高パフォーマンスなクラスタ管理サービス

– Serviceスケジューラで多様なロングランニングプロセスを実行する基盤に

• コンテナを必要な台数稼働させる• ELB連携で、デプロイも簡単に

– Run Taskでバッチジョブを実行する基盤に• どこかのEC2でコンテナを起動して処理させる

• 価格体系 (https://aws.amazon.com/ecs/pricing/)

– 無料• 利用するEC2, EBS, ELBなどの料金のみ発生

管理されたEC2クラスタ上に、コンテナを自在に配置できる

AmazonECR

Amazon ECS

Elastic Load Balancing

Page 45: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon ECS

• WorkerをECS上のDockerコンテナで実行する– Amazon EC2 Container Service Pluginを使用

– 異なる環境(コンパイラやライブラリ)のWorkerを容易に作成

– 実行のたびにクリーンな環境を使用

• ECSとの連携– クラスターのインスタンスはECSが管理

– CloudWatchとAutoScalingによりインスタンス数の自動調整が可能

4545

ECS

Worker Task

AWS API(WorkerTask起動)

https://wiki.jenkins-ci.org/display/JENKINS/Amazon+EC2+Container+Service+Plugin

処理状況の通知

Page 46: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon ECS(設定例)

46

ECSクラスターの設定

ECSを使用する場合クラスターのインスタンス数はここで指定(JenkinsはScaleを指示しない)

調査用にキーペアを指定しておく

インスタンスからJNLPでMasterへ接続できるようサブネットとセキュリティグループを指定

ロールはデフォルトでよい

Page 47: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon ECS(設定例)

47

Jenkinsの設定

ECS

Worker Task

AWS API(WorkerTask起動)

・JNLP(5000)でマスターと通信・HTTP(8080)でJenkins Agentを取得

HTTPS HTTP8080

ELBを経由せずMasterにアクセスできるURLを指定

ここで指定した文字列をプロジェクトのラベル式で指定

※プロジェクトの設定はEC2と同様

Jenkins MasterインスタンスにIAM Roleを付与していればCredentialsは必要なし(推奨)詳細はPluginのドキュメントを参照

Page 48: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Worker on Amazon ECS(実行例)

48

Jenkins上はオフラインに見える

ECS上はタスクが無いように見える

ビルドを開始するとタスクが作成され処理が実行終了するとすぐにタスクは削除

Page 49: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS CodeBuild

• フルマネージドのビルドサービス• ソースコードのコンパイル、テストの実行、

パッケージング等のビルド処理を実施

• スケーラブルで並列ビルド処理が可能

• 各種言語用のDocker Imageが用意されているほか、カスタムImageを使用して自身のアプリケーションに合わせたビルド環境を利用可能

• API、CLIから起動するほか、CodePipelineやJenkinsとの連携を提供

• 料金• コンピューティングタイプ別 (build.general1.*)

• ビルド1分間あたりの料金

• 1ヶ月にbuild.general1.smallを100分間分の無料利用枠

49

Page 50: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS CodeBuild as Jenkins Worker

• WorkerとしてCodeBuildのProjectを実行する– Jenkins CodeBuild Pluginを使用– https://GitHub.com/awslabs/aws-codebuild-jenkins-plugin– 上記ソースをpull→mvn installでコンパイル→.hpiファイルをJenkinsにupload

• CodeBuildを使用するメリット– 処理内容を設定(buildspec.yml)として記述– Projectの実行時間に応じた料金– フルマネージドでインスタンスの管理やスケーラビリティの考慮が不要– 実行のたびにクリーンな環境を使用

50

AWS CodeBuild

Page 51: AWS Black Belt Online Seminar AWS上のJenkins活用方法

JenkinsとCodeBuildのインテグレーション例

• RedmineのテストをJenkins+CodeBuildで実行– Ruby on Railsで書かれたコードをRSpecでテスト

– 自身のGitHubにRedmineプロジェクトのクローンを作成しておく

1. GitHubからソースコードを取得

2. CodeBuildコンテナ上に環境を構築

3. RSpecのテストを実施

4. テストが成功したらzipパッケージを作成してS3へ

51

AWS CodeBuild

Page 52: AWS Black Belt Online Seminar AWS上のJenkins活用方法

CodeBuildとのインテグレーション例

52

CodeBuild Projectの設定

GitHubリポジトリを指定

ビルド環境のDocker Imageを指定ここでは標準で提供されるUbuntuベースのRuby環境を使用スペックは3タイプから指定

Railsでテストを実行するための環境変数を指定

Page 53: AWS Black Belt Online Seminar AWS上のJenkins活用方法

CodeBuildとのインテグレーション例

53

ソースコードのトップディレクトリにCodeBuildのビルド設定ファイル (buildspec.yml) を追加

phases: 各ステージで実行するコマンドを指定install: スクリプトを実行して必要パッ

ケージの追加やgemのインストールを実施

pre_build: テスト用DBデータの投入build: RSpecの実行post_build: zipパッケージの作成

artifacts: 作成したパッケージの場所を指定

installフェーズで実行するスクリプト(抜粋)

※YAML書式がおかしい、各phasesのスペルを間違えた、

などの場合全くビルド処理が実行されないので注意

特に…”pre-build” ではなく “pre_build” です

Page 54: AWS Black Belt Online Seminar AWS上のJenkins活用方法

CodeBuildとのインテグレーション例

54

• JenkinsにPluginを導入• Projectのビルドフェーズで「Run build on AWS CodeBuild」を追加

Regionとアクセスキー、シークレットキーを指定

CodeBuildのプロジェクト名を指定。今回ソースはCodeBuildのProject内で指定済み

Page 55: AWS Black Belt Online Seminar AWS上のJenkins活用方法

CodeBuildとのインテグレーション例

55

Jenkinsのビルド画面にCodeBuild Dashboardが追加 CodeBuildの画面も同様の表示

Page 56: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Jenkins Workerの構成方法まとめ

• Amazon EC2

• Amazon EC2 Spot Fleet

• Amazon ECS

• AWS CodeBuild

56

Page 57: AWS Black Belt Online Seminar AWS上のJenkins活用方法

目的に合わせたパイプラインをどのように構成するか

57

Page 58: AWS Black Belt Online Seminar AWS上のJenkins活用方法

パイプラインとDevOpsタスク位置付けの例

58

本番

provision

Deploy

Monitor

Code

ソース

Build

ビルドインテグレーションテスト

Provision

Deploy

Test

• すべての必要なプラットフォームでインテグレーションテスト

• 静的コード分析• パフォーマンステスト

ベータテスト

Provision

Deploy

Test

• 手動テスト• 負荷テスト• エンドツーエンド機能テスト

Page 59: AWS Black Belt Online Seminar AWS上のJenkins活用方法

パイプライン

• 継続的デリバリの一連の工程を自動化– 素早いデリバリの実現

– 問題発生時のフィードバック高速化

– 再現性のあるタスク実施

– デリバリプロセスの再利用

• Jenkinsにおける2種類の自動化– 『自動化の進展は2つの側面から考えることができます。一つは,ソフ

トウェア開発に必要な様々な作業それぞれの「部品の自動化」という側面です。もう一つは,それら全体の順序や組み合わせを自動化する「流れの自動化」という側面です』(川口氏)• http://gihyo.jp/dev/column/newyear/2017/continuous-integration-

and-continuous-delivery

59

Page 60: AWS Black Belt Online Seminar AWS上のJenkins活用方法

パイプラインの構成方法

• Jenkins– Pipelineプラグイン(Jenkins2より標準搭載)

– 一連のパイプライン処理をスクリプトで記述

– 各種AWSのサービスとPluginにより連携

• AWS CodePipeline– Amazon社内のプロセスから生まれたパイプライン構築サービス

– マネジメントコンソールやCLIを使用してパイプラインを定義

– CodePipeline Pluginによる連携や各種AWSのサービスとの連携

60

https://wiki.jenkins-ci.org/display/JENKINS/AWS+CodePipeline+Plugin

Page 61: AWS Black Belt Online Seminar AWS上のJenkins活用方法

JenkinsとAWSサービスとの連携

• Pluginで各種AWSサービスと連携– Code

• CodeCommit (Git Pluginで連携)– HTTPS接続の際Gitと同様のID/PWによる認証が可能に(2016/12)

– Build• CodeBuild

– Test• (3rd Party Tools)

– Deploy/Provision• CloudFormation• CodeDeploy• Elastic Beanstalk• (OpsWorksにはPluginがない模様)

61

Page 62: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS開発者用サービスとJenkinsの位置付け(再掲)

62

MonitorProvisionDeployTestBuildCode

Elastic Beanstalk

OpsWorks for Chef Automate OpsWorks Stacks

CloudWatch

CloudFormation

CodeDeploy

CodeCommit

Code Pipeline

Code Build

Page 63: AWS Black Belt Online Seminar AWS上のJenkins活用方法

DevOps Tasks mapping for Amazon EC2

63

Provision

Deploy

TestBuildCode

EC2

OS

config

Packages

config

Application

Deploy

Page 64: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Provisioning & Deploy Task Coverage for EC2

64

EC2

OSconfig

Packages

config

Application

Deploy

Other AWS Services

CloudFormation

ElasticBeanstalk*

OpsWorksStacks**

CodeDeploy

*) Fully managed configuration**) Configurable by Chef Recipe

Customizewith Additional Configuration

Covered

ELB/SQS/RDS

Custom Layerswith Chef Recipe

cfn init.ebextension appspec.yml

Instances &Layers

Page 65: AWS Black Belt Online Seminar AWS上のJenkins活用方法

目的別 Jenkins & AWSサービス パイプラインパターン

• シンプル パイプライン

• コンテナ パイプライン

• モバイルアプリ パイプライン

• セキュリティ自動化 パイプライン1, 2

65

Page 66: AWS Black Belt Online Seminar AWS上のJenkins活用方法

シンプル パイプライン• コードがcommitされたらアプリケーションサーバへデプロイする

① コードをcommit② CodePipelineがcommitを検知③ Jenkinsでビルドを実行してS3へ格納④ CodePipelineがCodeDeployを起動⑤ CodeDeployがApplication Serversへデプロイ

66

Developer CodeCommit CodePipeline CodeDeploy Application Servers

Jenkins(EC2インスタンス)

① ②

④ ⑤

Page 67: AWS Black Belt Online Seminar AWS上のJenkins活用方法

コンテナ パイプライン• コードがcommitされたらDocker Imageを作成しECSへデプロイする

① コードをcommit② Jenkinsがcommitを検知してコードを取得③ JenkinsがECRからDocker Imageをpull*④ Jenkinsが更新されたコードでDocker Imageを再作成⑤ Jenkinsが更新されたDocker ImageをECRへpush*⑥ Jenkinsが更新されたタスク/サービスをECS上で起動

67

Developer CodeCommit Jenkins ECS

ECR

① ②

*) Docker Build and Publish pluginからCredential Helper を使用したECRアクセスが可能https://aws.amazon.com/blogs/compute/authenticating-amazon-ecr-repositories-for-docker-cli-with-credential-helper/

Page 68: AWS Black Belt Online Seminar AWS上のJenkins活用方法

モバイルアプリ パイプライン

• 各種モバイル端末上のテストを実行するためコードがcommitされたらAWS Device Farmにアプリケーションを送ってテストを実行する① コードをcommit② Jenkinsがcommitを検知してコードを取得③ JenkinsがアプリケーションとテストをDevice Farmに送り各種モバイル端

末上でテストを実行する

68

Developer

CodeCommit Jenkins

② ③Tester

Device Farm

Page 69: AWS Black Belt Online Seminar AWS上のJenkins活用方法

セキュリティ自動化 パイプライン1• セキュリティチェックをCI/CDの中で自動的に実行

開発スピードがセキュリティ対応のため遅れないようにする① 開発者がCloudFormationのコードをcommit② Jenkinsがcommitを検知してコードを取得してビルドプロセスを開始③ Jenkinsがセキュリティコントロール用のコードをセキュリティチームのリポジトリから取得

(許可されたIPアドレス範囲や許可されたAMIが何か、などを記載)④ Jenkinsが開発者のCloudFormationテンプレートに対しセキュリティチェックを実施

(問題が見つかれば処理は停止する)⑤ チェックに合格したらCloudFormationの実行を開始

69

Developer CodeCommit (Developer) Jenkins CloudFormation

CodeCommit (Security Team)

① ②

Page 70: AWS Black Belt Online Seminar AWS上のJenkins活用方法

セキュリティ自動化 パイプライン2① 開発者がCloudFormationのコードをcommit② Jenkinsがcommitを検知してコードを取得してビルドプロセスを開始③ JenkinsがセキュリティチームのS3からCodeDeployの設定ファイル(AppSpec.yml)に対して行う

べき設定情報を取得する④ Jenkinsが開発者が作成したAppSpec.ymlとセキュリティチームのAppSpec.ymlをマージする⑤ JenkinsがすべてのコンテンツをzipにまとめてS3に配置する⑥ JenkinsがCodeDeployを起動し、EC2がS3バケットからzipファイルを取得してデプロイを開始する⑦ セキュリティチームのAppSpec.ymlの処理に成功した場合のみCodeDeployが正常終了を返す

70

Developer CodeCommit(Developer)

Jenkins S3

S3

① ②

⑤ ⑦⑥

CodeDeploy Application Servers

Page 71: AWS Black Belt Online Seminar AWS上のJenkins活用方法

参考:AWSサービスによるパイプライン

• コンテナの継続的デプロイ

• サーバレスアプリケーションの継続的デリバリ

71

Page 72: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS CodePipeline

72

• 特徴 (http://aws.amazon.com/jp/codepipeline/)

– デプロイまでのプロセスを管理• Build/Test/Deployを組み合わせたフロー管理

• AWSサービスやサードパーティとの連携が充実

– パイプラインのバックアップ

– 見やすいUI• Management Consoleで操作・確認

• 価格体系 (http://aws.amazon.com/jp/codepipeline/pricing/)

– 1アクティブパイプライン毎に$1/月

– 1ヶ月に1つのパイプラインを無料提供

デプロイワークフロー管理サービス

BuildSource Beta Production

Page 73: AWS Black Belt Online Seminar AWS上のJenkins活用方法

参考:コンテナの継続的デプロイ

73

• コンテナをECSに継続的デプロイするためのリファレンスアーキテクチャ• CloudFormationテンプレートが提供されておりすぐにお試しいただけます

原文→https://github.com/awslabs/ecs-refarch-continuous-deployment日本語→https://aws.amazon.com/jp/blogs/news/continuous-deployment-to-amazon-ecs-using-aws-codepipeline-aws-codebuild-amazon-ecr-and-aws-cloudformation/

Page 74: AWS Black Belt Online Seminar AWS上のJenkins活用方法

参考:サーバレスアプリケーションの継続的デリバリ

74

• サーバレスアプリケーションモデル(SAM)を使用• AWS API GatewayとAWS Lambdaで構成• テスト/ベータ/ガンマそれぞれでテストし本番へリリース• リリースは手動承認

blog: https://aws.amazon.com/blogs/compute/continuous-deployment-for-serverless-applications/CFnテンプレート: https://s3.amazonaws.com/awscomputeblogmedia/serverless-pipeline.yamlサンプルSAMアプリソースコード: https://s3.amazonaws.com/awscomputeblogmedia/timestamp_app.zip

Page 75: AWS Black Belt Online Seminar AWS上のJenkins活用方法

まとめ

75

1. Jenkinsで何ができるのか?

2. Jenkins サーバ(Master)の構成

3. ビルド処理のオフロード

4. 目的に合わせたパイプライン

Page 76: AWS Black Belt Online Seminar AWS上のJenkins活用方法

参考資料• Jenkins Official Site(英語)

– https://jenkins.io/

• Jenkins on AWS White Paper (英語)– https://d0.awsstatic.com/whitepapers/DevOps/Jenkins_on_AWS.pdf– https://www.amazon.com/dp/B01MD0T33X (Kindle版)

• DevOps on AWS– AWSの考えるDevOpsと各サービスの位置付けについて– https://aws.amazon.com/jp/devops/

• AWS Labs @GitHub – 各種リファレンスアーキテクチャのCFnテンプレートやサンプルコード– https://github.com/awslabs/

• AWSクラウドサービス活用資料集– 各種サービス/ソリューションカットのオンラインセミナー資料– https://aws.amazon.com/jp/aws-jp-introduction/

• DevOps Engineering on AWS(オフィシャルトレーニング)– AWSのDevOpsサービスを学ぶ3日間のコース。日本の最新事例も交え、ラボとディスカッションで理解を深めます。試験対策にも。– https://aws.amazon.com/jp/training/course-descriptions/devops-engineering/

76

Page 77: AWS Black Belt Online Seminar AWS上のJenkins活用方法

Q&A

77

Page 78: AWS Black Belt Online Seminar AWS上のJenkins活用方法

オンラインセミナー資料の配置場所

• AWS クラウドサービス活用資料集– http://aws.amazon.com/jp/aws-jp-introduction/

• AWS Solutions Architect ブログ– 最新の情報、セミナー中のQ&A等が掲載されています

– http://aws.typepad.com/sajp/

78

Page 79: AWS Black Belt Online Seminar AWS上のJenkins活用方法

公式Twitter/FacebookAWSの最新情報をお届けします

79

@awscloud_jp

検索

最新技術情報、イベント情報、お役立ち情報、お得なキャンペーン情報などを日々更新しています!

もしくはhttp://on.fb.me/1vR8yWm

Page 80: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWSの導入、お問い合わせのご相談

AWSクラウド導入に関するご質問、お見積り、資料請求をご希望のお客様は以下のリンクよりお気軽にご相談くださいhttps://aws.amazon.com/jp/contact-us/aws-sales/

※「AWS 問い合わせ」で検索してください

Page 81: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS Black Belt Online Seminar

• 1月の配信予定– 1月25日(水) 18:00-19:00 AWS Storage Gateway

– 1月31日(火) 12:00-13:00 AWSで実現するDisaster Recovery

• 申し込みサイトhttps://aws.amazon.com/jp/about-aws/events/webinars/

(もしくは「AWS イベント」で検索)

Page 82: AWS Black Belt Online Seminar AWS上のJenkins活用方法

AWS Black Belt Online Seminar

• 2月の配信予定– 2月1日(水) 18:00-19:00 AWS OpsWorks

– 2月8日(水) 18:00-19:00 AWS Batch

– 2月9日(木) 12:00-13:00 Docker on AWS

– 2月22日(水) 18:00-19:00 Amazon EC2 Systems Manager

– 2月28日(火) 12:00-13:00 IoT向け最新アーキテクチャパターン

• 申し込みサイトhttps://aws.amazon.com/jp/about-aws/events/webinars/

(もしくは「AWS イベント」で検索)

Page 83: AWS Black Belt Online Seminar AWS上のJenkins活用方法

簡単なアンケートにご協力ください。

• 画面に表示されるアンケートフォームに入力をお願いします。皆様のご意見は、今後の改善活動に活用させて頂きます。

コメント欄には1行で自由な内容を書き込み下さい。

例)

- 本オンラインセミナーへのご意見

- 今後オンラインセミナーで取り上げて欲しい題材

- 発表者への激励

等々…

※Q&A同様に書き込んだ内容は主催者にしか見えません

83

Page 84: AWS Black Belt Online Seminar AWS上のJenkins活用方法

ご参加ありがとうございました

84

Page 85: AWS Black Belt Online Seminar AWS上のJenkins活用方法

85

Page 86: AWS Black Belt Online Seminar AWS上のJenkins活用方法

補足:ElasticBeanstalkでJenkins Masterを稼働させる

• ElasticBeanstalkのコンテナ上にJenkins Masterを構成することで、EC2インスタンスの管理負荷を低減させることが可能

• ポイント– JenkinsのオフィシャルDockerイメージを使用する

– ウェブサーバ環境で、プラットフォームはDocker、環境タイプは単一インスタンスを使用する

– Dockerrun.aws.json および .ebextensionsを使用してElasticBeanstalk用のデプロイパッケージを作成する(次ページ参照)

– 注意

• Jenkinsの初期パスワードを確認できるよう、EC2インスタンスにログインするキーペアを指定する

• $JENKINS_HOMEはEC2インスタンスの/var/jenkinsに配置される

86

Page 87: AWS Black Belt Online Seminar AWS上のJenkins活用方法

補足:ElasticBeanstalkでJenkins Masterを稼働させる

87

{

"AWSEBDockerrunVersion": "1",

"Image": {

"Name": "jenkins"

},

"Ports": [

{

"HostPort": "8080",

"ContainerPort": "8080"

}

],

"Volumes": [

{

"HostDirectory": "/var/jenkins_home",

"ContainerDirectory": "/var/jenkins_home"

},

{

"HostDirectory": "/var/run/docker.sock",

"ContainerDirectory": "/var/run/docker.sock"

}

],

"Logging": "/var/log/jenkins"

}

container_commands:

01-jenkins-user:

command: useradd -u 1000 jenkins || echo 'User already exist!'

02-jenkins-user-groups:

command: usermod -aG docker jenkins

03-jenkins-home:

command: mkdir /var/jenkins_home || echo 'Directory already exist!'

04-changeperm:

command: chown jenkins:jenkins /var/jenkins_home

デプロイパッケージ(jenkins-eb.zip)の作成手順

$ find . -type f

./.ebextensions/instance.config

./Dockerrun.aws.json

$ zip -r jenkins-eb.zip Dockerrun.aws.json .ebextensions/

adding: Dockerrun.aws.json (deflated 56%)

adding: .ebextensions/ (stored 0%)

adding: .ebextensions/instance.config (deflated 48%)

$ ls

Dockerrun.aws.json jenkins-eb.zip

Dockerrun.aws.json instance.config