MacOSでnginxとJenkinsを使う

個人の作業メモですが誰かの参考になれば幸いです。

やりたいこと
-
- JenkinsでCI環境を作る
- nginxでプロキシして `http://localhost/jenkins` でJenkinsにアクセスできるようにする

環境
-

- `macOS Catalina 10.15.7`
- `Homebrew 3.0.0`
- `java 1.8.0_151`

nginx
-

##### インストール
```
$ brew install nginx
```


##### 自動起動
```
$ brew services start nginx
```

##### 設定変更

`/jenkins` のリクエストを8080ポートで受け付けるように設定。
デフォルトで`/usr/local/etc/nginx/servers/*` がincludeされる設定になっているため、該当ディレクトリにJenkins用のファイルとして作成しておく。

```/usr/local/etc/nginx/servers/jenkins.conf
upstream jenkins {
    server 127.0.0.1:8080;
}
```

```/usr/local/etc/nginx/nginx.conf
location ~ /jenkins {
    proxy_pass         http://jenkins;
    proxy_set_header   Host              $host;
    proxy_set_header   X-Real-IP         $remote_addr;
    proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto $scheme;
}
```

Jenkins
-

##### インストール
```
$ brew install jenkins
```

##### 自動起動
```
$ brew services start jenkins
```

##### 設定変更

`http://127.0.0.1:8080/jenkins` でアクセスするために以下を設定。

```/usr/local/opt/jenkins/homebrew.mxcl.jenkins.plist
<string>--httpListenAddress=127.0.0.1</string>
<string>--httpPort=8080</string>
<string>--prefix=/jenkins</string>
```
:warning: `/usr/local/opt/jenkins` は `/usr/local/Cellar/jenkins/バージョン` のシンボリックのため、Jenkinsをバージョンアップすると無効になります。

Jenkinsの画面からJenkinsURLを設定
-
この時点で `http://localhost/jenkins` にアクセスしてJenkinsが開けるはず。
`Jenkinsの管理` を開くと **「リバースプロキシーの設定がおかしいようです。」** と警告されるので、
`Jenkinsの管理 -> システムの設定 -> Jenkins URL` を
`http://localhost/jenkins/` に変更して警告が消えれば完了。

おまけ : JNLPスレーブ
-
これだけだとJNLP経由でslaveエージェントを起動しようとした時にエラーが出ていた

```
$ java -jar agent.jar -jnlpUrl http://localhost/jenkins/computer/build/jenkins-agent.jnlp
8 11, 2021 7:36:15 午前 hudson.remoting.jnlp.Main createEngine
情報: Setting up agent: build
8 11, 2021 7:36:15 午前 hudson.remoting.jnlp.Main$CuiListener <init>
情報: Jenkins agent is running in headless mode.
8 11, 2021 7:36:15 午前 hudson.remoting.Engine startEngine
情報: Using Remoting version: 4.10
8 11, 2021 7:36:15 午前 hudson.remoting.Engine startEngine
警告: No Working Directory. Using the legacy JAR Cache location: /Users/tochigi/.jenkins/cache/jars
8 11, 2021 7:36:15 午前 hudson.remoting.jnlp.Main$CuiListener error
重大: Handshake error.
io.jenkins.remoting.shaded.javax.websocket.DeploymentException: Handshake error.	at io.jenkins.remoting.shaded.org.glassfish.tyrus.client.ClientManager$3$1.run(ClientManager.java:658)
	at io.jenkins.remoting.shaded.org.glassfish.tyrus.client.ClientManager$3.run(ClientManager.java:696)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
...
```

これを解決するには以下の設定が必要

- `Jenkinsの管理 -> グローバルセキュリティの設定 -> Agents -> 固定TCPポート`
  - 任意のポート番号を指定 ( 例: `8888` )
- `Jenkinsの管理 -> ノードの管理 -> 該当ノードの設定 -> 起動方法 -> 高度な設定 -> トンネル接続`
  - Jenkinsのホストとポート番号を指定 ( 例: `localhost:8888` )

参考
-
- [Reverse proxy - Nginx (Jenkins)](https://www.jenkins.io/doc/book/system-administration/reverse-proxy-configuration-nginx/)
- [nginxとJenkinsで CI サーバーを作る](http://rough-and-ready-co-jp.blogspot.com/2015/04/nginxjenkins-ci.html)
- [Mac上のnginx設定ファイルをドメイン毎に分ける](https://blog.mothule.com/web/nginx/web-nginx-getting-started-customize-on-mac)
- [Jenkins：接続するJNLPスレーブのNginxリバースプロキシの背後でJenkinsを構成する方法](https://www.it-swarm-ja.com/ja/nginx/jenkins%EF%BC%9A%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8Bjnlp%E3%82%B9%E3%83%AC%E3%83%BC%E3%83%96%E3%81%AEnginx%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%81%AE%E8%83%8C%E5%BE%8C%E3%81%A7jenkins%E3%82%92%E6%A7%8B%E6%88%90%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95/826976982/)