LoginSignup
0
0

More than 1 year has passed since last update.

【Github Actions】リリースタグでCrystal言語のツールをビルドし、Checkinstallで作成したdebをリリースページに追加する

Last updated at Posted at 2022-03-06

Crystal言語でコマンドラインツールを作りたいと考えている。

Crystal言語の使い方は人それぞれだが、Githubのトレンドを見ると、Webアプリケーションを作っている人が多い。Crsytal言語がRuby言語と深い繋がりを持っているためだろうか。RustはCargoのように便利なビルド兼パッケージマネージャーを用意しているが、Crystalにはない。Makefile を使うのが一般的である。

ソースからビルド。これはツールの配布の観点からみると制約が大きい。Crystal言語ユーザー以外にツールを配布することが難しくなる。Crystal言語は、PythonやPerlとは違い、予めインストールされていることが全く期待できない。Crystal言語のツールを使うためにCrystal言語をインストール。これはつらい。だからビルドしたバイナリを直接配布したい。

単純な方法として、deb での配布を試みる。

  • Github Actionsを使う
  • v0.0.0 など、リリース用のタグがプッシュされたときに発火する
  • deb は Checkinstll という古典的なツールでお手軽作成
  • リリースページにファイルを自動でアップロードする

name: build

on:
  push:
    tags:
      - "v*.*.*"

jobs:
  release:
    name: Release
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ 'ubuntu-20.04' ]
    steps:
      - uses: actions/checkout@v2
      - uses: crystal-lang/install-crystal@v1
      - run: sudo apt -qy install libhts-dev checkinstall
      - run: shards install --pkgname=bam-filter --version
      - run: make
      - run: sudo checkinstall --pkgname=bam-filter
                               --pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g")
                               --maintainer=2xijok@gmail.com
                               --requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev
                               --nodoc -y
      - uses: softprops/action-gh-release@v1
        with:
          files: "bam-filter*.deb"

普段ならいろいろリポジトリを見てお手本を探すのだが、Crystal言語のリポジトリは少ないので自分で書いてみた。

  • --pkgversion=$(echo ${{ github.ref }} | sed -e "s#refs/tags/v##g") は、タグからバージョンナンバーを抽出している。
  • --maintainer=2xijok@gmail.com みたいなのも、ちゃんと設定しておいた方が良い。
  • --requires=libhts-dev,libevent-dev,libgc-dev,libc6-dev 依存に関しては、Dockerで素のUbuntuとかに試しにインストールしてみて、足りなかったら ldd を見ながら追加するという感じにした。ちなみに、puts 0 をビルドして ldd すると、次のようになる。
	linux-vdso.so.1 (0x00007ffc683a7000)
	libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f181a706000)
	libevent-2.1.so.7 => /lib/x86_64-linux-gnu/libevent-2.1.so.7 (0x00007f181a6b0000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f181a696000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f181a46e000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f181a91f000)
	libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f181a469000)
  • 要するに、libgc, libgc, libc6 は、いつも確実に追加が必要になるやつだと思う。多分。

この記事は以上です。

決して完備された例だとは思わないけれども、誰かが記事を書いておかないと、知見が集まらないと思うので公開します。もっとこうすればいいんじゃない?と思った人はコメント欄で教えてください。プルリクエストも歓迎します。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0