OSDN を AppVeyor と連携させて CI を実行する

先日、[Bitbucket が Mercurial 対応をやめることが発表](https://bitbucket.org/blog/sunsetting-mercurial-support-in-bitbucket)されました。2020年 6月以降は Bitbucket で Mercurial リポジトリを使うことができなくなります。

Git とは違い、Mercurial に対応したソースコードホスティングサービスはあまり多くありません。今回は [OSDN](https://osdn.net/) を移行先として選択しました。

移行に当たり、AppVeyor との連携で少々手こずったので、手順を備忘録として残しておきます。


## 2種類のリポジトリ

OSDN には 2種類のリポジトリがあります。

1. プロジェクト  
   主に複数人での開発を想定したもの。作成するには OSDN への申請が必要。
2. 作業部屋 (Chamber)  
   その名の通り、個人の作業用リポジトリ。自由に作成することができる。

今回は、個人用の小規模なリポジトリだったため、作業部屋を使うことにしました。


## SSH 公開鍵の登録（まだやっていなければ）

OSDN にログインし、画面右上の「(自分のユーザー名)」→「ユーザ設定」をクリックします。
「SSH公開鍵管理ページへ」をクリックします。
「+新しいSSH公開鍵を追加」をクリックすると、ウィンドウが開くので、公開鍵をペーストして「追加」ボタンを押します。

GitHub に登録している公開鍵をインポートすることもできますが、鍵のコメントはインポートされないようなので注意してください。


## 作業部屋の作成

OSDN にログインし、「作業部屋」→「一覧/追加/削除」をクリックします。
「+作業部屋を作成」→「作業部屋を新規作成」をクリックします。

「作業部屋を作成」ウィンドウが表示されるので、「種類」は「Hg (Mercurial)」を選択し、「名前」にリポジトリ名を入力します。必要に応じて「表示名」と「説明」を入力し、「作成」ボタンを押すと、作業部屋が作成されます。（「表示名」と「説明」は後からでも変更可能です。）


## リポジトリのクローン

今回は、以下の Bitbucket のリポジトリを、

<https://bitbucket.org/k_takata/vim-ktakata-mq/>

以下の OSDN の作業部屋にクローンすることにします。

<https://osdn.net/users/k_takata/pf/vim-ktakata-mq/wiki/FrontPage>

ローカルリポジトリの `.hg/hgrc` を開くと、以下のような記述があります。

```
[paths]
default = ssh://hg@bitbucket.org/k_takata/vim-ktakata-mq
```

ここに、OSDN のリポジトリの R/W (SSH) URL を追記し、以下のようにします。

```
[paths]
default = ssh://hg@bitbucket.org/k_takata/vim-ktakata-mq
osdn = ssh://k_takata@hg.pf.osdn.net//hgroot/k/k_/k_takata/vim-ktakata-mq
```

これで、`hg push osdn` を実行すると OSDN のリポジトリにプッシュすることができます。

OSDN に完全移行する際には、`default` の URL を OSDN の URL に書き換えてください。


## AppVeyor プロジェクトの作成

AppVeyor にログインし、画面上部の「Project」をクリックします。
「+ NEW PROJECT」をクリックします。
画面左側の Generic の下の「Mercurial」をクリックします。

Clone URL に、OSDN のリポジトリの R/O URL を入力します。今回の場合は <http://hg.pf.osdn.net/view/k/k_/k_takata/vim-ktakata-mq> です。
Authentication は「None (public repository)」を選択し、「Add Mercurial repository」をクリックします。


## Web フックの登録

OSDN に何かをコミットしたら、AppVeyor が実行されるようにするためには、Web フックを登録する必要があります。

AppVeyor の今回作成したプロジェクトの設定画面を開きます。
「General」ページに「Webhook URL」というものが書かれていますので、これをコピーします。

OSDN の今回作成した作業部屋のページを開きます。
「ソースコード」→「フックの設定」をクリックします。
「+ Web フックの追加」をクリックします。ウィンドウが開くので、先ほどコピーした URL をペーストし、「追加」をクリックします。


## appveyor.yml の URL の登録

AppVeyor は、CI の設定を appveyor.yml に記述することができますが、appveyor.yml は、リポジトリをクローンする前に個別に取得できるようになっている必要があります。Bitbucket 上のリポジトリであれば AppVeyor が対応しているため、API を使って appveyor.yml のみを取得することができるのですが、OSDN には対応していないため、appveyor.yml の URL を明示的に設定する必要があります。

AppVeyor の今回作成したプロジェクトの設定画面を開きます。
「General」ページに「Custom configuration .yml file name」という設定がありますので、ここに、OSDN のリポジトリの appveyor.yml を直接ダウンロードできる URL をセットします。

URL を調べるには、OSDN の作業部屋のページから、「ソースコード」→「ソースツリー」をクリックします。
「appveyor.yml」を開き、「元形式でダウンロード」のリンク先 URL をコピーします。
今回は <https://osdn.net/users/k_takata/pf/vim-ktakata-mq/scm/blobs/tip/appveyor.yml?export=raw> となります。

AppVeyor の上記設定にこの URL をペーストし、「Save」をクリックして設定を保存します。

[tip](https://www.mercurial-scm.org/wiki/JapaneseFAQ#JapaneseFAQ.2FTerminology.branches.2BMAE-heads.2BMAE-tip_.2BMGgwb09V.2Fx8-) の appveyor.yml を指定しているため、tip 以外の appveyor.yml は読まれない点に注意が必要です。


## まとめ

Web フックと、appveyor.yml の URL を設定することで、OSDN と AppVeyor を連携させて CI を実行できるようになりました。もちろん、AppVeyor ならば Windows でも Linux でも CI を実行することができます。


## 補足: なぜ Git に移行しなかったのか

今回 OSDN に移行したリポジトリは、[Mercurial Queues (MQ)](https://www.mercurial-scm.org/wiki/JapaneseMqExtension) を使ったパッチ管理用リポジトリでした。Git にも MQ に似た guilt というパッチ管理ツールがありますが、Windows での動作が極めて遅いという問題があります。また、StGit というツールもありますが、これはパッチファイルを公開リポジトリ上で管理するのには向いていません。このため、結局 Mercurial を使い続けることにしました。