👻

プロキシを変更したことでJenkinsからGitサーバにアクセスできなくなった

2023/12/28に公開

はじめに

初めての記事投稿になります。読みづらいところなどあるかもしれませんが、ご容赦ください。
細かいことでもアドバイスなどいただけると嬉しいです!

システム開発の企業で、開発業務のほかに1年ほど前からGitの管理担当をしています。
Gitを扱う都合上、よく組み合わせて使われるJenkinsについても簡単な仕組みは教えてもらったため、時々設定など行うこともあります。
今回は、JenkinsおよびGitを利用している環境においてプロキシを変更したときのトラブルとその解決法についてまとめたいと思います。

環境など

【Jenkinsサーバ】

  • 複数台あり
  • Windows
  • 社内に設置されている物理マシン
  • WindowsサービスとしてJenkinsがインストールされている
  • 一定間隔でGitリポジトリに対してポーリングし新規コミットがあればビルドをかけるような、一般的なCI環境
  • httpsでプロキシを介してGitサーバへアクセス

【Gitサーバ】

  • 1台のみ
  • Windows
  • クラウド上のVM
  • リバースプロキシなどの使用はなし

バージョンの類はマシンによってまちまちなのと、この件ではあまり重要でないと考えられるので割愛します。

事象

先日、弊社都合によりプロキシサーバを新しいものに切り替えるべく、JenkinsサーバのOSの設定からプロキシ設定を変更したところ、Gitサーバへアクセスできなくなりました。
Windowsのユーザフォルダ配下にある.gitconfigファイルに旧プロキシサーバが設定してあったので、以下のコマンドで再設定したところ、ブラウザやGit上ではGitサーバにアクセスできるようになりました。

$ git config --global http.proxy http://[新プロキシサーバ]
$ git config --global https.proxy https://[新プロキシサーバ]

参考:【初心者必見!】Gitをプロキシ(Proxy)経由で使う方法を理解しよう

しかし、Jenkinsによるビルドは相変わらず失敗していたためエラーを見ると、
どうやらJenkinsはまだGitサーバへのアクセスが失敗しているようでした。

まず対応したこと・その結果

JenkinsはJenkinsでプロキシの設定を持っているようで、以下のサイトを参考に
「Jenkinsの管理」→「プラグインの管理」→「高度な設定」→「HTTP Proxyの設定」にて新プロキシサーバの情報を設定しました。
Jenkins proxy 接続エラー

しかしエラーは解消されませんでした。
肝心のエラーメッセージは以下のようなパターンがありましたが、

  1. Received HTTP code 404 from proxy after CONNECT
  2. Proxy CONNECT aborted
  3. Failed to connect to xxx.xxx.xxx.xxx:yyyy(旧プロキシのIP) after 21047 ms: Timed out

自分はNWにあまり強くないこともあり、これを見たり調べたりしてもよく分からず。。
1.や2.はそもそもプロキシまで行ってるのか?」「3.は新プロキシの設定は完了したはずなのになぜまだ旧プロキシにアクセスしているのか?」などの疑問がありました。
今思えば、この旧プロキシへアクセスしている3.のメッセージが大きなヒントでした。

その他試したこと

  • プロキシサーバ内でアクセス元アプリケーションなどを判別して通信をブロックしていないことを確認
  • 「Jenkinsの管理」→「グローバルセキュリティの設定」→「CSRF Protection」の「プロキシーとの互換性を有効化」にチェック
  • Jenkinsのジョブに設定していたリポジトリのURLをhttpsからhttpに変更
  • Jenkinsのジョブに設定していたリポジトリのURLに埋め込んでいたGitのID/PWを削除し、代わりにJenkinsのジョブの「認証情報」に設定
    などなど・・

都度、Jenkinsの再起動や設定の再読込をさせましたが、状況変わらずでした。

エラーの原因

数日後、社内の方に相談し、解決しました。
旧プロキシにまだアクセスしに行っていることから、Gitの設定を確認するためgit config -lコマンドで見ると

$ git config -l
http.proxy=http://[旧プロキシサーバ]
https.proxy=https://[旧プロキシサーバ]
(中略)
http.proxy=http://[新プロキシサーバ]
https.proxy=https://[新プロキシサーバ]

確かに旧プロキシの設定が残っていました。しかし新プロキシの設定もあります。
確かGitはリポジトリごとの設定もあるが、リポジトリごとにプロキシの設定はしてないはず・・?と思いましたが、さらにもう一つ、システム全体としての設定がありました。

まずここに思い当たらなかったことが今回なかなか解決できなかった原因の1つですね。。

しかし、それにしても--globalオプションをつけて.gitconfigにプロキシ設定したからそちらが優先されるはずでは?と思いましたが、--globalオプションはWindowsユーザフォルダの配下の.gitconfigが対象です。
つまりWindowsユーザごとの設定です。通常、WindowsユーザでOSにログインしてGitを動かす場合は、こちらの設定がシステムの設定より優先されます。(さらに、リポジトリごとに固有の設定をしている場合はそちらが優先されます)
対して、よくよく考えるとJenkinsは別にWindowsユーザの権限で動いているわけではなく、
--systemオプションの対象である、システムのgitconfigの設定で動いているという訳です。

なお、システムのgitconfigは、こちらの環境だと例えばC:\Program Files\Git\etc\にありました。(こちらはなぜか隠しファイルになっていないですね)

以上のような理由で、ブラウザやGitはGitサーバにアクセスできても、Jenkinsだけがアクセスできていなかったようです。
Jenkinsがサービスとして動いている場合は権限に気を付けないといけないという教訓は以前あったので、以下のようにユーザがSYSTEMであることを確認していたのですが、それより先を何も考えていませんでした。。
この時に気づかないといけなかったということですね。
JenkinsのユーザがSYSTEMになっている
タスクマネージャーの「詳細」タブ

gitconfigについては以下の記事がとても参考になります。
https://qiita.com/shionit/items/fb4a1a30538f8d335b35

解決方法

以下のコマンドを打って、

$ git config --system http.proxy http://[新プロキシサーバ]
$ git config --system https.proxy https://[新プロキシサーバ]

さらに、git config -lコマンドで

$ git config -l
http.proxy=http://[新プロキシサーバ]
https.proxy=https://[新プロキシサーバ]
(中略)
http.proxy=http://[新プロキシサーバ]
https.proxy=https://[新プロキシサーバ]

(中略)の上側にあるシステムの設定も新プロキシに変更されたことを確認しました。
無事、JenkinsからGitサーバへアクセスが可能となり、自動ビルドが行われるようになりました。

反省

ブラウザやGitからはGitサーバにアクセスできるのにJenkinsからだけアクセスできないということで、Jenkinsの設定ばかり疑っていました。Jenkinsの権限が特殊であるという教訓がせっかくあったので、どう特殊なのかなど突き詰めて調べる必要がありました。
また、Git管理担当として、configファイルの仕組みについても再度確認しないといけないなと感じました。
あとは当たり前ですが、トラブル時はエラーメッセージが何よりのヒントになるので、メッセージの意味するところをきちんと考えないといけないですね。
半分自戒としてこの記事を残したいと思います。

まとめ

プロキシを変更したらJenkinsからGitサーバへアクセスできなくなったというトラブルにおいて、
原因はシステムのgitconfigのプロキシの設定が更新されていないことでした。

少しでもお役に立てれば幸いです。

Discussion