ウェブサイト検索

JenkinsをインストールしてCI/CDパイプラインを構築する方法


アジャイル開発プロセスに従うソフトウェア会社にとって、毎日ソフトウェアをリリースすることは集中的なプロセスです。Jenkinsは、ビルド、テスト、リリースなどの多くの反復的な作業を自動化することによって、ワークフローを加速できるツールです。

Jenkinsとは何ですか?

Jenkinsはもともと、夜間のソフトウェアビルドのビルドとテストを自動化するという単一の目的のために作られました。新しいコミットは定期的にマスターブランチに統合される必要があります(これはしばしば「継続的インテグレーション」と呼ばれます)。これには、すべてがスムーズに動作することを確認するための厳重なテストが含まれることが多いです。週に一度それを行うのは一つのことですが、1日に何度も統合する場合は、それを自動プロセスにする方がみんなにとって良いです。

Jenkinsやそれに類似した他のCI/CDソリューションは、このプロセスを加速します。これは自動化されたシェルスクリプトのように考えることができます。たとえば、Reactアプリの新しいビルドをリリースする場合、npm installを実行し、次にnpm run buildを実行し、その後Jestのようなテストスイートを実行して、新しいビルドがすべてのテストに合格するか確認する必要があります。成功した場合は、手動レビューのためにテスト環境に送信するか、新しいリリースを直接公開するかもしれません。これらはすべて、非常に簡単にスクリプト化できるコマンドです。

Jenkinsは、これらのすべてのタスクをパイプラインの一部として実行することができます。Jenkinsがソースコントロールの変更を検出すると(マスターまたはフィーチャーブランチのいずれかで)、自動パイプラインを開始し、与えられた各タスクを実行します。タスクの中にはbashコマンドのように簡単なものもあれば、JiraやGit、メールプロバイダーなどの外部サービスと連携するタスクもあります。Jenkinsはプラグインで完全に拡張可能であり、本当にあなたが望むことを何でも行うことができます。

Jenkinsには2つの主要なリリース、Blue Oceanとクラシックがあります。Blue Oceanはより新しく、パイプライン作成を大幅に簡素化する洗練されたUI体験が含まれています。このガイドではBlue Oceanを使用しますが、同じ概念のほとんどはJenkinsの両方のバージョンに適用されます。

ジェンキンスのインストール

Jenkinのバイナリは複数のオペレーティングシステムで利用可能ですが、通常はデフォルトのパッケージマネージャーからは入手できません。もしUbuntuを使用している場合、以下のいくつかのコマンドでダウンロードしてインストールできます:

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -

sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

sudo apt-get update

sudo apt-get install jenkins

プラットフォームに依存しないようにするために、JenkinsをDockerを使用して実行します。これはJenkinsが推奨する方法でもあります。

Dockerをインストールする

Dockerはアプリケーションを「コンテナ」で実行するためのプラットフォームです。コンテナには必要な依存関係がすべて含まれており、アプリが基本となるオペレーティングシステムに関係なく同じように実行されることを保証します。あなたがする必要があるのは、システムにDockerをインストールし、いくつかのコマンドを実行することだけです。

Ubuntuの場合、いくつかの前提条件をインストールする必要があります:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

次に、DockerのGPGキーを追加します:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

そしてリポジトリ自体を追加してください:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

ソースを更新してください:

apt update

そして、最後に、aptからDockerをインストールします。

sudo apt install docker-ce

Dockerは現在あなたのシステムで実行されているはずです。systemctlを使って確認できます。

Jenkinsの設定

Dockerが起動している状態で、Jenkins用のDockerコンテナを設定できます。まず、コンテナ同士が通信するためのブリッジネットワークが必要です。

docker network create jenkins

Dockerは本質的に一時的です---コンテナ上に保存されたすべてのデータは、コンテナが停止されると削除されます。これを防ぐためには、ディスクに持続するDockerボリュームにデータを保存する必要があります。JenkinsがDockerに接続するために必要なTLS証明書用と、Jenkinsのすべてのデータ用の2つのボリュームが必要です。これらは実行時にコンテナにバインドされます。

docker volume create jenkins-docker-certs

docker volume create jenkins-data

Jenkinsは実際、ビルド環境を設定するためにDockerを実行できる必要があります。通常のDockerではこれが不可能なため、その機能を正しく動作させるには「Docker in Docker」、つまりDinDを実行する必要があります。以下のコマンドは、Dockerの公式docker:dindコンテナを実行し、前のステップで作成したネットワークとボリュームをバインドし、Jenkinsコンテナが使用できるようにポート2376でサービスとして公開します。このポートは変更しても構いませんが、次のステップでも変更が必要になります。

docker container run --name jenkins-docker --rm --detach 

--privileged --network jenkins --network-alias docker

--env DOCKER_TLS_CERTDIR=/certs

--volume jenkins-docker-certs:/certs/client

--volume jenkins-data:/var/jenkins_home

--publish 2376:2376 docker:dind

その設定で、次のコマンドを使ってjenkinsci/blueoceanコンテナを実行できます:

docker container run --name jenkins-blueocean --rm --detach 

--network jenkins --env DOCKER_HOST=tcp://docker:2376

--env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1

--volume jenkins-data:/var/jenkins_home

--volume jenkins-docker-certs:/certs/client:ro

--publish 8080:8080 --publish 50000:50000 jenkinsci/blueocean

これにより、ネットワークとドライブがマウントされ、DOCKER_HOST変数がDinDが実行されているポートに設定され、サービスがポート8080で公開されます。このポートが空いていない場合は変更できます。(形式はhost:containerです。)また、複数の分散ビルドが接続するマスタージェンキンサーバーを設定する予定がある場合は、ジェンキンの管理接続がポート50000で公開されます。

一旦Jenkinsが稼働し始めると、ホストマシンのポート8080でブラウザからアクセス可能になります。Jenkinsが完全に使えるようになる前に、いくつかの設定が必要です。最初の設定は、サーバーの所有者であることを証明するために自分を認証することです。これは、脆弱なウェブインターフェースを攻撃するボットではないことを示すためです。

Dockerボリュームの一部である/var/jenkins_home/に保存されているパスワードを入力する必要があります。それにアクセスするには、Dockerコンテナ内でcatを実行する必要があります:

docker container exec -it jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

これによりパスワードが表示されるので、それをコピーして残りの設定を始めることができます。

管理者のユーザー名とパスワードを設定し、さまざまなプラグインをインストールするように求められます。「推奨プラグインのインストール」を選択すると、コミュニティで推奨される多くのプラグインが最初にインストールされます。後でさらにインストールするのは自由です。

パイプラインを作成する

Jenkinsをセットアップすると、次のウェルカムスクリーンが表示されます。「新しいパイプラインを作成」をクリックして始めましょう。

コードが保存されている場所を選択する必要があります。アクセスキーを使って、GithubまたはBitBucketアカウントを直接リンクすることができます。

しかし、より良い解決策は、単に一般的な「Git」を選択することです。リポジトリのURLを入力すると、Jenkinsが公開鍵を提供します。Jenkinsはコミットを行うことができるため(常にパイプライン構成に変更をコミットします)、新しいサービスユーザーを作成し、その公開鍵を追加する必要があります。

JenkinsはGitに接続するのに少し時間がかかり、次にパイプライン設定を編集できるページに移動します。Jenkinsはすべてのパイプライン設定をリポジトリのルートに配置されたJenkinsfileに保存します。エディタでパイプラインの更新を行うたびに、Jenkinsはその変更をJenkinsfileにコミットします。

各パイプラインは、ビルド、テスト、デプロイなどのいくつかの異なるステージを持ち、それぞれに個別のステップが含まれます。これらは、メールを送信したり、JiraやGitなどの他のサービスとやり取りしたり、他のステップの流れを調整したりするなど、さまざまなことを行うことができますが、最も一般的にはこれらを使用してシンプルなシェルスクリプトを実行します。これらのスクリプトの返り値にエラーがあると、パイプラインは失敗します。

段階を追加する前に、環境設定を構成したいと思います。通常は、node:latestなどのDockerコンテナを使用します。

この例では、Nodeベースのウェブアプリを構築します。npm install と npm run build の2つのステップを追加するだけで十分です。Jenkinsはこれらのコマンドを実行し、ビルドアーティファクトが配置された状態で次のステージに移ります。テストフェーズでは、Jestを実行するシェルスクリプトを設定する必要があり、すべてのテストがパスすることでビルドが成功します。

Jenkinsは複数のステージを並行して実行できるため、異なるプラットフォームでテストする必要がある場合に便利です。「Linuxでテスト」および「Windowsでテスト」のステージを設定し、同時に実行させて、片方の開始を待つことがないようにできます。いずれかが失敗した場合でも、パイプラインは失敗します。

編集が完了すると、Jenkinsが自動的にパイプラインを開始します。詳細を確認するためにクリックすると、ビルドの進行状況を各ステージで確認することができます。

エラーがある場合、上部バーは赤くなり、すべてが成功した場合は緑になります。エラーが発生している場合は、問題のあるステージをクリックして、パイプラインが失敗する原因となっているコマンドのコンソール出力を表示できます。また、すべての必要なツールがインストールされていることを確認するために、環境設定をチェックすることもお勧めします。(ビルド用に自分自身のDockerコンテナを設定することも考慮するかもしれません。)

関連記事: