大破ログ

日々大破、それと側転少々。PC関連その他、気になったことなどをつらつらと。

Jenkins with IIS (URL Rewrite)

かなりの今更感ですが、書いておかないとたぶん(というか絶対)忘れるので、備忘録として書いておくことに。

2017/04/19追記: 備忘録として書いたはずが、既に1個完全に忘れてました。Application Request Routing (ARR)も必要です。

IISとJenkinsを連動させる、というか特定のURL以下をJenkinsに飛ばすやり方です。

環境とか

  • WebサーバOS: Windows Server 2012 クライアントからのアクセスを最初に受けるWebサーバ。Hyper-V内で動作し、長らく "大破.net" をホストしているこいつを使用しました。
  • Webサーバソフト: Microsoft IIS 8.0 Windows Server 2012に含まれる、Microsoft製でおなじみInternet Information Serviceのバージョン8.0。既にWindows Server 2016が登場し、IISもバージョンが上がっていっているものの、8.0もまだまだ使えます。
  • Jenkins側OS: Xubuntu 16.04 Debian系のUbuntuファミリーの一つ、Xubuntuを使用。完全なCUIはまだまだ自分のスキル的に厳しい。 Jenkins自体はWindowsにも導入できますが、今回はOpenWrt / LEDE-Projectのビルドに使用したかったため、Linux系OSを選択。
  • Jenkins Ver: 2.30 前述の通り、実際に導入してからだいぶ経っているので導入時のバージョンは忘れかけてますが、たぶんこの辺り。2017年1月7日現在最新の2.39でもできるはずです。
  • URL Rewrite Ver: 2.0 今回重要となる、IISのURL Rewrite(URL書き換え)。Apacheにおける "mod_rewrite" と同等の機能を提供します。たぶん(筆者自身はApacheまともに触れたことが無い)。 URLのリダイレクト、書き換え、その他色々。
  • Microsoft Application Request Routing 3.0 上記のURL Rewriteと連携し、受信したリクエストを指定されたホストへ転送します。こっちも何気に重要です。

Jenkinsをインストール

まず、何も考えずJenkinsをインストールします。手順については詳しく書かれているサイトが沢山あるので、ここでは割愛。 今回はUbuntuファミリーのXubuntuにインストールするので、私は以下を参考にしました。 [Jenkins][Ubuntu] UbuntuにJenkinsをインストール - Qiita

インストールが完了すると、もうローカルの8080ポートでJenkinsが動作しているはず。

Jenkinsを構成

IISへのアクセスをJenkinsに飛ばす下準備です。 まず、Jenkins稼働マシン上で

[sourcecode language="bash"] /etc/default/jenkins [/sourcecode] を編集して、ポートやプレフィクスを任意のものに変更しておきます。Windowsでは、Jenkinsのインストール先フォルダにある "jenkins.xml" がその設定ファイルに該当する模様。 今回、設定は以下の通りにしました。

[sourcecode language="bash"] ポート: 8080 #競合するものが無かったのでそのまま prefix: /jenkins #なんとなく [/sourcecode]

ちなみに、URLについてはJenkinsのシステム設定にそれっぽい設定がありますが、これはあくまでビルド通知などに載せるために使用されるだけのURLであって、Jenkinsのシステム自体に関わるものでは無いんだそう。 設定ファイルを編集して保存したら、Jenkinsのサービスを再起動します。

[sourcecode language="bash"] $ service jenkins restart [/sourcecode] すると、設定した通りのURLでJenkinsが動作するはずです。今回の場合、

[sourcecode language="bash"] http://localhost:8080/jenkins [/sourcecode] になります。

続いて、セキュリティ絡みの設定。Jenkinsでは、不正なアクセスを防ぐため、乱数っぽいものを付加している模様。IISからURL Rewriteを使用してJenkinsに飛ばす場合、これに引っ掛かってしまい、多くのページでCrumbなんちゃらとエラーを吐かれて何もできなくなります。 これを回避するため、Jenkinsの管理ページにある "グローバルセキュリティの設定" で、下のほうの "CSRF対策" 内の "プロキシーとの互換性を有効化" にチェックを入れ、適用、もしくは保存して有効にします。

↓下の画像で赤線の部分

jenkins-crumbs

これでJenkins側の下準備は大体完了。

IISの設定

次はIIS側を設定します。Application Request Routing と URL Rewrite は、予めWebPIを利用してインストールしておきます。 とりあえず、Webサイトを適当に1個作ります。 IIS Manager でサーバーのホーム画面を表示して "Application Request Routing Cache" に入り、さらに右側のペインから "Server Proxy Settings" を選択して入ります。 画面一番上に "Enable Proxy" のチェックボックスがあるので、チェックを入れて右側のペインで適用します。 次に、作成したWebサイトのホーム画面へ移り、 "URL Rewrite" または "URL 書き換え" があるので、そこに入ります。 iis8-taiha-net_url-rewrite

そして右側の "操作" ペインから、"規則の追加..." を開き "空の規則" を選択してOKを押下、規則の編集に入ります。 今回は、

[sourcecode] http://taiha.net/jenkins [/sourcecode] というURLの "/jenkins" 以下を、Jenkinsが動作しているサーバ(IPアドレス: 192.168.88.254, ポート: 8080 )に飛ばします。

規則の名前は "url-rewrite_to_jenkins" とか適当に付けました。 その他の設定は以下の通り。

  • URLの一致
    • 要求されたURL: パターンに一致する
    • 使用: 正規表現
    • パターン: ^jenkins(.*)$
    • 大文字と小文字を区別しない: 未チェック
  • アクション
    • アクションの種類: 書き換え
    • URLの書き換え: http://192.168.88.254:8080/jenkins{R:1}
    • クエリ文字列の追加: チェック
    • 書き換えられたURLを記録する: 未チェック
    • 後続の規則の処理を停止する: チェック

iis8-taiha-net_url-rewrite_rule

とりあえずはこんな感じ。これで、

[sourcecode] http://taiha.net/jenkins [/sourcecode] 以下がJenkins鯖に飛ばされ、アクセスできるようになりました。

ちなみに、大破.net(taiha.net含む)ではLet's Encryptの証明書をIISが稼働しているWindows Server上で取得してHTTPSを有効にしていますが、この場合インターネット側とIIS間はHTTPSIISとJenkins間はHTTPで接続されます。 この状態で上記の様なURL RewriteによってJenkinsに飛ばされるURLにアクセスした場合、大破.netのHTTPS接続が維持されます。

↓例。JenkinsもIIS側の証明書によってHTTPS扱いに。

jenkins-https

また、IISは外部へのポート開放は必要なものの、Jenkins側は完全にIISを経由してのアクセスとなるため、こちらは外部へのポート開放の必要は無さそう(未検証)。

ちなみに、この記事の方法でJenkinsに飛ばした場合、Jenkinsでワークスペース内のファイル横に表示される "参照" リンクは、IISのアプリケーションエラーが表示されてしまい機能しません。教えてえろい詳しい人。

追記: いつの間にか参照リンクも機能するようになってました。良かった。

というわけで、何かと忘れる自分のための備忘録でした。