Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

インストーラーパッケージ作成運用たたき台 #121

Closed
8 tasks done
KENCHjp opened this issue Jun 15, 2018 · 41 comments
Closed
8 tasks done

インストーラーパッケージ作成運用たたき台 #121

KENCHjp opened this issue Jun 15, 2018 · 41 comments
Labels
CI appveyor など CI 関連 【ChangeLog除外】 installer installer 関連 management 運営に関する話題 【ChangeLog除外】 x64 x64 対応
Milestone

Comments

@KENCHjp
Copy link
Member

KENCHjp commented Jun 15, 2018

とりあえずたたき台を作成。思いつくまま書いてしまったので多々突っ込みよろしくお願いします。

■インストーラーパッケージ作成運用手順(理想)
 1)コミッターのリクエストを受けリリース用Issue作成
 2)バージョン番号の決定
 3)ダイナミックコンテンツ選定(exe,dll,ヘルプ)
 4)スタティックコンテンツの追加、変更選定(キーワードファイル他)、リリースノート更新。
 5)リリースパッケージ用ブランチ作成しPR
  →ブランチは作成せず、masterに直接コミット?
 6)問題なければメインへコミットしインストーラー生成(Appveyor自動)
  →タグ付を契機にAppveyorにてインストーラー生成。
 7)インストーラー動作確認(ローカルにインストール・アンインストール素振り実施?)
 8)必要・可能ならリリースモジュールのダウンリードサイトへの自動反映(?必要)
 9)関連ドキュメントWebサイト等の自動修正

■インストーラーパッケージ作成運用手順(暫定手動)
 理想形の1)~5)まで同じ、6)のインストーラー作成をローカルで実施してコミット
 8)、9)を手動で実施。

■現状課題メモ

  •  1)Inatallerの一部ファイルがリポジトリ上zipで圧縮されている。
      zipを展開する。 ライセンスの話 #41
      各バイナリ(exe,dll,ヘルプ)もチェックインする?
      このプロジェクトで生成するバイナリはチェックインせず、インストーラ作成時にダイナミックに取り込む?
      外部DLLファイルはチェックインしておく。 外部モジュール(bregonig.dll とか)の管理方法を検討する #81
  •  2)カラーファイル他もkeywordフォルダに入ってる。
       フォルダ名を適切なものにしたほうがいいか?
       フォルダ名を変えた場合上書きインストールでファイル重複してしまう。
  •  3)DLL,ライセンスファイル、ヘルプが一ファイルずつ定義されている
      フォルダにいれてワイルドカードで取り込むと今後増えたときにメンテが楽、漏れがなくなる。
      DLLの場合フォルダが変わる場合にプログラムで呼び出せなくなる?
  •  4)64bit用インストーラー作成
      ・installとは別リポジトリにするか、同じリポジトリで管理するか。
       リポジトリを分けた場合、双方同じリソースを二重メンテにならない工夫が必要。
       一つのリポジトリで管理する場合、同じファイル名で32bitと64bitで変わるDLL等がある場合別のフォルダに入れるなど一考要。外部モジュール(bregonig.dll とか)の管理方法を検討する #81
       例)リポジトリ上は
        installer
         resource32
          ***.dll
          ***.txt
         resource64
          ***.dll
          ***.txt
        としておき、インストール時にファイルをインストール先直下に展開されるようにする。
       ファイル名にかぶりが無いのであれば本件不要クローズ。
  •  5)ファイル追加
       licenseファイル bregonig.dll に perl_license.txt と perl_license_jp.txt を同梱する #66
       他keyword
  •  6)Windows10メニュー対応 [改善要望] Windows 10 のスタートメニューに対応してほしい #104
  •  7)インストーラーの他にzip圧縮されたファイル(exe単体、バイナリ全部、キーワードファイルも含めた全部)も自動生成する
  •  8)exeファイルよりバージョン番号を取得してインストーラー他のバージョン番号が記載されているところを一括修正する仕組みを検討

Pascal使えると言った手前、課題の6)から手を付けようかなと。
リポジトリいじるのはフォルダ構成の方向性固まったら実施かなと思います。
64Bit版リリースの時に(暫定手動)運用発動するのがひとまず目標ですかね。

@m-tmatma
Copy link
Member

バージョン番号がソースとか インストーラ用の設定ファイルとか
分散しているので一括で更新できるスクリプト等の仕組みが欲しいですね

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 15, 2018

@m-tmatma さん、私の拙作ソフトでは、VBS(GetFileVersion)でexeからバージョン番号取得してインストーラーの定義ファイル更新と圧縮するzipファイルのファイル名を修正してました。
手動ならvbs叩くだけなのですが、Appveyorで動くものやら。
これもタスクにいれときますかね。
一応、インストーラーほかのファイル名は、exeから取得できるバージョン番号にする方向であればですが。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 15, 2018

Appveyorで動くものやら。

そうか一度ローカルに持ってくるからそこで一発動かせばいいのかな。

@KENCHjp KENCHjp added x64 x64 対応 installer installer 関連 management 運営に関する話題 【ChangeLog除外】 CI appveyor など CI 関連 【ChangeLog除外】 labels Jun 16, 2018
@berryzplus
Copy link
Contributor

たたき台作成お疲れ様です。

なんとなく、リリース専用のブランチがあったらいいなと思っています。

  • appveyorのビルド設定はたくさん作れる
  • appveyorの設定はブランチを指定できる
  • appveyorの設定は設定ごとにappveyor.ymlの名前を指定できる
     → リリース用に appveyor_release.yml を用意して、git clone~ビルド~パッケージをさせる

こうしておけばリリースブランチに Push すると勝手にパッケージされますよね。
ビルド工程をまとめた yml を記述してあげれば、パスやらバージョンやらの扱いもしやすいはず。

一筋縄ではいかないような気もしますけど、できたらいいな (^-^;

@kobake
Copy link
Member

kobake commented Jun 16, 2018

うーん、リリースはタグ管理が良いんじゃないですかね。hotfix出す必要があるときだけブランチ切るくらいで良いかなと思ってます。

@berryzplus
Copy link
Contributor

release_2_3_3じゃなくて、releaseを切る感じで考えてました。
リリース番号のタグ管理には賛成です。
単にリリースイベントのトリガをとるためだけにブランチを分ける案を出してます。
もし他の方法で appveyor ビルドのトリガを行えるならブランチは作らなくてよいです。
(マニュアルちゃんと読めてないですが、他の方法のトリガもありそうです。)

ポイントは、トリガ発動したら git clone~ビルド~パッケージ作成が一連動作として走るようにできたらいいね、です。できるかどうかは、現段階で不明 😢

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 16, 2018

@kobake さん

リリースはタグ管理が良いんじゃないですかね。

ブランチ切らないということは、PRしないということ?
@berryzplus さんの書いた、Pushすると勝手にパッケージ作成を狙いたいなぁと思っているのですが、
その"手段"の技術的なところがまだよくわかっておりません。

手順としては、含めるものが決まった前提で、

1.リポジトリをチェックアウト、
2.含めるリソースを全部上書き+追加
3.ブランチ(release)へPush→appveyorがインストーラーパッケージ作成
4.動作確認して問題なければ、メインへマージ、ブランチは削除

appveyorの自動化が難しい場合、3.ではローカルで、インストーラーを生成して、どっかへアップロードって感じかなと。

@kobake
Copy link
Member

kobake commented Jun 16, 2018

基本的に PR は作りますが、あくまでも master へのマージ用 PR を想定しています。

master へのマージを確認した後、その最新状態の master をパッケージ化したい場合には git-tag 機能 によりタグを打って push という流れが良いかな、と。
タグ追加を自動検出してそれを元にパッケージ化ジョブを走らせることもできたはずです。自分ではやったことないんですけど。

現在リリース済みのパッケージ(これは手動アップロードです)はタグに紐づける形にしています。
https://github.com/sakura-editor/sakura/releases

Git のタグって Svn のタグとは違って枝分かれさせるものではなく、特定コミットにラベルを付けるような概念なんです。枝分かれが無い分、管理が楽です。

タグはこのあたり↓から見れます。
tag

@k-takata
Copy link
Member

タグをpushしたときにAppVeyorを走らせることも可能です。なので、タグの場合だけパッケージを作るということも可能です。
https://github.com/vim/vim-win32-installer はそのようにしています。

@k-takata
Copy link
Member

vim-win32-installer では、インストーラ作成用のリポジトリは vim 本体とは別にしてあり、本体は git の submodule で取り込んであります。メンバーの個人サーバー上で cron で1日1回 vim 本体のリポジトリの更新を監視して、更新があればインストーラも更新を行っています。
あるいは、AppVeyor に申請すれば自前でサーバーを用意しなくとも定期的にビルドを実行させることも可能です。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 16, 2018

@kobake さん、 @k-takata さん
リリース物をどこに置くんだろうと思ってましたら、
https://github.com/sakura-editor/sakura/releases
ここなんすね!
あと、tagを打ってマージってのも知らなかったので勉強になります。
で、PRってブランチ無くてもいけるんですね。
もうちょっと勉強します。

ただ全自動でビルドはないかなと思っております。
1日の終わりにどういう状態にしておかなければならないか相当統制のとれたDevチームじゃないと難しいのかなと。
それよりは、バージョン番号どうしよう、カラーファイルこれいれようかとか考えて、必要なものをpushしておき、おりゃってインストーラ作成するのかなと。

@kobake
Copy link
Member

kobake commented Jun 16, 2018

正式リリースのパッケージ内容・タイミングは人間の判断で良いと思います!(というかそれしか無い)

いろんなプロジェクトで目にする Nightly Build みたいなやつは、実行ファイル単体に限ってはもう既に組み込まれているという認識です。 https://ci.appveyor.com/project/sakuraeditor/sakura/branch/master これがそれにあたります。Nightly というよりは Latest ですね(むしろ Nightly よりもさらに迅速)。

あと、tagを打ってマージってのも知らなかったので勉強になります。
で、PRってブランチ無くてもいけるんですね。

tag の場合は PR 作る感じではないです。
既存の状態にラベルを付けるだけですね。
つまり、tag って「ファイル変更はしない(できない)」んです。

このあたりはホワイトボードとかで説明できればパパパっとすぐ説明できるんですが、テキストベースで伝えるの難しいw

まだ次リリースまで時間ありますし、このあたりはゆっくり習得していきましょう。
Git っていろいろ覚えること多いんですよね~

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 16, 2018

>まだ次リリースまで時間ありますし、このあたりはゆっくり習得していきましょう。

ですね。とりあえず目先の技術的課題と、iss他のバージョン情報を一括メンテするvbsでもこしらえます。

@k-takata
Copy link
Member

ちなみに今、とあるプロジェクトで考えているリリース方法はこんな感じです。

  • タグがプッシュされたら、自動でパッケージをGitHub releasesにアップロードされるように設定しておく。ただし、pre-release状態で公開されるように設定しておく。
  • 必要なPRをmasterにマージし終わって、リリースの準備ができたら、タグを付けてプッシュ。
  • GitHub releasesに上がったパッケージを確認し、問題がなければ、GitHub releasesにリリースノートを書き、pre-releaseをreleaseに変更して完了。

@kobake
Copy link
Member

kobake commented Jun 16, 2018

pre-release 方式良いですね!
サクラエディタもできることならそういう形で運用できると理想です。

@berryzplus
Copy link
Contributor

appveyorのトリガはまだちょっと気が早かったかな・・・。

やれそうな雰囲気がバシバシあるのは、すごくいい感じ 😄

@kobake
Copy link
Member

kobake commented Jun 16, 2018

できるところからゆっくりやっていきましょう。
既存実績があるのはとても心強いです❗️

@m-tmatma
Copy link
Member

#124 で技術的にインストーラを appveyor でビルドできるところまで確認しました。

@m-tmatma
Copy link
Member

#124 で技術的にインストーラを appveyor でビルドできるところまで確認しました。

英語用のリソースはまだ入れてませんが、簡単に追加可能だと思います。

@m-tmatma
Copy link
Member

英語用のリソースはまだ入れてませんが、簡単に追加可能だと思います。

a84fac8 で確認しました。

@m-tmatma
Copy link
Member

installとは別リポジトリにするか、同じリポジトリで管理するか。

iss ファイルだけを分けたらいけそうです。

@m-tmatma
Copy link
Member

exeファイルよりバージョン番号を取得してインストーラー他のバージョン番号が記載されているところを一括修正する仕組みを検討

exe より取得するよりは、スクリプト等で複数箇所に存在するバージョンを一括で
更新したらいいと思います。

こんな感じでスクリプトを実行したら必要な箇所をすべて書き換えるというやり方です。

update_version.py 2.4.0.0

必要に応じてバージョン番号の各桁を別のコマンド引数で渡してもいいです。
↓ こんな感じ

update_version.py 2 4 0 0

こうすれば例えば CI の中で、インストーラや EXE の末尾のバージョンに build 番号を
いれるみたいな運用も技術的には可能です。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

@m-tmatma お疲れ様です。仕事早い。
一応、サンプル置いてみました。 #128 (初PR、GitHubと格闘している時間の方がまだ長いwww)
「update_version.py 2 4 0 0」この案でも全然問題ないと思いますが、自動取得だとOpsチームの手数が一つ減るかなって思っただけです。オペミスが割り込む余地は減らしたい以外の意図はまったくありません。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

#67 にも書きましたが、innosetup-5.6.1-unicode.exe だと、issがエラーはいちゃたのでappveyor がバージョンアップしたらなにがしか対応が必要になるかも。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

Python ってappveyor でも動くのかしら、もし動くのなら、Version情報が決まったらそれ用のファイルにリリースVersion記載するか、exeから自動取得するか別にして「update_version.py」らしきものを動かせば、ローカルPC作業じゃなくてもいけるっすね。

@m-tmatma
Copy link
Member

「update_version.py 2 4 0 0」この案でも全然問題ないと思いますが、自動取得だとOpsチームの手数が一つ減るかなって思っただけです。オペミスが割り込む余地は減らしたい以外の意図はまったくありません。

EXE の中のバージョン番号自体複数箇所に存在していると思うので
それとインストーラのバージョンもまとめて更新してしまえば
バージョンの更新は一回で済むという意図です。

バージョン番号の更新自体はどうせ手動でしないといけないので
そのときにやってしまえます。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

なるほど、Devチーム責任でバージョン番号が影響するリソースを全部書き換え要って作戦ですね。
ならば、Opsチームは単にインストーラ作成を発動すればいいだけですね。

@m-tmatma
Copy link
Member

Python ってappveyor でも動くのかしら、

はい。過去に別件で使ったことがあります。

また好きなバージョンを選べます。
https://www.appveyor.com/docs/build-environment/#python

別に python でなくとも速く簡単に書ける言語であれば
他の言語、例えば C# でもいいと思います。

@m-tmatma
Copy link
Member

あとは、6)かぁ、やるかぁ(笑)

#124 で使ったブランチから分岐すればすぐに試せます。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

あれ、なんか書いたのが消えてるような・・・

あとは、6)かぁ、やるかぁ(笑)

これ書いたのが消えてる???

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

C#はコンパイル必要なのであんまりやりたくないですねぇ。
Pythonは超苦手www(まだ、node.jsの方が触れるT_T)
PowerShellはテキスト操作で文字コードでどはまりしたので、テキスト操作は、もっぱらJScriptかVBScriptだったりする軟弱もの。。。

@m-tmatma
Copy link
Member

C#はコンパイル必要なのであんまりやりたくないですねぇ。

そうですね。

Pythonは超苦手www(まだ、node.jsの方が触れるT_T)

最近急激に流行りだしているみたいですよ。
機械学習とかの影響かな。

私も最初心理的にハードルがありましたが、
なれたら便利ですよ。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

とりあえず、innosetup-5.5.9のGetWindowsVersionExをWin10で動かすとちゃんとメジャーバージョンに10って返ってくる\(^_^)/
古いInnoでインストーラー作ると、6って返ってくるので、おそらくmanifest組み込まれてるんじゃなかろうかと。
以下参考。
http://yamatyuu.net/computer/program/sdk/base/GetVersionEx/index.html

Windows10かどうか判断するfunction作ってIconsでCheck判定してショートカットをOn/Offするところまでは出来たのですが、スタートメニュー直下に作る指定ではまり中。。。
このままfunction以外ノンコーディングでいきたい。
まだ、Windows10(64Bit)とWindows7(32Bit)でしか動かしてないですが。
以上中間報告。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

それと、issはバージョン情報書き換え対象にしなくてもよさそうです。

#define MyAppVer GetFileVersion("sakura.exe")

でバージョン情報が取得できます。
で試してませんが、

#define MyAppVerH StringChange(MyAppVer, ".", "-")

とやると2.3.0.0を2-3-0-0に置き換えられそうです。
以下参考。
https://hibara.org/blog/2012/09/04/how-to-innosetup/

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

とりあえず、ショートカットは相対指定でできるの確認したので、これで一応一通り技術的なところはクリアできたような。
後は、PRかぁ、前のPRも役に立たないので取り消さないと、、、
GitHubと格闘する時間の方が相変わらず長いT_T

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

あ、あかん。
https://github.com/sakura-editor/sakura/releases
ここに自動でコンパイル結果反映できるんでしたっけ?

@m-tmatma
Copy link
Member

あ、あかん。
https://github.com/sakura-editor/sakura/releases
ここに自動でコンパイル結果反映できるんでしたっけ?

https://github.com/forexample/github-binary-release
にやり方の例があります。

できそうですよ。

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

@m-tmatma さん、了解です、ありがとうございます。
これで一通りネタはそろったかな。

@m-tmatma
Copy link
Member

Sandbox のリポジトリとかで練習してみたらいいと思います

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 17, 2018

とりあえず、個々の課題のおさらい。

1)Inatallerの一部ファイルがリポジトリ上zipで圧縮されている。 #41
 →ひとまずzipファイルとlicenseファイル等は取り込む。
  各バイナリはその時に、指定されたモジュールを取得してコミットする。
  外部DLLファイルはコミットしておく。 #81
2)カラーファイル他もkeywordフォルダに入ってる。
 →こちらはひとまずインパクトが大きいのでそのままにしたい。
3)DLL,ライセンスファイル、ヘルプが一ファイルずつ定義されている
 →こちらもひとまずそのままがいいかなと追っています。
  同一フォルダにビット違いのものを入れておいて各々issで切り替えたりできるかと。
4)64bit用インストーラー作成
 →こちらは、issを分けて出来そう。
5)ファイル追加
 →1)とほぼ同件 #66
6)Windows10メニュー対応 #104
 →できました。 #130
7)インストーラーの他にzip圧縮されたファイル(exe単体、バイナリ全部、キーワードファイルも含めた全部)も自動生成する
 →こちらもやり方は確認できたかなと。 #124 こちらでバッチファイル内で成果物まとめると行けそうですよね。
8)exeファイルよりバージョン番号を取得してインストーラー他のバージョン番号が記載されているところを一括修正する仕組みを検討
 →ことインストーラーに関してはInno Setupの機能で実現可能なことを確認できたので、いったんクローズ。 #130

@KENCHjp
Copy link
Member Author

KENCHjp commented Jun 29, 2018

インストーラーパッケージはAppveyorで自動作成されることが確認できたので、
一旦本Issueはクローズして、作成されたインストーラーをどうやって、
releaseするかで別Issueを作成したいと思います。

@KENCHjp KENCHjp closed this as completed Jun 29, 2018
@m-tmatma m-tmatma added this to the next release milestone Jul 8, 2018
@ds14050 ds14050 added x64 x64 対応 installer installer 関連 management 運営に関する話題 【ChangeLog除外】 CI appveyor など CI 関連 【ChangeLog除外】 labels Sep 18, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CI appveyor など CI 関連 【ChangeLog除外】 installer installer 関連 management 運営に関する話題 【ChangeLog除外】 x64 x64 対応
Projects
None yet
Development

No branches or pull requests

6 participants