くりにっき

フルスタックキュアエンジニアです

golangのバイナリを雑にクロスコンパイルしたかった

zatsu_monitorを作った時の副産物です

sue445.hatenablog.com

やりたかったこと

  • golangのクロスコンパイルを楽にやりたかった
  • ビルドしたバイナリはzipで圧縮しつつ、zipのファイル名にosやarchもつけたかった
    • 例)zatsu_monitor_unix_amd64.zip
    • バージョン名もつくとベスト
    • zipをそのままリポジトリreleases にアップロードしたかった
  • ただしバイナリにはosやarchは つけたくなかった
    • 例)zatsu_monitor
    • 好みの問題だと思うのですが、バイナリにosなどがつくとプロビジョニングツールで削るのが面倒なので
      • プロビジョニングツールではunzipして出てきたファイルをポン置きするだけにしたかった

gox が一番理想に近かったのですが、バイナリにosやarchがつくのが嫌だったので自分でビルドスクリプトを書きました

ビルドスクリプト

https://github.com/sue445/zatsu_monitor/blob/0.2.0/build.sh

できること

  • 各OS, archごとに<バイナリ名>_<バージョン>_<os>_<arch>.zipの形式のzipファイルを作成
  • zipを解凍したらosやarchはつかないバイナリが出てくる
  • バージョンでtagを生成してpushする

使い方

Macの場合は gnu-sed をインストール

Macでデフォルトで入ってるBSD版のsedだと正規表現が使えなくて機能が貧弱なので gru-sedをインストールしてください

brew install gnu-sed

version.go にバージョン情報を記載

package main

const VERSION = "0.1.0"

build.shを適宜変更

readonly DIST_DIR="dist"
readonly BIN_NAME="zatsu_monitor"
  • DIST_DIR : バイナリの出力先
  • BIN_NAME : バイナリ名

実行

distディレクトリに出力するので予め作っておいてください。(あと .gitignore への登録も)

$ ./build.sh
Write: dist/zatsu_monitor_0.1.0_darwin_amd64.zip
Write: dist/zatsu_monitor_0.1.0_linux_amd64.zip
Write: dist/zatsu_monitor_0.1.0_linux_arm.zip

zipの中身

$ unzip -l dist/zatsu_monitor_0.1.0_linux_amd64.zip
Archive:  dist/zatsu_monitor_0.1.0_linux_amd64.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
 11623512  07-06-16 23:23   zatsu_monitor
 --------                   -------
 11623512                   1 file

./build sh release のように実行すると自動的にバージョンのtagを生成してリポジトリにpushまでします

50行くらいのスクリプトなので詳しくはソースを読んでください

ライセンスとか

zatsu_monitor同様MITなので煮るなり焼くなりしてください( ◜◡◝ )