suzuki-shunsuke / issue

MIT License
4 stars 0 forks source link

シェルスクリプトを配布が容易なツール(OSS)にしたくて variant を試した結果 #63

Closed suzuki-shunsuke closed 3 years ago

suzuki-shunsuke commented 3 years ago

自分がこれまでシェルスクリプトで実装してきた CI/CD のパイプライン(ワークフロー)を再利用可能な形で OSS として公開したいと思い、 https://github.com/mumoshu/variant を試しました。 シェルスクリプトをそのまま GitHub なり Gist なりで公開してダウンロードできるようにするでもありといえばありですが、 ツールとしてパラメタライズが微妙なのとインストールしづらいのがあります。 普段 Go でツールを開発している身としてはバイナリを GitHub Releases におきたいのと、 YAML で設定ファイルを書きたいと思います。 でも Go で書き直すのもめんどいなぁと思い、そういえば variant でシェルスクリプトをバイナリに出来るんじゃないかと思って試してみました。

ちょっと試した結果、ちょっと微妙かなぁというか、これなら Go で書いたほうが良いかなと言う気がしてきました。 variant が悪いわけではないのですが。

variant には variant と variant2 がありますが、両方の README を眺めた結果、 variant を使いました。 自分としては variant に依存しないツールとして公開したいと思っていたので、 go バイナリを生成する方法を試しました。

Go の中に直接 variant の設定(YAML) を書くのは辛いので外部ファイルを https://github.com/rakyll/statik で読み込むようにしました。

config/tfci.yaml
main.go
$ statik -src config
package main

import (
    "fmt"
    "io/ioutil"
    "log"

    "github.com/mumoshu/variant/cmd"
    "github.com/rakyll/statik/fs"
    _ "github.com/suzuki-shunsuke/tfci/statik"
)

func main() {
    if err := core(); err != nil {
        log.Fatal(err)
    }
}

func core() error {
    statikFS, err := fs.New()
    if err != nil {
        return fmt.Errorf("create a statikFS: %w", err)
    }

    // Access individual files by their paths.
    r, err := statikFS.Open("/tfci.yaml")
    if err != nil {
        return fmt.Errorf("open a file from statikFS: %w", err)
    }
    defer r.Close()
    content, err := ioutil.ReadAll(r)
    if err != nil {
        return fmt.Errorf("read a file from statikFS: %w", err)
    }

    cmd.YAML(string(content))
    return nil
}