# Jenkins を触ってみよう

# 事前準備

この講義では Jenkins を試しに触るため、docker で手元に Jenkins を構築します。 イメージのダウンロードに少し時間がかかるので、pull だけ済ませておいてください。

docker pull jenkins/jenkins:lts
1

# Jenkins とは

2011 年に発表された CI(継続的インテグレーション)/ CD(継続的デリバリ)ツールの1つです。

what_jenkins

Jenkins ではソフトウェアのテストやビルドに必要なさまざまなタスクを「ビルド手順」としてまとめ、パラメータや実行トリガなどを加えた「ジョブ」を作成します。 そのジョブを手動での実行や Git の commit への反応、システムからの自動連携で実行することで、デプロイやテストの実行をサポートしてくれるツールです。 ジョブのビルド手順はシェルスクリプトを直接指定できるほか、Java のビルドに使う Maven などさまざまなプラグインを導入し拡張することで、非常に柔軟なタスクを実行可能になっています。 またマスタとスレーブ構成を構築し、大規模にスケールさせることも可能です。

欠点としては、昨今の drone.io (opens new window) や GitHub Actions といったツールが Docker コンテナを使ってタスクの実行環境をカプセル化しているのに対し、Jenkins では実行環境はすべてのタスクで共通です。 これはつまり、あるジョブで Ruby を実行したければ Jenkins が動作しているホストに Ruby をインストールする必要があります。そうするとジョブによって異なる Ruby のバージョンを使うのが非常に難しくなります。

昨今では Docker コンテナを前提とした開発環境やテストツールが増えていることもあり、ビルドやテストには Docker コンテナを使った CI ツールを使うことが大半です。 しかし柔軟にタスクを構築可能な Jenkins はうまく管理すれば非常にシンプルで強力なツールになるため、現在でも活躍の機会は多々あります。

TIP

このハンズオンでは扱いませんが、現在の Jenkins では「Pipeline」というジョブを定義することで、drone.io (opens new window) などと同じようにジョブの実行内容をファイルで定義できます。また Docker プラグインを利用することで、Docker を使ったジョブの実行も可能です。

# 補足: CI(継続的インテグレーション)

CI とは、プログラムの開発中にテストやデプロイを頻繁に実施することで、問題を早期に発見することを目的とした開発手法です。 たとえば丸々一ヵ月開発してからはじめてデプロイ・テストをするよりも、変更の度に何回も軽めのテストを実施するほうが早期に問題を発見・修正できます。 (もちろん最終的な結合試験も必要不可欠です)

そうした開発をサポートするため、GitHub の commit などをトリガにしてテストやデプロイを実施して結果を知らせてくれるツールを総称して CI ツールと呼びます。 Jenkins もその 1 つです。

最近の主要な CI ツールとしては

などが上げられます。

# Jenkins を立ち上げてみる(自力で立ち上げる場合)

Jenkins を試しに触るため、docker を使って手元に構築してみましょう。 社内に共用で使える Jenkins サーバが立っていればそちらを使うこともできます。講師の指示にしたがってください。

TIP

IIJ社内では今回のハンズオン用にJenkinsサーバーを立ち上げているので、そちらを使ってください。

docker の使える環境で以下のコマンドを実行して、Jenkins を実行してください。

windows

mkdir jenkins
docker run -p 8080:8080 -p 50000:50000 --mount type=bind,source=%CD%/jenkins,target=/var/jenkins_home jenkins/jenkins:lts
1
2

linux, mac

mkdir jenkins
docker run -p 8080:8080 -p 50000:50000 --mount type=bind,source=${PWD}/jenkins,target=/var/jenkins_home jenkins/jenkins:lts
1
2

途中で以下のように初期パスワードが表示されるため、コピー&ペーストしておきましょう。

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

050703f1fa114304839a65244184d222 <- 初期パスワードの例

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Jenkins is fully up and running と表示されたら成功です。 localhost:8080 をブラウザで開いてみてください。以下のような画面が表示されると思います。

input-admin-pass

先ほどコピー&ペーストしたパスワードを入力して「Continue」を押しましょう。すると次の画面が表示されます。

install-plugin

「Install suggested plugins」を選んでください。すると plugin のインストールが自動的に始まります。plugin のインストールが終わると以下の画面が表示されるので、適当に入力しましょう。

create-admin-user

最終的に「Jenkins へようこそ!」と表示されれば成功です。

welcome-jenkins

# Jenkins を使ってみよう

早速試しに使ってみましょう。「新しいジョブを作成」をクリックするとジョブの作成画面に入ります。

jenkins-first

まずは「フリースタイル・プロジェクトのビルド」をクリックしてください。

create-job

作成するとジョブの設定画面が開きます。色々設定がありますが、まずは「Build Steps」からスクリプトを登録してみましょう。「ビルド手順の追加」から「シェルの実行」を選ぶとスクリプトを登録できます。

job-build-script

たとえば以下のようなスクリプトを設定してみてください。

pwd
echo 'welcome to bootcamp' >> welcome.txt
1
2

「保存」をクリックするとジョブが作成されるので、「ビルド実行」を押して実行してみます。 「ビルド履歴」に#1が増えたでしょうか。#1をクリックして「コンソール出力」をクリックするとビルドの様子を確認できます。

build-result

# ワークスペース

上の例ではシェルスクリプトでwelcome.txtというファイルを作成しました。このようにビルドの実行で生成されるファイルを「成果物」と呼んだりします。

成果物はどこに作られているでしょうか。以下のようにディレクトリを覗いてみると、成果物が生成されているのが分かります。 (自分でサーバーを立ててる場合はシェルなどで確認できます。公開サーバーの場合はタスクでスクリプトを実行して確認することもできます。)

$ cat jenkins/workspace/test-project-<アカウント名>/welcome.txt
welcome to bootcamp
1
2

ディレクトリ名からも分かる通り、ジョブが実行されるディレクトリを「ワークスペース」と呼び、成果物も基本的にここに作成されます。ワークスペースはジョブ毎に別々に作られるため、他のジョブに影響されず実行することができます。

成果物はジョブの実行前に自動で削除するようにも設定できますが、そうでない場合は前回の成果物がそのまま残っているためスクリプトを作る際は注意が必要です。また成果物を残しすぎると Jenkins ホストのディスクを圧迫するため不要な成果物は削除するようにしましょう。

# ビルドトリガー

先ほどはジョブを手動で実行しましたが、他にも様々な方法でビルドを実行することができます。 Webhook などの HTTP リクエストからジョブを実行するトリガを設定してみましょう。

まずは Jenkins の API token を取得します。

create-token

画像の通り 右上の admin -> 設定 -> API トークン から token を生成します。 このとき生成された token をコピー&ペーストするのを忘れないでください。

画面上部のパンくずリストなどからジョブのトップ画面に移動し、「設定」をクリックして設定画面に移動しましょう。「ビルド・トリガ」はこのジョブを実行するトリガを設定できます。「リモートからビルド」を選ぶと HTTP リクエストをトリガーにビルドを実行することができます。

build-trigger

認証トークンを設定できるので適当な文字列を設定して保存します。ややこしいですが、ここで入力する「認証トークン」は先ほど作成したものとは関係なく、ジョブに紐づけられる認証トークンになります。今回はアカウントに生成した認証トークンを使用するため、ここで入力する文字列は適当なもので構いません。 保存後、設定画面に書かれているように: JENKINS_URL/job/<ジョブ名>/buildにリクエストしてみましょう。先ほどアカウントに作成した API token を使用します。

curl -X POST --user '<アカウント名>:<API token>' 'JENKINS_URL/job/<ジョブ名>/build'
1

上記を実行するとジョブが実行されます。 このように Jenkins は外部のプログラムから簡単にジョブを実行できます。

# パラメータ付きビルド

ビルドにはパラメータを設定できます。「General」にある「ビルドをパラメータ化」からパラメータを設定してみてください。 「パラメータの追加」を押すと種類を選ぶプルダウンが出てきます。 ここでは「テキスト」のパラメータを追加してみましょう。

build-param

設定したパラメータは環境変数として使えます。スクリプトを以下のようにしてみてください。

pwd
echo $param >> welcome.txt

cat welcome.txt
1
2
3
4

パラメータ付きビルドをリモートから実行するには、先ほどの例に加えてパラメータの内容をリクエストに含めます。

curl -X POST -F 'param=bootcamp' -u '<アカウント名>:<API token>' JENKINS_URL/job/test-project/buildWithParameters
1

ビルドの履歴から結果を見ると、echo boocampというコマンドが実行されているのが分かります。

# 秘密情報の利用

Jenkins ではパスワードなど秘密情報を取り扱う機能があります。パスワードをスクリプトに直接書いてしまうと誰でも見えてしまうので、外には表示されない状態で埋め込むことができます。

ジョブ設定画面「ビルド環境」にある「秘密テキストや秘密ファイルを利用する」を使います。 秘密情報である password を埋め込んでみましょう。まずは「追加」から「秘密テキスト」を選択しましょう。

password1

「変数」には先ほどのパラメータ化と同様に、この秘密情報を埋め込むときの変数名を指定します(今回は password)。 「認証情報」には、Jenkins に保存されている秘密情報の中から紐付ける対象を選択できます。今はまだ何も登録されていないと思うので、「追加」から秘密情報を追加してみましょう。追加先には「Jenkins」を選択してください。

password2

すると秘密情報の登録画面に移るので、画像の通り入力して「追加」を選択してください。「種類」は「Secret text」、「ID」にはsecret-<アカウント名>、「Secret」には適当なパスワード文字列を設定しておきます。

secret-add

secret を追加したら先ほどの画面でsecret-<アカウント名>が選べるようになっているので、選択して保存しましょう。

secret-config

スクリプトを以下のようにすると、先ほど設定したパスワードが使えます。

pwd
echo $password >> welcome.txt

cat welcome.txt
1
2
3
4

welcome.txtを見てみると、先ほど設定したパスワードが入力されているのが確認できます(手元で立てている場合のみ)。

$ cat jenkins/workspace/test-project/welcome.txt
welcome to bootcamp
bootcamp
hogehoge <- パスワード
1
2
3
4

ちなみに Jenkins の実行結果画面では、秘密情報はマスクされて見えないようになっています。

password3

# 最後に

Jenkins は非常にさまざまなことができますが、そのぶん使いこなすのが難しいです。さらに環境によってバージョンの違いや入っているプラグインの違いで微妙に使い勝手が違ったり、使い方が分かりにくかったり苦労することもあります。

ただしきちんと運用された Jenkins サーバを適切に使うと、さまざまなシステムと連携して自由度の高いビルドを実施できるため開発などの業務を効率化できます。


CC BY-SA Licensed | Copyright (c) 2023, Internet Initiative Japan Inc.