proxy背後でJenkinsのプラグインをインストールする時のエラーの対処(docker&windows)

継続的インテグレーションの環境構築で、Jenkinsを使うことになったのですが、Jenkinsのインストールをして、その後始まるプラグインのエラーで長らく悩まされておりました。。

「Install plugin」すると、以下の画像のようにエラーになってしまう。。

ようやく解決方法が分かったので、メモしておきます。

Docker上に環境構築する場合と、Windowsにサービスとしてインストールする場合とで対処法が微妙に異なっていたので、両方記載しますね。

混同しがちなので注意

Jenkinsのイメージには、2つ、有名なのがあり、混同しがちです。jenkinsjenkins/jenkinsは異なるイメージです。
前者はdocker公式イメージで、後者はjenkinsチームがメンテしています。
公式の方がよいと思うかもしれませんが、開発には、後者が扱いやすいと思います。私は、後者を使うことが多いです。

Dockerの場合

dockerでjenkinsのイメージをpullして環境を作る場合、コンテナの起動時の引数として、JVMにプロキシの情報を渡す必要がありました。

docker run --name con_jenkins -p 8080:8080 -p 50000:50000 -v /jenkins_home:/var/jenkins_home --env JAVA_OPTS="-Dhttp.proxyHost=proxy_server -Dhttp.proxyPort=proxy_port -Dhttps.proxyHost=proxy_server -Dhttps.proxyPort=proxy_port" -d myimg/jenkins:1.0

httpとhttpsの両方を設定しないと通信エラーになってしまいます。

なお、私が試したときは、単純にlatestのイメージをpullすると上記オプションを指定してもプラグインのインストールに失敗したので、dockerfileを作成し、明示的にイメージを取得してイメージを作ってから、上記コマンドで起動しました。

# dockefileの記述
FROM jenkins:2.7.4

# その後、以下のコマンドでイメージをビルド
docker build --no-cache -t myimg/jenkins

Windowsにサービスとしてインストールする場合

Windowsにインストールした場合は、インストールしたディレクトリに「jenkins.xml」というファイルがあります。

その中に、JavaのJVMオプションを記載する箇所がありますので、そこに以下のように

-Dhttp.proxyHost=proxy_server -Dhttp.proxyPort=proxy_port -Dhttps.protocols=TLSv1.1,TLSv1.2

というオプションを追加します。

プロキシのサーバ(IPアドレス)とポート番号ですが、protocolsというのは、SSLハンドシェイクのエラーが出ていたため、追記しました。

以下の画像で言うと、赤枠の部分になります。

その後、以下のURLをブラザに入力して再起動し、再度プラグインのインストールを行います。

http://localhost:8080/restart

Jenkinsの管理コンソールからプロキシの設定を行う場合

上記の起動オプションを渡せば、プラグインのインストール時にプロキシが使われますが、「http://localhost:8080/manage」から管理コンソールで設定することも可能です。

管理コンソールを開き、「Jenkinsの管理」->「プラグインの管理」を選択します。

そして、「高度な設定」タブを選択して、「HTTP Proxyの設定」にプロキシサーバのホスト名またはIPアドレスと、ポート番号を設定します。

すると、Jenkinsをインストールしたディレクトリに「proxy.xml」という設定ファイルが出来て、プロキシー情報が書き込まれます。