GitHub Actionsでpkgを使ったNode.js実行バイナリをWindowsを含めてmatrixビルドする

目的

pkgでNode.jsスクリプトを実行バイナリにする - あーありがち(2019-10-04) において、各プラットフォーム上で pkg を叩けば Node.js スクリプトを Windows, macOS, Linux それぞれで動く単体のバイナリにできることは分かった。

今日はこの pkg を使って各 platform 上で build する処理を GitHub Actions で自動化してみたときのメモ。これが完成すれば基本的には Windows 上のちょっとしたツールを、いつもの macOS で、いつもの JavaScript で書いて git push すればオッケーと言える。便利。

※ 現時点では公開できる完成リポジトリはないので、日本語だけ。

対象

CircleCI など YAML で CI の設定をした経験のある人向け。細かい説明は一切しません。

参考

GitHub ActionsでElectronアプリのクロスプラットフォームバイナリを配布する | Web Scratch

メモ

About GitHub Actions - GitHub Help

matrixビルド

複数の環境を指定していくつもビルドを実行することをmatrixビルドと呼ぶらしい。これは GitHub Actions 独特のものではない。

  • strategy で matrix を指定したうえで runs-on は ${{ matrix.os }} で
  • pkg の target にはこの matrix.os をそのまま使うことはできないので、「matrix.os を加工する action」を加える必要がある

環境の課題

  • step の run に複数行与える書き方は Windows 標準の shell の cmd では正しく動かない1
  • run の中の文字列は shell の世界。bash だったり cmd だったりするので env の展開方法はそれぞれ異なる
  • うっかり yarn <command> と書くと Windows では動かない。しっかり yarn run <command> と書く。

YAMLの中の条件判別などのSyntax大事

Contexts and expression syntax for GitHub Actions - GitHub Help

何が大事って、この部分は shell でも JavaScript でもない独自の文法の世界ってこと。リファレンス見ないと分からないし、オフラインの linter などもまず存在しない世界。

Actionの書き方

  • uses で action を利用する際の書き方は二種類。GitHub上のactionとそのバージョンの指定か、同一repos内のディレクトリのいずれか。外部のリポジトリを指す場合はバージョンを明記しろと言われるが、ローカルのファイルの場合はむしろ書いたらダメ。
    • <owner/repos@version>
    • ./.github/actions/<name>
  • uses で action を利用する場合、inputs / outputs ともに決められた方法でやりとりする
  • action を JavaScript で書く場合、npm install は実行されないので node_modules も含める。Linux / macOS ではなんとなく動く場合もあるけど、Windows だとちゃんとエラーになる。

..github/ ディレクトリの中に直接 action を置いてしまってもよいが、uses の書き方がやや異なるので注意が必要。

共通で使いそうなものは独立させて Creating a JavaScript action - GitHub Help に書いてある通り zeit/ncc を使って node_modules 込みでパッケージにしてしまった方がテストもしやすい(入出力は環境変数っぽい)のでよさそう。

※ 急に zeit さんと親しくなってしまった。

役に立つAction

release にできあがった file を upload する方法に go binary を使っている記事も見かけたけど、action があるのでそっちを使う方が手軽でよさげ。

matrix buildしてるYAMLの例の一部

outputs の読み取り方が結構独特。

run-on: ${{ matrix.os }}

strategy:
  matrix:
    os: [macos-latest, windows-latest, ubuntu-latest]

steps:
  - uses: <owner/repos@version>
    id: <action>
    with:
      os: ${{ matrix.os }}
  - name: package executable
    env:
      <NAME>: ${{ steps.<action>.outputs.<name> }}
    run: command $<NAME>
    if: matrix.os == 'windows-latest'
  - name: package executable
    env:
      <NAME>: ${{ steps.<action>.outputs.<name> }}
    run: command %<NAME>%
    if: matrix.os != 'windows-latest'

ここで env, if の部分は完全に GitHub Actions 独自の Syntax で、if の部分は ${{ }} で囲まなくてもよい。ただし、参照できるオブジェクトは決まっている。

run の中身は shell で実行されるので、shell に応じて環境変数の展開方法などを変える必要がある。

  1. 少なくとも 2019-10-05 時点で 

むしろ最近 svn list を使う

最近、以前より svn list を使う。というのも

  • git (自分用) + svn (共通)の二重管理
  • git-svn を使ってない

git-svn を使わないのは

  • svn のファイル全部を相手にしたくない

から。(あと、なんか妙に面倒そうだから。)

svn up しないと古いまま

ということで git ls-files と svn list とか、細々チェックしながら作業してるんだけど、add や remove を commit したあとの svn list が古いことに気づいた。

どうも svn commit するだけではなく、svn update して .svn/ の中身を新しくしないといけないらしい。なるほどな。

ディレクトリを除外

svn list を使って一部のファイルを操作する際、ディレクトリ名がそのまま出てきて具合悪い場合がある。そんなときは

svn list | awk '!/\/[^.]+$/'

みたいなことをやってパスの最後に拡張子が含まれていない場合はディレクトリと看做して除外、みたいなことをしている。

ただし、ドットなしファイル(README とか)を対象にしている場合はうまくいかない。

参考

以下を参考に git-svn を使ってみたけど、git の commit を svn の commit と同期しないという使い方は難しいっぽい。

auが知らん間にメールアドレスの仕様を戻したらしい

こういうのってまともなリリースが出ないので分かりにくいんだけど、2006年に au が1 docomo の悪態に追随するという形で、一部技術の分かる人の間で大きく話題になった携帯メールアドレスの RFC 違反は

2009年秋の段階で新規登録については解消

ということいいのかな?

当然従来からそのアドレス使ってる人はそのままだろうけど、

もうそんなん知らん。


半角英数字および「_」(アンダーバー)、「.」(ピリオド)、「-」(ハイフン)の記号にて、3字以上30字まで設定することができます。 ただし、「.」は「..」などのように連続で使用することや@マークの直前で使用することはできません。

メールアドレス変更 | お知らせ | NTTドコモ

「.」をアドレス内での連続使用や「.」をEメールネームの最初/最後に使用することはできません。また最初に数字の「0」を使用することもできません。

Eメールアドレス変更方法 | 迷惑Eメール防止方法 | au by KDDI

  1. たぶん MNP のため 

javascript.el のカスタマイズがやっと少し分かった

(autoload 'javascript-mode "javascript" "javascript-mode" t)

(add-hook 'javascript-mode-hook
          (function
           (lambda ()
;            (c-set-style "k&r")
             (setq tab-width 2)
             (setq javascript-indent-level 2)
             (setq javascript-basic-offset tab-width)
             )))

4 タブとか 8 タブはきらいなので 2 に。

ハマった点。

  • autoload の 2番目の javascript がファイル名に当たることが分からず四苦八苦
  • そこかしこで setq js-indent-level 4 なんて記述が紹介されているが、それじゃ効かない
    • バージョンによって違うのか?
  • style の設定がまさか c-set-style でそのまま動くとは思わなかった
    • ver 2 beta にしたら動かなかった。てゆーかなくても K&R スタイルっぽいのでこのまま行ってみよう。

間違っている可能性大だけど、望んだ動き1 にはなっているのでとりあえずこんなもんで。 emacs-lisp で自分の望む変数や関数がどこにどんな名前で存在しているのか調べる方法が分からないから、いつもいつもすごい遠回りをしている気がする。

そのたびにソースをそのまま読んでいるので少しは lisp に慣れてきているはずなのに、全然上達してこないのはやっぱセンスないんだろか。

cf. Karl Landstrm's Pages

ver.2 beta になってた。

  1. 手元の環境でエラーが出ずにインデントのレベルやスタイルが思った通りってこと。 

最近リファラがまったく残らなくなった

※ 原因判明。tDiary 用 spamフィルタの正規表現で半角英数記号のみのアクセスを弾くようにしていたのが原因でした。自分でリンクを踏んでみてやっと気づいた。記号を含めたら urlencode 済み文字列が全部引っかかるじゃん。

でも spam フィルタの設定画面もまずいね、こりゃ。ツッコミだけでなく referer も含めて弾かれちゃうことがこの画面からは分からないもの。

と言い訳。

で、フィルタ解除したら早速 comment spam だな。どーしたもんかね、これ。ascii のみのツッコミを弾くっていうのはこの設定画面からは不可能なんだな。


ここのところ、リファラがまったく表示されなくなった。なんか設定ミスったのかなぁ? カウンタとか付けてないし、アクセス解析もしてないので、リファラが消えると何が起きているのかさっぱり分からない。リファラを見て、ははぁ、こういう話題があるのか、と知ることもある1し、なんにもないのはさすがに寂しい。2

過去の日記へのリファラだから消えてなくなるとか言うんじゃなくて最初からなんにも表示されない。過去の日記の分は「当日でなくなったら消える」はずだから、最初からまったく表示されないっていうのは、何かのミスでなければ検索でたまたま引っかかってくる人すらゼロになったということか? さすがにちょっとそれは変だなぁ。

いじったところと言えば半角英数記号のみのツッコミを弾くっていう設定くらいか。その設定が referer にまで影響するなんてこたぁないだろうし。([追記] バッチリ影響してました。)

なーんだろ。

[追記]アクセス解析してた。解析のサービスを有効にしてたのをすっかり忘れてた。一ヶ月単位の集計結果を見るとなかなか面白い。user agent なんかは上位のほとんどが検索エンジンで、ついで feed 取得系のロボット。feedpath, google, bloglines, plagger, sharpreader, 1470.net 辺りが上の方にいる。Hatena Antena, Hatena RSS はその下くらい。livedoor はあんまりいない。

一昔前だと IE より Mozilla 系の方がアクセスが多いうちのサイトはやっぱ技術寄りかなぁみたいなことを思うところなんだろうけど、最近のブラウザの ua がどんなんだかもうよく分かっていない自分がいましたよorz 上位にいきなり食い込んでる IE とおぼしき ua は当然詐称だろと思っちゃうしね。

ところでこの解析、file と page に分かれてるけど、.rdf は…やっぱ page には入らないんだよな。feed と page とその他、で集計できると便利かも。でも feed の url って限定できないしなぁ。CMS でない場合はもうよく分からんということか。

  1. 例えばある人のブックマークのリファラをたどってみて、その人の興味の対象が自分と近いうえに自分が見逃している話題が拾われている、なんていうのはいちばん嬉しい効果。 

  2. そうか、そうだったのか。コメントがなくても寂しくはないが、アクセスの記録が分からなくなると寂しいのか。コメントがあると嬉しいっていうのと根本的にはおんなじだなぁ。 

VNCViewer on Tiger でトラブル

原因がよく分からないんだけど(自分が使っていたんじゃないし)、Tiger で動かしていた VNC Viewer 2.01 がとある VNC サーバに繋がらなくなった。Panther 上の同じアプリからは接続できるし、Windows からも接続できるので、これは Tiger と VNC Viewer の組み合わせだろうと容易に想像がついた。

以前は VNCThing, VNCDimension なども試したのだが、今はこれらは行方不明な感じ。osxvnc はこれはライセンスが変わったのかな? うーん、と思っていたら Chicken of the VNC なんてものを発見1。これは新しくてよさげ。試してもらったら問題なく使えたのでとりあえずコレにスイッチしてもらうことに。

最近の何かのアップデートで地雷踏んだのかな? VNC Viewer は全然更新されてないし、そろそろお役御免てところだろうか。Chicken of the VNC は接続に関する設定があまりに少ないので、その辺がもう少し強化されると嬉しいな。

  1. 発見した気になっていたが、ローカルのファイルサーバには2004年の段階で存在しているorz ここに入れるのは自分しかいない。 

ふっかーつ

とりあえずまっさらの Safari から。文字でか。

ひどいめにあった。もうこれバラすのやだ。やっぱ ThinkPad に戻るかなぁ。

あ。ドットファイルコピーすんの忘れてた。またその辺からかき集めなきゃ。あー。local の wiki も忘れてた。これはまぁ最近使わないようにしてたから別にいいか。あんまり痛手はないに違いない。

しかしやっぱちゃんとどっかに資料残しておかないと何が何やら全然分かんないな。自分の機械の扱いがいちばんてきとーだ。

iPod の中に違法コピー音楽

S・バルマー:「iPodのなかには違法コピーがいっぱい」 (CNET Japan)

いやみのつもりなのか。その違法コピーの流通とコピー音楽を iPod に収めるために最も使われている OS は Windows だろうに。

Fink より pkgsrc の方がいいかもなー。

Gentoo はまだこれからだし。Fink も思ったより増えないし。

http://www.pkgsrc.org/

Interix にも対応してるから、SFU でも同じ要領で使える。Windows の本気サーバは cygwin より Interix かなぁとちらっと思うので、ノウハウが流用できるのは嬉しい。(それが果たして Windows サーバなのかと問われると難しい問題ですが :-P)

世界的にも NetBSD および pkgsrc コミュニティがそんなに大きいとは思えないけど、x86互換 + Linux ばっかじゃ面白くないかんね。頑張れマイナー。

なんでいいと思ったかというと、Chasen も Namazu もあるから。Fink には両方ない。

あるある血液型SP 2

メモしながら見てましたが、何か?

今回は各血液型の男女1000人、計8000人に対するアンケート結果だそうで。

 良い   悪い
1O 男B 女1A 男B 女
2O 男A 女2B 男A 女
3A 男O 女3AB 男O 女
4A 男A 女4AB 男B 女
5O 男O 女5B 男AB 女
6B 男O 女   

追試で

  • 幼稚園児
  • 合コン

つーのはまぁありがちとして

の専門家に相性の良い組み合わせ、悪い組み合わせの会話中の脳の反応を見てもらっていたのがちょっと面白かった。あー本当に B は興味ないことには全然興味ないんだなと。

ただ個人的にはテレビや電話などの自分の意図しない光や音にはかなり反応して集中できなくなるので、ちょっと実験とは違うな。ラジオはまだマシだけど可能なら知ってる曲だけの方が(つまり CD など)助かる。

今度は同性の相性を

やってほしいな。まぁしかし上を見るとにかく B の血は相手を選びまくり(AB も同じこと)、O の血が潤滑油として最適、っつーことでそれ以上のデータは要らんか? つまるところ一般的に当てはまる相性なんてのはそんなもんだ。

どこだったかがやってた、スポーツ選手で優秀な成績を収めるのは O が多いが、大きなプレッシャーに強いのは B っつーのもあったな。柔道の谷、平泳ぎの北島が B だそうで。我が道を行きっぷりは確かに B かもなと思った次第。まープレッシャーの部分はかなり個性に影響される気がするけど、職人気質という言葉が大好きな自分はイチローが B という事実にニヤリとするのであった。あーあと山下達郎もやっぱりなって感じ。

そんな私は奔放なアイディアマンの B にあこがれる A です、と言われてみたい :-P

B の芸能人の「(A の気苦労に対して)そんなこと誰が頼んだの?」「どーだっていいじゃん、そんなこと」発言は笑ったな。そのちょっと前に自分が同じこと言ってた。

About

例によって個人のなんちゃらです

Recent Posts

Categories

Tool 日々 Web Biz Net Apple MS ことば News Unix howto Food PHP Movie Edu Community Book Security Text TV Perl Ruby Music Pdoc 生き方 RDoc ViewCVS CVS Rsync Disk Mail FreeBSD Cygwin PDF Photo Zebedee Debian OSX Comic Cron Sysadmin Font Analog iCal Sunbird DNS Linux Wiki Emacs Thunderbird Sitecopy Terminal Drawing tDiary AppleScript Life Money Omni PukiWiki Xen XREA Zsh Screen CASL Firefox Fink zsh haXe Ecmascript PATH_INFO SQLite PEAR Lighttpd FastCGI Subversion au prototype.js jsUnit Apache Trac Template Java Rhino Mochikit Feed Bloglines CSS del.icio.us SBS qwikWeb gettext Ajax JSDoc Rails HTML CHM EPWING NDTP EB IE CLI ck ThinkPad Toy WSH RFC readline rlwrap ImageMagick epeg Frenzy sysprep Ubuntu MeCab DTP ERD DBMS eclipse Eclipse Awk RD Diigo XAMPP RubyGems PHPDoc iCab DOM YAML Camino Geekmonkey w3m Scheme Gauche Lisp JSAN Google VMware DSL SLAX Safari Markdown Textile IRC Jabber Fastladder MacPorts LLSpirit CPAN Mozilla Twitter OpenFL Rswatch ITS NTP GUI Pragger Yapra XML Mobile Git Study JSON VirtualBox Samba Pear Growl Mercurial Rack Capistrano Rake Win RSS Mechanize Sitemaps Android JavaScript Python RTM OOo iPod Yahoo Unicode Github iTunes God SBM friendfeed Friendfeed HokuUn Sinatra TDD Test Project Evernote iPad Geohash Location Map Search Simplenote Image WebKit RSpec Phone CSV WiMAX USB Chrome RubyKaigi RubyKaigi2011 Space CoffeeScript Nokogiri Hpricot Rubygems jQuery Node GTD CI UX Design VCS Kanazawa.rb Kindle Amazon Agile Vagrant Chef Windows Composer Dotenv PaaS Itamae SaaS Docker Swagger Grape WebAPI Microservices OmniAuth HTTP 分析基盤 CDN Terraform IaaS HCL Webpack Vue.js BigQuery Middleman CMS AWS PNG Laravel Selenium OAuth OpenAPI GitHub UML GCP TypeScript SQL Hanami Document SVG AsciiDoc Pandoc DocBook Develop Jekyll macOS Node.js Vite Heroku Transformer AI Data Cloud Wasm