いちいちサイトから作成するのが面倒。楽できないか模索してみた。
対象環境
- Windows XP Pro SP3 32bit
概要
以前、GitHubにアップロードしてみた - やってみるでGitHubのアップロードをした。バッチファイルまで書いて自動化した。
しかし、リモート・リポジトリの作成は手動である。 今まではリモート・リポジトリをGitHubサイトで手動で作成してからバッチを実行していた。
今回は、リモート・リポジトリの作成を自動化しい。
まずはコンソールから作成する方法を探した。
GitHub API
以前、成果物まとめ一覧ページを自動作成したい - やってみるでcURLをもちいてWebAPIを実行した。
リモート・リポジトリを作成するAPIもある。こいつを使う。
必要なもの
事前準備
実行環境
- msys
- msys.bat(sh.exe)
- mingw-get.exe
- cURL
- nkf
msysはmingw-get.exeで取得した5.3.0を使う。
cURLは、以前ブログで言及した「どこで入手したか忘れたcURL.exe」を使った。バージョンは以下の通り。
C:\root\tool\System>curl --version
curl 7.24.0 (i386-pc-win32) libcurl/7.24.0 OpenSSL/0.9.8t zlib/1.2.5 libidn/1.18
libssh2/1.3.0 librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtmp
rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN Largefile NTLM SPNEGO SSL SSPI libz
今回のコマンドはなぜかcmd.exeで実行するとエラーになった。msys(sh.exe)で呼び出すと実行できた。 おそらく、MinGW/msysでコンパイルされたcURL.exeなのだろう。
そこで、cURL.exeの処理はシェルスクリプト(.sh)で呼び出すことにする。 しかし、.shはダブルクリックで実行できない。 そこで、バッチファイル(.bat)から.shを呼び出すことにする。
面倒になってゆく
たかがGitHubのWebAPIを使いたいだけなのに、私の環境では大仰になってしまう。
- ローカル
- GitHubサーバ
これだけのシステムが関わる。cmd.exe, sh.exeの2つを使わねばならないから、WindowsとUnixのコンソール環境を学習せねばならなくなる。ただでさえ、curl.exe, GitHubAPIについても学習せねばならないのに。
.batと.shの構文を学習するところが、とても苦労した。
コマンド
キモとなるのはリポジトリを生成するGitHubAPI。Basic認証し、JSON引数をPOSTする。 それをcurlコマンドでやると以下のとおり。
curl --cacert "C:\Program Files\Git\ssl\certs\cacert.pem" -u 'GithubUsername:GithubPassword' https://api.github.com/user/repos -d '{"name":"repo_name", "description":"this is repository description.", "homepage":"https://www.google.co.jp"}'
msys(sh.exe)上で実行すること。cmd.exe(MS-DOS/コマンドプロンプト)上ではエラーになってしまう。
いくつか変数にしてみたのが以下のコマンド。REPO_NAME=MyRepo
のように変数を設定してやると動作する。
curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}'
しかし、上記のコードはdescriptionに日本語を使うとエラーになってしまう。 文字コード問題である。 コンソールはCP932(Shift-JIS)だが、GitHubAPIはUTF-8で処理するためである。 そこで、nkf.exeにてCP932(Shift-JIS)からUTF-8に変換して送信するようにしたのが以下のコマンド。
echo '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}' | nkf -w | curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d @-
成功するとJSONレスポンスが返ってくる。GitHubAPIの応答もUTF-8。しかしコンソールがCP932(Shift-JIS)なので文字化けする。そこで応答をCP932(Shift-JIS)に変換したのが以下のコード。
echo '{"name":"'${REPO_NAME}'","description":"'${REPO_DESC}'","homepage":"'${REPO_HOME}'"}' | nkf -w | curl --cacert "${CURL_PEM}" -u "${GITHUB_USER}:${GITHUB_PASS}" https://api.github.com/user/repos -d @- | nkf -s
所感
これで少しは楽ができそうな目処が立った。 次はバッチファイル化したい。