AppVeyor はWindows環境を使えるCI/CDサービスです。 (今はLinux環境も使えますが。)
ちょっと使う機会があったので、 Windows用のアプリとかをGitHubでコード管理して そのビルドしたものをGitHubのリリース領域に追加する、ということについてのメモ。
AppVeyor
AppVeyorは Windows環境を使えるCI/CDサービスで、 Windows環境を使えるものがあまりないのでWindows用としてはよく使われているサービスだと思います。
勿論GitHubとも連携でき、登録などはTravis CIなどと似た感じ。
とりあえずGitHubのアカウントで登録してGitHubと連携して レポジトリを読み込めばレポジトリ毎にAppVeyorに登録出来ます。
テストレポジトリ
今回作ったのはこれ。
.appveyor.ymlというのはAppVeyor用の設定ファイルですが、 それ以外はbat/build.batというファイルがあって、これが build/test.txtというファイルを作成するだけのものです。
このbuild.batをAppVeyorでコミットのたびに実行するようにします。 また、タグが作られたときだけそのタグを元にリリースとして作成し そのリリースに作成されたtest.txtを添付する、というのが目的。
一応出来たtest.txtの中身をチェックするテストを tests/test.batとして入れています。
実際には何かアプリ的なxxx.exeとかを作ってそれをテストしてGithubに貼り付ける感じです。
プロジェクト作成
GitHub側のAppVeyor設定で Repository accessをAll repositoriesにしておけば AppVeyor側のNew Project ページですべてのレポジトリが見える様になります。
もしくは特定のレポジトリだけをAppVeyorから見える様にすることもできます。
ここで連携したいレポジトリを選択してAppVeyor側にプロジェクトを作っておきます。
プロジェクトページのSettingsから色々と設定することが出来ますが、 今回必要なのはGitHubにファイルをアップロードするために必要なアクセストークンの登録だけです。
アクセストークンの登録
GitHub側でSettingsDeveloper settings Personal access tokensに行って New personal access token します。
必要最低限としてはrepoの中のrepo_deploymentだけですが、 commitとかもするとしたらrepo全体をチェックして作成します。
ここで取得したアクセストークンを AppVeyorに戻って使いたいプロジェクトの SettingsEnvironmentに行って Environment Variablesの欄でAdd variableします。
nameは適当にgithub_access
とかにしてvalueの欄に取得したトークンを入れます。
この際、該当の入力欄にフォーカスがあたっていると右側に鍵マークが出るので、 それを押すことで環境変数を暗号化することが出来ます。
今回のトークンの様なものは暗号化しておきます。
暗号化した値はPull Requestとかからは使えない様になります。
のSecure variablesの欄をみると古いのか、ちょっと仕様が違っていて、
今のSettingsでは暗号化すると
appveyor.ymlの中でenvironment
として設定しなくても
直接登録時に指定した名前で使えます。
(そのためのnameの登録だと思うので多分ドキュメントが古い。)
これでAppVeyor側の設定が出来たのでレポジトリ側に設定ファイルを作成します。
appveyor.yml
設定ファイルはレポジトリトップにappveryor.ymlか.appveyor.ymlという名前で置きます。
もしくはAppVeyorの該当プロジェクトでSettingsGeneralにある Custom configuration .yml file nameで名前を指定して使います。
今回の内容はこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
最初のversion
はGitHubのタグとかとは直接関係なくAppVeyor側の管理ようです。
これだとビルドが行われるたびに0.1.1、0.1.2、0.1.3とビルド番号がつくようになります。
artifacts
はビルドしてアウトプットにしたいものを指定します。
今回はtest.text。name
は指定しなくても良いですが、
後でGitHubに送ったりする時にname
を正規表現で指定して送ることも出来るので
複数ファイルをまとめて送る際には設定しておくと便利です。
build_script
はビルド用コマンド。今回はbuild.batを実行するだけ。
これ以外にもbefore_build
/after_build
なども設定できます。
その後でテストをします。
test_script
で
test.batを実行していますが、これは単にtest.txtの中身がbuild.batで作ったものかどうか(単にtest fileという内容)チェックするだけ。
最後にdeploy
。
provider
: ファイルを送る先- GitHub ReleasesにdeployしたいのでGitHubを指定。
- それ以外にもAWSやAzure、もしくは単にFTPサーバーなども指定できます。(Deployment AppVeyor)
- 以下の設定はdeploy先によって変わるものもあります。
release
: リリース名- ここでは
APPVEYOR_REPO_TAG_NAME
というAppVeyorによって予め設定される値を使っています。 - AppVeyorの設定ファイルの中で変数を値として使う場合には
$()
で表現します。 APPVEYOR_REPO_TAG_NAME
はビルドのトリガーがタグだった場合にそのタグ名が入ります。(Environment variables AppVeyor)- タグでない場合にはundefinedになります。
- 今回はタグの場合だけリリースを作るのでタグの名前でリリースを作る様にしています。
- ここでは
description
: リリースの説明- 指定しないとエラーになりますが、
''
を指定するとタグを作る時に付けた説明がリリースの説明にも使われます。
- 指定しないとエラーになりますが、
auth_token
: GitHubへのアクセストークン- 上で登録したアクセストークンの名前を指定します。
artifact
: deployするオブジェクト- GitHub Releasesに送りたいファイルの指定。
,
で分けて複数指定可能。また/.*file/
みたいな感じで正規表現を使って複数をまとめて送ることも出来ます。
draft
: リリースをドラフト状態にするかどうかprelelease
: リリースをプレリリース状態にするかどうかon
:deploy
を実行する条件APPVEYOR_REPO_TAG
もAppVeyorによって設定される値でタグがトリガーだとtrue
になります。- 条件のところで使う場合には
$()
は使いません。
です。
これでレポジトリにpushすればビルドとテストが走ります。
タグを作って送るとさらにそのタグからリリースを作ってtest.txtをそのリリースに送ってくれます。
実際にやったもの
ここにv0.0.1のリリースがありますが、Soruce codeのzip/tar.gzファイルに加えてtest.txtが付いています。 AppVeyorで作られて送られてきたものです。
GitHub Actions
GitHub ActionsでもWindows環境が使える様なので、 こういったGitHubに追加する様なものはGitHub Actionsでやった方が楽です。
Appveyorからファイルを追加したい場合にはGitHubのアクセストークンを 作ってそれをAppveyorに登録しないといけませんが、 GitHub Actionsであれば特にその様なことをしなくても中で処理してくれます。
多分AppVeyroでやったことと同じ様なことが出来るんじゃないかな、と思うのでそのうち試して見るかも。
vim_ahk
今回これを採用したのはvim_ahkです。
だいぶ前にPull Requestをもらってたんですが、ちょっと設定ファイルとかがそのままだと動かなくて、 面倒だったので手が付けられてませんでした。
とは言え実際ちゃんと自分で説明書読んでやってみたら上に書いたような感じで簡単に出来ることだったんですが。
ちょっとWindows上でGUIを使ったテストが上手く行かない状態で、それも合わさってビルド自体も上手く行かないと思ってたところが悪いところでした。
まとめ
AppVeyorを使ってWindows用のアプリをビルドとかしてGitHubのリリースに送ることが出来る様になりました。
とはいえ、恐らくGitHub Actionsでも同じ様なことが出来るはずなので 出来るならそっちのが良いかな、とは思います。
あと、AppVeyorで上手く行かないテストも上手いことできると良いのですが。