2017年5月20日土曜日

Visual Studio 2017でPushCommand.ExecutePushCommand

週末なのでMicrosoft Visual Studio 2015を2017に更新することにしました。
保守案件がありそうな2008やそれ以前のを残して2012以降をばっさりと切り捨ててすっきりです。

同時にUnityも5.6にしたらAdMobが動かない。。。
開発環境を更新したのですから当然何かあるとは思っていましたが、まずUnity側で事案発生。まあ、所詮誰も遊んでくれないゲームアプリで利用しているだけなので更新することもないでしょうから当分こちらは放置です。

2017はこの段階では別段何事もなさそうだったので、早速Cities: SkylinesのMODを今度発売されたMass Transit DLC用に機能追加をしてテストして無事リリース。
早速早期対応ありがとう(意訳)なコメントをいただいて、照れくさくござる。

ここまでは順調だったのですが、テストを完了してローカルでコミットされていたソース群をオレオレサーバにpushしようとして開発環境移行時多発事案の発生であります。
リモート リポジトリへのブランチのプッシュ中にエラーが発生しました: Git failed with a fatal error.
fatal: unable to access 'https://xxx/yyy.git/': SSL certificate problem: self signed certificate in certificate chain
数年前から趣味で作ったソフト群はサーバ上に設置したgitbucketという大変スバラシイソフトウェア経由で管理しており、それへのアクセスはhttpsを経由して行っていたのですが、先日までの2015では特に叱られもしませんでした。
2017からちゃんと対応するようにしたのでしょうか、オレオレ証明書なんか知らねーよとおむずかりです。

これはまあ、言われた通りにすればいいので、オレオレ認証局の証明書をconfigに追加するか、そもそも証明書のチェックをさせないかのどちらかで対応可能です。
  1. オレオレ認証局の証明書をconfigに追加する場合
    証明書はderじゃだめでpemじゃないとダメな様子です。
    https://oreoreというサーバを証明するca_oreore.derという証明書があったとして、opensslでder形式からpem形式に変換するには以下の構文になります。
    openssl x509 -in ca_oreore.der -inform DER -out ca_oreore.pem -outform PEM
    ここでできたca_oreore.pemを .git/config に、以下を追記してあげます。

    [http "https://oreore/"]
    sslCAInfo = X:/path/to/ca_oreore.pem


    お気づきかと思いますが、ドライブレターがついています。
    ついていないと、標準インストールの場合、
    C:\Program Files (x86)\Microsoft Visual Studio\2017\[エディション名\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw32
    という気が遠くなるような深いパスがrootとなってしまいます。
    素敵な仕様ですネ。
    また、バックスラッシュ(\)ではなくスラッシュで記述したほうがよろしいかと思います。また、"https://oreore/"を省いてもいいのですが、それだとサーバ毎に証明書を設定することはできません。
  2. 証明書をガン無視させたい場合
    .git/configに下記の行を追記します。
    [http]
    sslVerify = false
まあ、ここまでは良かったんですが、いざpushしようとするとさらにおむずかりのようで、コンソールに書きのメッセージがお出ましになられました。
リモート リポジトリへのブランチのプッシュ中にエラーが発生しました: Git failed with a fatal error.
    PushCommand.ExecutePushCommand
こっちは先ほどと違って、何を言ってるのかわかりません。
今現在、記事にしている最中ですが現時点でもさっぱり訳が分かっていません。

PushCommand.ExecutePushCommandで検索すると、2017添付のgitを最新版に更新したら直っただとかopenssl系のdllが混在していただとかいろいろ記事はあるのですが、それらすべてを試しても何の解決にもなりません。

加えてサーバ側のgitリポジトリのアクセス許可や実行ユーザを再度確認したりVisual Studioを再インストールしたり、修復したり、などと試していて、これだけで土曜がつぶれてしまいました。

さらに直接gitコマンドでpushを試みたところ、さらにわけのわからないエラーが。
リモート側に存在しないpackファイルをunpackしようとして存在しない(ないんだからないわな)からって大激怒してるんです、keepだけ残して。
もう本気で意味不明でごわります。

リモートリポジトリからcloneしなおして、再度commit, pushを行っても同様の結果ですし、サーバ側のgitのバージョンは1.8、PC側が2.13ということで、バージョンの違いではないかと考えてサーバ側からpcをmountしてpushしても同様に怒られるし、ほとほと困じ果てました。
ふとコミットを一度取り消し、コミットメッセージを変更してコミットしてpushしたら。。。通りました。

いったいなんなんだ!!
それがしも大激怒です。

テスト用リポジトリを作成し、通らなかったときとまったく同じコミットメッセージをつけてコミットすると、今度は何事もなく通るじゃありませんか。
ますます意味不明です。

git fsckしても問題ないし、cloneはできるし、何がどうなってるのかさっぱりわかりません。

とても恥ずかしいことをしている気がするので、ここにご報告する次第です。

0 件のコメント:

コメントを投稿