Java in the Cloud:継続的インテグレーションのセットアップチュートリアル
公開: 2022-03-11毎年、IT業界の急速な進化を目の当たりにしています。 画期的なスローガン「Writeonce、run where where」がソフトウェア開発コミュニティにまったく新しいレベルの期待を設定してから、今では20年以上になります。 そして、ここに私たちは今日、特にJava開発、そして一般的にソフトウェア開発を集合的にまったく新しい可能性の世界へと導いた、結果として拡大し続けるツールのセットを持っています。
アジャイル、DevOps、継続的インテグレーションとデプロイメントなどの手法は、マイクロサービスの進化とともに、ソフトウェア開発プロセスの生産性を集合的に向上させ、これまで以上にソフトウェアを開発できることを嬉しく思います。 自動化を利用し、適切なツールセットを設定することで、ソフトウェア製品の開発と提供を驚くほど簡単にすることができます。
この記事では、DevOpsに侵入し、製品開発と配信を最大限に最適化するために検索するJava開発者の視点からこの新しい世界を見ていきます。
今日、Spring Boot、Docker、Cloud、Amazon Web Services、Continuous Deliveryなどの用語は広く使用されていますが、あまり理解されていません。 この記事では、これらすべてのテクノロジーを紹介し、これらの用語を説明するための最も簡単な方法を採用し、チュートリアルの形でまとめます。ここでは、小さなソフトウェアを開発し、前述のすべてのツールを使用して本番環境での配信に備えます。
なぜこれらのツール?
Dockerを使用してデプロイを簡素化する
「一度書けばどこでも実行できる」は、コードをどこでも実行できるようにするJava仮想マシン(JVM)のようなテクノロジーを生み出した概念的なブレークスルーでした。 そして今ここに、数十年後、Dockerと呼ばれるものがITコミュニティに提示されています。 Dockerは、ソフトウェアを配置して、ほとんどどこにでも簡単に実行できる封じ込めツールです。
ただし、Java開発者はDockerを見て、「なぜそれが必要なのか、マスターポータブルソリューションとしてよく認識されているJVMがすでにある」と言うかもしれません。 しかし、それはそうですか?
「一度書いて、どこでも実行」はいい感じで、うまく機能します…少なくともほとんどの場合。 複数のJVMベンダー、複数のJavaバージョン、複数のオペレーティングシステム、および上記のすべてのさまざまな順列と組み合わせに遭遇するまで。 次に、エレガントな「1回書き込み、どこでも実行」パラダイムから「逆効果」「1回書き込み、どこでもデバッグ」の落とし穴に切り替えます。
そこでDockerが登場し、1日を節約します。
Dockerは、ソフトウェアの開発、テスト、および出荷を簡素化します。 テストしたいソフトウェアがある場合は、それをDockerコンテナーに入れてください。そうすれば、関係するすべての関係者が簡単にインストールできます。
SpringBootで開発をスピードアップ
「どこでも実行」のスローガンが導入されてから10年も経たないうちに、Springフレームワークが登場しました。 今日、Springエコシステムは繁栄し続けており、Springベースの貴重なプロジェクト、おそらく最も注目すべきはSpringBootを数多く生み出してきました。 Spring BootのWebサイトに記載されているように、
Spring Bootを使用すると、実行するだけのスタンドアロンの本番環境グレードのSpringベースのアプリケーションを簡単に作成できます。
Spring Bootを使用すると、アプリケーションを数分で起動して実行できます。 ソフトウェア開発者は、ソフトウェア開発に集中でき、すべての構成を行うツールの恩恵を受けることができます。
このチュートリアルでは、SpringBootを使用してマイクロサービスを開発します。
Jenkinsとの継続的インテグレーション(CI)
DevOpsは急速に成長している動きであり、ソフトウェア開発チームとシステム管理チームを緊密に統合し、ソフトウェア開発と配信のライフサイクルを、開発者、システム管理者、テスター、そして最終的には関係するすべての関係者にとって可能な限り痛みのない、シームレスで生産的なものにすることを目標としています。 、 利用者。
継続的インテグレーション(CI)は、DevOps革命の基礎の1つです。 開発者がコードをコードリポジトリにコミットするたびに、コードは自動的にテストされ、本番環境への配信(デプロイ)のためにパッケージ化されるという考え方です。
CIは以下と密接に関連しています。
- 継続的デリバリー–エンドユーザーのビジネステスト用に準備されたパッケージの自動配信と、本番環境への手動トリガー。
- 継続的展開–パッケージ化された製品を本番環境に直接自動的に展開します。
CIプロセスの実装に利用できるツールはいくつかあります。 最も人気のあるものの1つは、オープンソースのCIツールであるJenkinsです。 1000を超えるプラグインとその背後にある巨大なコミュニティを備えたJenkinsは、継続的インテグレーション、配信、またはデプロイの実装を検討し始めるときに簡単に選択できます。
チュートリアルでは、Jenkinsを使用して、製品をクラウド、より具体的にはAmazon(AWS)クラウドに配信します。
AWSを使用したクラウドコンピューティング
sysadminの経験がある場合は、システム管理の心配を肩から取り除くことを想像してみてください。 いくつかのアプリケーションがあります。 必要なリソースの量はわかっていますが、必要なハードウェアのサイズは正確にはわかりません。 見積もりを行い、リソースを購入して、システムを本番環境に移行します。 運が良ければ、過大評価していて、必要以上のリソースを持っていることに気付くでしょう。 しかし、マーフィーの法則を考えると、リソース要件を過小評価し、膨大な時間のプレッシャーの下でもう少し多くのメモリまたは処理能力を取得するためにスクランブリングを行うことになります。 対照的に、クラウドにデプロイする場合は、クラウドプロバイダーが提供する柔軟性を使用して、システムをそこに配置し、必要に応じてサイズを変更するだけです。 クラウドを使用すると、システムリソースが不足することを心配する必要も、メモリまたはCPUの90%がアイドル状態になることを心配する必要もありません。
もちろん、どのプロバイダーを選択するかを決定するという課題があります。 クラウド戦争はまだ進行中です。 コンピューティングの未来のためのマイクロソフト、アマゾン、グーグルの衝突は、最近テクノロジー界のニュースで見つけることができるタイトルの例です。 このブログでは、主に現在の人気と市場シェアに基づいて、アマゾンウェブサービス(AWS)を選択しました。
AWSの利点の1つは、サインアップ後にAmazonが多くのサービスを提供することです。
このチュートリアルでは、Elastic Compute Cloud EC2(より具体的には、Amazon EC2 Container Registry、またはAmazon ECR)とAmazon S3(Simple Storage Services)の2つのAWSサービスを使用します。
Amazon ECR
Dockerイメージをどこかに保存する必要があります。 Amazon ECRは、マネージドAWSDockerレジストリサービスです。 Amazon ECR Webサイトに記載されているように:
…開発者がDockerコンテナイメージを簡単に保存、管理、デプロイできるようにします。 AmazonECRはAmazonEC2Container Service(ECS)と統合されており、開発から本番ワークフローまでを簡素化します。 Amazon ECRを使用すると、独自のコンテナーリポジトリーを運用したり、基盤となるインフラストラクチャーのスケーリングについて心配したりする必要がなくなります。
Amazon S3
前述のように、私たちが開発するアプリケーションは、AmazonS3にファイルをアップロードするSpringBootマイクロサービスになります。 Amazon S3 Webサイトに記載されているように:
…開発者とITチームに、安全で耐久性があり、拡張性の高いクラウドストレージを提供します。 Amazon S3は、ウェブ上のどこからでも任意の量のデータを保存および取得するためのシンプルなWebサービスインターフェイスを備えた、使いやすいオブジェクトストレージです。
実用的な「ハウツー」チュートリアル
目標は、AmazonS3にファイルをアップロードするSpringBootマイクロサービスのデプロイの準備をすることです。 手順は次のとおりです。
- マイクロサービスを開発する
- サービスがドッキングされるビルドプロセスを定義します
- GitコードリポジトリをホストするためにBitbucketを使用する
- BitbucketをJenkinsと統合して、Gradleを使用してアプリケーションをパッケージ化します
- リモートのAmazonECRにプッシュします
以下は、必要なすべてのコンポーネントを設定するためのチュートリアルです。
- Spring Bootサンプルアプリケーション–Gradleを使用してパッケージ化およびドッキングされたマイクロサービス
- 新しいUbuntuサーバーへのJenkinsのインストール
- Webhookを介したJenkinsとのBitbucket統合
- Jenkinsジョブ構成
- アプリケーションを含むDockerイメージを保存するAmazonECR
前提条件
AWSクラウドリソースを使用できるようにするには、最初にAmazonに登録する必要があります。 登録すると、登録後12か月間、実際に体験できるようにするために、無料利用枠をすぐに利用できるアカウントを取得できます。
前述のように、このチュートリアルでは、AmazonS3とAmazonECRを使用します。 どちらの場合も、サービスに接続するためのアクセスキーが必要になります。
AWSにサインアップした後、アカウントのセキュリティクレデンシャルに移動します。ここで[アクセスキー]を選択し、[新しいアクセスキーの作成]をクリックします。 クリックすると、IDとともにキーが生成されます。 これは、後でAWS Jenkins統合を構成し、S3ファイルアップロードを開発するときに使用するため、安全な場所に保存する必要があります。
次の前提条件は、Amazon S3バケット(ストレージコンテナー)が必要であることです。 Spring Boot Serviceは、AmazonS3ストレージとの間でファイルをアップロードおよびダウンロードします。 バケットの作成は非常に簡単で、数回クリックするだけです。 これを行う方法の完全な説明は、バケットの作成のドキュメントに記載されています。
また、コードをホストし、Jenkinsへのリクエストをトリガーするために、Bitbucketを使用するため、Bitbucketアカウントも必要です。 Bitbucketは開発者にとって素晴らしいオプションであり、その主な利点の1つは、作成できるプライベートリポジトリの数に制限がないことです。
アプリケーション開発
Springアノテーションのすべての詳細とそれらがどのように機能するかを説明するのではなく、純粋な開発者の観点から、セットアップ全体のより難しい部分に焦点を当てます。 つまり、Linux、Jenkins、およびCIに必要なその他のツールのインストールと構成です。 Spring Bootマイクロサービスアプリケーションを含む、このチュートリアルで使用されるすべてのコード例は、プロジェクトのBickbucketリポジトリで入手できます。
アプリケーションの構成は単純です。 StorageWebserviceApplication.java
ファイルにSpringBootアプリケーションのエントリポイントがあります。 ファイルをアップロードおよびダウンロードするためのロジックは、 StorageService.java
にあります。 StorageController.java
はRestコントローラーであり、ファイルのアップロードとダウンロードに使用されるAPIエンドポイントが含まれています。 プロジェクト階層は次のとおりです。
ビルドツールとしてGradleを選択しました。これにより、アプリケーションがパッケージ化され、Dockerイメージが作成されます。 次に、Gradleビルドファイル、サービスコンポーネント、およびDockerfileについて説明します。
AWS APIを使用できるようにするには、Gradleを使用するためのAWSドキュメントで定義されているように、ビルドファイルに依存関係を含める必要があります。
要約すると、GradleスクリプトのAWS依存関係構成部分は次のようになります。
buildscript { ... repositories { mavenCentral() } dependencies { ... classpath("io.spring.gradle:dependency-management-plugin:0.5.4.RELEASE") } } .. apply plugin: "io.spring.dependency-management" dependencyManagement { imports { mavenBom ('com.amazonaws:aws-java-sdk-bom:1.10.47') } } dependencies { .. compile ('com.amazonaws:aws-java-sdk-s3') }
前述のように、Amazon S3にファイルをアップロードする場合は、S3バケットにファイルをアップロードします。
バケットに接続するには、AmazonS3クライアントにクレデンシャルが提供されている必要があります。 クレデンシャルは、以前に作成したアクセスキーです。 アクセスキーのIDと値はapplication.properties
ファイルで定義します。 バケットtoptal-s3-example
という名前を付けました。
現在、主なサービスコンポーネントは次のとおりです。
@Service public class StorageService { @Value("${aws.accesKeyId}") private String awsAccessKeyId; @Value("${aws.secretKey}") private String awsSecretKey; @Value("${aws.bucketName}") private String awsBucketName; private AWSCredentials credentials; private AmazonS3 s3client;; @PostConstruct public void init(){ credentials = new BasicAWSCredentials(awsAccessKeyId, awsSecretKey); s3client = new AmazonS3Client(credentials); } public void uploadFile(MultipartFile file) throws IOException { File fileForUpload = transformMultipartToFile(file); s3client.putObject(new PutObjectRequest(awsBucketName, file.getOriginalFilename(), fileForUpload)); } public InputStream downloadFile(String amazonFileKey) throws IOException { S3Object fetchFile = s3client.getObject(new GetObjectRequest(awsBucketName, amazonFileKey)); InputStream objectData = fetchFile.getObjectContent(); return objectData; } …
StorageService
は、 application.properties
ファイルからクレデンシャルを読み取り、それらを使用してBasicAWSCredentials
オブジェクトをインスタンス化し、続いてAmazonS3Client
オブジェクトをインスタンス化します。 以下は、Amazon S3クライアントオブジェクトで、ファイルのアップロードにputObject
を呼び出し、ファイルのダウンロードにgetObject
を呼び出すという単純な問題です。
Dockerコンテナー内でサービスを実行し、Gradleビルドプロセス中にDockerイメージをビルドします。 これを行うには、次のようにbuild.gradle
ファイルを追加で構成します。
buildscript { ... dependencies { ... classpath('se.transmode.gradle:gradle-docker:1.2') } } ..... apply plugin: 'docker' ... task buildDocker(type: Docker, dependsOn: build) { push = false applicationName = "storageservice" dockerfile = file('src/main/docker/Dockerfile') doFirst { copy { from jar into stageDir } } }
Buildscript
パーツとapply plugin
はかなり標準的です。 また、 src/main/docker/Dockerfile
に格納されているDocker構成を読み取り、JARファイルをDockerビルドにコピーするbuildDocker
タスクを定義しました。
Dockerfileには、イメージを準備するための純粋なDockerコマンドのリストが含まれています。
FROM frolvlad/alpine-oraclejdk8 ADD storageWebService-0.0.1-SNAPSHOT.jar storageService.jar EXPOSE 8080 CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/storageService.jar"]
アプリケーションを実行するための前提条件は、Java仮想マシン(JVM)をインストールしていることです。 Dockerは、Javaがインストールされたイメージのリストを提供します。最小の5MB Alpine Linuxに基づいて、最小のものを選択します。 frolvlad/alpine-oraclejdk8
イメージには、必要なものがすべて含まれており、非常に小さい(わずか170MB)。
FROM
コマンドは、言及されたイメージを、独自のイメージが構築されるベースとして設定します。 ビルドされたJARファイルをADD
という名前でコンテナファイルシステムにstorageService.jar
します。 次に、 EXPOSE
コマンドを使用して、実行時にポート8080
でリッスンするDockerコンテナーを定義します。 ただし、これではホストから8080
への通信は有効になりません。 イメージが完成し、それを実行したい場合は、次のコマンドdocker run -p 8080:8080 amazonRepository/storageservice
を使用してコンテナーのポートを公開する必要がありますamazonRepository
は、この後半で構成するリポジトリです。チュートリアル。 CMD
を使用して、コンテナーの実行時に実行されるコマンドを定義します。 CMD
コマンドの括弧内の値は、コンテナーを実行するときに以下が実行されることを意味します。
java -Djava.security.egd=file:/dev/./urandom -jar /storageService.jar
オプション-Djava.security.egd=file:/dev/./urandom
は、起動時のJVMの遅延を軽減するために必要です。 省略した場合、起動プロセス中に乱数生成プロセスが必要になるため、アプリケーションの起動が非常に遅くなります。
これは、「アプリケーション開発」の部分を要約したものです。 これが完了すると、ここで作成したサービスは、後でDockerコンテナを実行したときに自動的に開始されます。 それでは、継続的インテグレーションプロセスを設定するために必要な他のツールのインストールと構成を始めましょう。
アプリケーションとシステムの操作
まず、JenkinsCIツールをセットアップするためのクリーンなLinuxサーバーが必要です。 以下の手順は、Ubuntu14.04専用であることに注意してください。 他のLinuxディストリビューションでは、手順が若干異なる場合があることに注意してください。 使用されているJenkinsのバージョンは2.7.1であり、使用されているJenkinsのバージョンによって画面と手順が若干異なる場合があります。
そこで、Linuxサーバーコンソールに移動して、前提条件のインストールを開始します。
JDKの前提条件
JDKをインストールする必要があります。 以下は、JDK8をインストールするための手順です。
sudo add-apt-repository ppa:webupd8team/java sudo apt-get install python-software-properties sudo apt-get update sudo apt-get install oracle-java8-installer java -version
Dockerをインストールする
JenkinsがDockerビルドをトリガーできるようにするには、次のようにdocker-engine
をインストールする必要があります。
sudo apt-get install apt-transport-https ca-certificates sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D #create a docker list file sudo vi /etc/apt/sources.list.d/docker.list #add the following entry in the docker.list file (change trusty to #the release you are running on if you are running on different, ie. #xenial, precise...): deb https://apt.dockerproject.org/repo ubuntu-trusty main #save and exit the file sudo apt-get update apt-cache policy docker-engine sudo apt-get install docker-engine
Dockerエンジンをインストールしたので、次のコマンドを使用してhello-world
Dockerイメージを起動し、Dockerが正しく機能することを確認します。

sudo docker run hello-world
Hello-world
画像出力は次のようになります。これにより、エンジンが正常に動作していることを確認できます。
AWSコマンドラインインターフェイス(CLI)をインストールする
次に、AWSCLIをインストールします。 後で、Jenkinsジョブ設定で、CLIを使用してAWS認証およびAmazonEC2コンテナレジストリへのDockerイメージプッシュのコマンドを実行します。
AWS CLIをインストールするには、AmazonCLIドキュメントで詳細に説明されているガイドラインに従います。
2つのインストールオプションのうち、Pythonプログラムのインストールと管理に使用されるパッケージ管理システムであるPipを使用したインストールを選択します。 次の3つのコマンドを実行するだけで、PipとAWSCLIをインストールします。
#install Python version 2.7 if it was not already installed during the JDK #prerequisite installation sudo apt-get install python2.7 #install Pip package management for python sudo apt-get install python-pip #install AWS CLI sudo pip install awscli
AWS ECR
ビルドプロセスの最後のステップとして、DockerイメージをAmazonコンテナレジストリにプッシュします。 アマゾンウェブサービスコンソールには、AWSEC2コンテナサービスがあります。
左側の[リポジトリ]サブメニューを選択し、[開始]をクリックします。
次に、リポジトリを構成するための最初の画面が表示されます。ここで、リポジトリ名を入力し、[次のステップ]ボタンをクリックします。
[次のステップ]をクリックすると、画像をリポジトリにプッシュする方法の説明が表示された画面が表示されます。
Dockerイメージをビルドしてレジストリにプッシュする方法の例が示されていますが、今はこれについて心配する必要はありません。 これで、リポジトリを作成しました。
Jenkinsをインストールして構成する
Jenkinsをインストールするには、シェルに次のコマンドを入力します。
#Download Jenkins key and pipe it to apt-key tool, apt-key command #add will read from input stream, as defined by „–„. When added #apt will be able to authenticate package to be installed. wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - #create a sources list for jenkins sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' #update your local package list sudo apt-get update #install jenkins sudo apt-get install jenkins
インストールが完了すると、Jenkinsが自動的に起動します。 次のコマンドでサービスステータスを確認します。
sudo service jenkins status
JenkinsはBitbucketGitリポジトリに接続します。そのためには、Gitをインストールする必要があります。
#install Git sudo apt-get install git
JenkinsはGradleビルドプロセスをトリガーし、その間にDockerイメージが作成されます。 これを実行できるようにするには、Jenkinsユーザーをdocker
ユーザーグループに追加する必要があります。
#add Jenkins user to docker user group sudo usermod -aG docker jenkins
ビルドプロセス中に、JenkinsはDockerイメージをAmazonECRにプッシュします。 これを有効にするには、Jenkinsユーザー用にAWSを設定する必要があります。
まず、 jenkins
ユーザーに切り替える必要があります。 そのためには、パスワードを設定する必要があります。
#change Jenkins password sudo passwd jenkins #switch to Jenkins user su – jenkins #configure AWS aws configure
aws configure
コマンドを入力した後、生成されたシークレットアクセスキーとキーIDの入力を開始します(これらはプロセスの前半で生成したクレデンシャルです)。 私の場合、アカウントの地域はus-west-2
なので、それを入力します。 また、AWSコマンドのデフォルトの出力形式をJSONに設定しました。
これで、ポート8080でアクセス可能なWebコンソールを介してJenkinsの構成に進むことができます。
URLにアクセスすると、次の「はじめに」画面が表示されます。
画面に表示されているように、パスワードを入力する必要があります。 これを行うと、セットアップウィザードは次のことを行うように促します。
- インストールするプラグインを選択します-推奨プラグインのインストールを選択します。
- ユーザー資格情報を入力して最初の管理者ユーザーを作成する
完了したら、[保存して終了]をクリックします。 これで、Jenkinsのセットアップ構成が完了しました。
ビルドジョブの定義を開始する前に、いくつかのプラグインを追加する必要があります。 Jenkinsの管理に移動し、プラグインの管理をクリックします。 [利用可能]タブで、最初にBitbucketプラグインを見つけ、チェックボックスをオンにして、[再起動後にダウンロードしてインストール]をクリックします。
次に、次の画面のようなものが表示されます。
プラグインのインストール後、ジョブを設定するために必要となる次の追加のプラグインに対してプロセスを繰り返します。
- Gradleプラグイン
- Dockerビルドステッププラグイン
- CloudbeesDockerカスタムビルド環境プラグイン
- AmazonECRプラグイン
使用するDockerビルドステッププラグインは、Dockerデーモンにリクエストを送信します。 この目的のために、ポート2375でTCPソケットを有効にする必要があります。これを行うには、 etc/default/docker
dockerにあるDocker構成ファイルを入力します。
sudo vi /etc/default/docker
ここで、構成に次の行を追加します。
DOCKER_OPTS='-H tcp://127.0.0.1:2375 -H unix:///var/run/docker.sock'
ファイルを保存して終了し、DockerとJenkinsサービスの両方を再起動します。
sudo service docker restart sudo service jenkins restart
Jenkinsが再起動したら、Jenkinsコンソールに移動し、 [Jenkinsの管理]から[システムの構成]を選択します。
Docker Builderセクションを見つけ、REST API URLにhttp://localhost:2375
と入力し、[適用]をクリックして変更を確認します。 次に、[接続のテスト]をクリックして、すべてが正常であることを確認します。
構成を保存して、Jenkinsジョブの構成に進みます。
ジョブ構成
Jenkinsのホームページに移動して、新しいアイテムを作成します。
フリースタイルプロジェクトを選択し、次の画面に示すようにプロジェクト名を入力します。
[ OK ]をクリックすると、ジョブ構成ページが表示されます。 BitbucketGitリポジトリへのプッシュごとにプロジェクトを構築する必要があります。 これを実現するには、最初に接続先のリポジトリを定義する必要があります。
ステップ1:ソースコード管理
ソースコード管理で、Gitを選択し、BitbucketリポジトリのURLを入力します。 URLの形式はhttps://bitbucket.org/bitbucketUsername/repositoryName
です。
URLを入力すると、Jenkinsは自動的に接続のテストを試みます。 まだクレデンシャルを入力していないため、接続できないことを示すエラーが表示されます。
ドロップダウンリスト[追加]を開き、[資格情報Jenkinsプロバイダー]をクリックします。
次の画面が表示されます。ここで、Bitbucketアカウントのユーザー名とパスワードを入力します。
新しいクレデンシャルレコードを追加した後、クレデンシャルドロップダウンでそれを選択していることを確認します。これで、ソースコード管理のセットアップが完了します。
ステップ2:トリガーを作成する
トリガービルドをリモートで確認し、認証トークンを定義します。 ランダムで安全なトークンを定義してください。
ステップ3:Bitbucket Webhook
Jenkinsは、Bitbucketで使用するURLをすでに提供しています。 Bitbucketリポジトリページに移動し、設定メニューでWebフックをクリックします。 続いて[ Webhookの追加]をクリックすると、次の画面が表示されます。次のように入力します。
URLの構造は次のとおりです: http://JENKINS_URL _HOST:PORT/job/JOB_NAME/build?token=TOKEN
。
上記の値を、Jenkins URL、実行中のポート、作成したジョブの名前、および以前に定義したトークンとともにそれぞれ入力します。
Webhookを保存すると、次の画面が表示されます。この画面は、必要に応じて編集したり、新しいコードをプッシュするたびに生成されたリクエストを表示したりできます。
この構成では、ブランチに関係なく、リポジトリプッシュごとにWebhookがトリガーされます。 Jenkins側では、どのブランチプッシュがビルドをトリガーするかを定義できます。
BitbucketがコードをJenkinsにプッシュできるようにするには、匿名の読み取りアクセスを許可するようにJenkinsグローバルセキュリティを再構成する必要があります。 さらに、セットアップでは、クロスサイトリクエストフォージェリを防ぐデフォルトのJenkinsオプションを無効にする必要があります。 これを行うには、 Jenkinsの管理に移動し、「グローバル・セキュリティーの構成」を選択します。 [匿名の読み取りアクセスを許可する]をオンにし、[クロスサイト偽造の悪用を防ぐ]をオンにします。 次に、構成を保存します。
これは単純化の理由でのみ行われることに注意してください。 完全なセットアップは、このチュートリアルの範囲を超えており、TLS接続で、リバースプロキシの背後でJenkinsをさらに保護し、CSRF防止を有効にすることが含まれます。
ステップ4:Gradleビルド
これで、Jenkinsジョブに戻り、構成を続行できます。 ビルドセクションに、ビルドステップを追加します: gradleスクリプトを呼び出します。
このフォームに、次のように入力します。
画面に示されているように、Gradleラッパーを使用します。これは、ホストにGradleをインストールする必要がない便利なGradle機能です。 [gradlew実行可能ファイルを作成する]チェックボックスを必ずオンにしてください。
タスクでは、 build
とbuildDocker
を指定します。
ステップ5:Dockerタグイメージ
ビルドのこの部分は、GradleのdockerBuild
タスクによって以前に準備されたDockerイメージにタグを付けます。 このために、ジョブに新しいビルドステップを追加します: Dockerコマンドを実行します。 [画像のタグ付け]コマンドを選択し、画像名、画像をプッシュするターゲットリポジトリ、およびタグを設定します。
ステップ6:AmazonECRへのDockerプッシュ
最後に、画像をAmazonECRにプッシュする方法を定義する必要があります。 このために、新しいExecute shell buildステップを追加し、AWSに対して認証し、イメージをAmazonECRにプッシュするコマンドを設定します。
#region for our account is us-west-2 aws ecr get-login --region us-west-2 | bash #push the previously tagged image docker push 058432294874.dkr.ecr.us-west-2.amazonaws.com/springbootdocker:${BUILD_NUMBER}
これで、ビルドプロセスが完了しました。 新しいコードをリポジトリにプッシュすると、このジョブがアクティブになり、新しいDockerイメージがDockerレジストリに「自動的に」アップロードされます。
その後、 docker-engine
がインストールされている場所ならどこにでもイメージをプルでき、次のコマンドで実行できます。
docker run -p 8080:8080 amazonRepository/springbootdocker
このコマンドは、S3バケットにファイルをアップロードおよびダウンロードするための次のエンドポイントを使用してSpringBootマイクロサービスを開始します。
-
http://hostnameURL:8080/api/storage/upload
-
http://hostnameURL:8080/api/storage/download?fileName=xyz
Javaと継続的インテグレーションのさらなるステップ
やるべきことは常にたくさんあります。 このチュートリアルでは多くの根拠が取り上げられていますが、これはさらに学ぶための出発点にすぎないと思います。 JenkinsをNginxなどのWebプロキシサーバーの背後に配置し、TLS接続を確立することは、これ以上実行できること、そして間違いなく実行すべきことの2つの例にすぎません。
DockerイメージはAmazonECRで利用可能であり、デプロイの準備ができています。 これで、手動でデプロイできます。 ただし、より適切な解決策は、それをさらに自動化することです。 CIは最初のステップにすぎず、次のステップは継続的デリバリーです。 高可用性についてはどうですか? Amazon AWS EC2は、本番ベースのサービスに必須のクラスター環境でクラウドにコンテナーを登録するための機能を提供します。 継続的デリバリープロセスを開発する良い実例は、次のAWSブログ投稿にあります。
結論
全体として、スムーズでクリーンなソフトウェア開発プロセスを導入しました。 利用可能なツールを利用して、生産性を最大化するのに役立つインフラストラクチャを作成しました。 これで、RESTエンドポイントを備えた単純なWebサービスであるJavaサービスの構成について心配する必要がなくなりました。 Spring Bootコンベンションですべてを処理し、サービスロジックのみに焦点を当てます。 コードをBitbucketGitリポジトリにプッシュするたびに、Jenkinsを使用して新しいDockerイメージを構築し、最終的に、Dockerイメージとファイルの保存をクラウドに任せるようにしました。 Dockerイメージに含まれるサービスをデプロイする場合、オペレーティングシステムの制限はありません(オペレーティングシステムにDocker docker-engine
がインストールされている限り)。