かなりの今更感ですが、書いておかないとたぶん(というか絶対)忘れるので、備忘録として書いておくことに。
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側の下準備は大体完了。
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 書き換え" があるので、そこに入ります。
そして右側の "操作" ペインから、"規則の追加..." を開き "空の規則" を選択して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を記録する: 未チェック
- 後続の規則の処理を停止する: チェック
とりあえずはこんな感じ。これで、
[sourcecode] http://taiha.net/jenkins [/sourcecode] 以下がJenkins鯖に飛ばされ、アクセスできるようになりました。
ちなみに、大破.net(taiha.net含む)ではLet's Encryptの証明書をIISが稼働しているWindows Server上で取得してHTTPSを有効にしていますが、この場合インターネット側とIIS間はHTTPS、IISとJenkins間はHTTPで接続されます。 この状態で上記の様なURL RewriteによってJenkinsに飛ばされるURLにアクセスした場合、大破.netのHTTPS接続が維持されます。
↓例。JenkinsもIIS側の証明書によってHTTPS扱いに。
また、IISは外部へのポート開放は必要なものの、Jenkins側は完全にIISを経由してのアクセスとなるため、こちらは外部へのポート開放の必要は無さそう(未検証)。
ちなみに、この記事の方法でJenkinsに飛ばした場合、Jenkinsでワークスペース内のファイル横に表示される "参照" リンクは、IISのアプリケーションエラーが表示されてしまい機能しません。教えてえろい詳しい人。
追記: いつの間にか参照リンクも機能するようになってました。良かった。
というわけで、何かと忘れる自分のための備忘録でした。