Documentation
¶
Overview ¶
Package build はクロスビルドのアダプタ境界(Builder)。
上位層は Builder インタフェースしか知らない。GoReleaser 依存はこのパッケージに閉じ、 (A)→(C) 独立移行時は nativeBuilder を実装して差し替えるだけにする。 GoReleaser はライブラリ import せず、pin したバイナリをサブプロセスで叩く。
Index ¶
- Constants
- func RegistryHost(image string) string
- func SHA256File(path string) (string, error)
- func SaveArtifacts(root, version string, arts []Artifact) error
- type Archiver
- type Artifact
- type ArtifactSet
- type Builder
- type Bundle
- type Containerizer
- type FailedError
- type GoReleaserBuilder
- func (b *GoReleaserBuilder) Archives(ctx context.Context, root, configPath string) ([]Artifact, error)
- func (b *GoReleaserBuilder) Build(ctx context.Context, root, configPath string) ([]Artifact, error)
- func (b *GoReleaserBuilder) Containers(ctx context.Context, root, configPath string) ([]Artifact, error)
- func (b *GoReleaserBuilder) Packages(ctx context.Context, root, configPath string) ([]Artifact, error)
- func (b *GoReleaserBuilder) Release(ctx context.Context, root, configPath string) ([]Artifact, error)
- func (b *GoReleaserBuilder) ReleaseAll(ctx context.Context, root, configPath string, skipDocker bool) ([]Artifact, error)
- type MultiReleaser
- type PackageSpec
- type Packager
- type PrebuiltBinary
- type PrebuiltBuilder
- type PrebuiltContainerizer
- type RegistryLogin
- type Releaser
- type Runner
- type StdinRunner
- type UnavailableError
Constants ¶
const ArtifactsFile = ".wharfy/artifacts.json"
ArtifactsFile は release が記録する成果物マニフェストの相対パス(.wharfy 配下)。 release(アップロード)と publish <ch>(マニフェスト書き込み)を切り離す土台: release が実 sha 付きの成果物一覧をここに残し、publish はビルドし直さず消費する。
Variables ¶
This section is empty.
Functions ¶
func RegistryHost ¶ added in v0.18.0
RegistryHost は image 参照("ghcr.io/owner/name" 等)からレジストリのホストを取り出す。 ホストらしさは最初のセグメントに "." か ":" が在ることで判る(無ければ Docker Hub の暗黙参照)。
func SHA256File ¶ added in v0.22.0
SHA256File はファイルの実 sha256(16 進)。宣言値ではなく**そのバイト列**を数えるのが要点で、 成果物の記録も来歴の subject も、ここが出した値だけを載せる。
func SaveArtifacts ¶ added in v0.2.0
SaveArtifacts は成果物一覧を .wharfy/artifacts.json に原子的に書く(temp+rename)。
Types ¶
type Archiver ¶
type Archiver interface {
Archives(ctx context.Context, root, configPath string) ([]Artifact, error)
}
Archiver はアーカイブ(.tar.gz/.zip)生成境界。formula 等が archive の sha256 を要するため分ける。
type Artifact ¶
type Artifact struct {
OS string `json:"os"`
Arch string `json:"arch"`
Kind string `json:"kind,omitempty"`
Path string `json:"path"`
SHA256 string `json:"sha256,omitempty"`
}
Artifact はクロスビルドの成果物 1 つ(schemas/common.json の artifact と同形)。 Kind は BYO-bundle(GUI・依頼①)の種別(dmg/zip/appimage/deb/rpm 等)。空はバイナリ archive (既存の Go/prebuilt 経路)を意味する。cask/release がこれで成果物を振り分ける。
func ArchivePrebuilt ¶ added in v0.7.0
func ArchivePrebuilt(root, distDir, project, version, binaryName string, bins []PrebuiltBinary) ([]Artifact, error)
ArchivePrebuilt は各ビルド済みバイナリを配布アーカイブにまとめ、distDir(root からの相対)に置く。
- 命名: <project>_<version>_<os>_<arch>.tar.gz(windows は .zip)。GoReleaser 既定と一致させる。 publish 側(formulaArchives/scoopArchives/install.sh)がこの名前で URL を組むため、一致が契約。
- アーカイブ内の実行ファイル名: binaryName(windows は .exe を付す)。formula の `bin.install` と install.sh の展開先がこの名前を前提にする。
実アーカイブの sha256 を付けた Archive 成果物を返す(publish が formula/manifest の sha に使う)。
func PackagePrebuilt ¶ added in v0.7.0
func PackagePrebuilt(root, distDir string, spec PackageSpec, bins []PrebuiltBinary) ([]Artifact, error)
PackagePrebuilt は各 linux バイナリ(arch ごと)から deb/rpm を作り distDir に置く。 生成物名は <project>_<version>_linux_<arch><ext>(expectedPackages と一致・publish が上げる)。 実ファイルの sha256 を付けた成果物を返す。windows/darwin バイナリは対象外(linux のみ)。
func ValidateBundles ¶ added in v0.8.0
ValidateBundles は持ち込みバンドルの存在と(宣言があれば)sha256 を検証し、Artifact にする。 Path はそのまま残す(再 archive しない)。Kind を Artifact.Kind に載せて後段(cask/release)へ運ぶ。 prebuilt の PrebuiltBuilder.Build と対称だが、archive 化はしない点だけが違う。
type ArtifactSet ¶ added in v0.2.0
ArtifactSet は release が version とその成果物(実 sha256)を束ねて記録したもの。
func LoadArtifacts ¶ added in v0.2.0
func LoadArtifacts(root string) (ArtifactSet, bool, error)
LoadArtifacts は記録済み成果物を読む。無ければ found=false(エラーではない)。
type Builder ¶
Builder はビルド境界。configPath は生成 GoReleaser 設定(.wharfy/goreleaser.yaml)。 root は利用者リポジトリのルート(サブプロセスの作業ディレクトリ)。
type Bundle ¶ added in v0.8.0
type Bundle struct {
OS string
Arch string
Kind string // dmg/zip/exe/msi/appimage/deb/rpm
Path string // 利用者 root からの相対パス
SHA256 string // 宣言 sha(任意)。空でなければ実 sha と照合する
}
Bundle は解決済みの持ち込みバンドル 1 つ。config.Bundle の写し (build は下位ドメインで config を import しないため値だけ受け取る)。
type Containerizer ¶
type Containerizer interface {
Containers(ctx context.Context, root, configPath string) ([]Artifact, error)
}
Containerizer は OCI イメージのビルド&push 境界(container チャネル)。
type FailedError ¶
FailedError はクロスビルド失敗(build_failed)。Output は診断のための末尾ログ。
func (*FailedError) Error ¶
func (e *FailedError) Error() string
func (*FailedError) Unwrap ¶
func (e *FailedError) Unwrap() error
type GoReleaserBuilder ¶
type GoReleaserBuilder struct {
Bin string // 既定 "goreleaser"
DistDir string // root からの相対(生成設定の dist と一致させる)
LookPath func(string) (string, error)
Run Runner
}
GoReleaserBuilder は MVP 実装。GoReleaser を `build --snapshot` でサブプロセス起動する。
func NewGoReleaserBuilder ¶
func NewGoReleaserBuilder(distDir string) *GoReleaserBuilder
NewGoReleaserBuilder は本番用の既定(exec ベース)を差した Builder を返す。 distDir は config.DistDir を渡す(生成設定の dist と一致させるため呼び出し側で指定)。
func (*GoReleaserBuilder) Archives ¶
func (b *GoReleaserBuilder) Archives(ctx context.Context, root, configPath string) ([]Artifact, error)
Archives は release-snapshot でアーカイブ(.tar.gz/.zip)まで作り、Archive 成果物を返す。 homebrew formula 等は archive の sha256 を要するため、build(バイナリのみ)とは別経路で作る。 --snapshot は tag 無し・dirty でも通り、発行はしない(ローカル生成のみ=preview 用)。
func (*GoReleaserBuilder) Containers ¶
func (b *GoReleaserBuilder) Containers(ctx context.Context, root, configPath string) ([]Artifact, error)
Containers は OCI イメージ(per-arch)をビルドし ghcr へ push、manifest list を作る。 goreleaser の docker pipe に任せる。docker デーモン + ghcr 認証が要る。
func (*GoReleaserBuilder) Packages ¶
func (b *GoReleaserBuilder) Packages(ctx context.Context, root, configPath string) ([]Artifact, error)
Packages は nfpm の deb/rpm をローカルに作る。--skip=publish で GitHub には上げない (apt/rpm の発行先は hosted repo)。実タグの版でパッケージ化するため --snapshot は使わない。
func (*GoReleaserBuilder) Release ¶
func (b *GoReleaserBuilder) Release(ctx context.Context, root, configPath string) ([]Artifact, error)
Release は**実リリース**。クリーンな tag + GITHUB_TOKEN が要る。アーカイブを GitHub Releases へアップロードし、その実アーカイブの Archive 成果物(実 sha256)を返す。 formula push は wharfy が所有するので --skip=homebrew で goreleaser には書かせない。
func (*GoReleaserBuilder) ReleaseAll ¶
func (b *GoReleaserBuilder) ReleaseAll(ctx context.Context, root, configPath string, skipDocker bool) ([]Artifact, error)
ReleaseAll は 1 回の release で全成果物を作る(publish 一括用)。archive・install.sh(extra_files)・ nfpm を GitHub Releases へ上げ、container 設定があれば docker も build+push する(--skip=homebrew のみ。dockers ブロックが無ければ docker は noop)。Archive + Linux Package 成果物を返す。
type MultiReleaser ¶
type MultiReleaser interface {
ReleaseAll(ctx context.Context, root, configPath string, skipDocker bool) ([]Artifact, error)
}
MultiReleaser は全チャネル一括発行の境界。1 回の release で archive・nfpm・docker を まとめて作り/上げ、Archive + Linux Package 成果物を返す(publish 一括で多重 release を避ける)。 skipDocker=true で docker pipe を抑止(container を出さない/docker 不在のとき)。
type PackageSpec ¶ added in v0.7.0
type PackageSpec struct {
Format string // "deb" | "rpm"
Ext string // ".deb" | ".rpm"(生成物名に使う)
Name string // パッケージ名(= project)
BinaryName string // /usr/bin 配下の実行ファイル名
Version string
Maintainer string
Description string
Homepage string
License string
Depends []string
Recommends []string
Suggests []string
// Notice は配布者が書いた告知(D-3)。deb/rpm には注記専用の欄が無いので description に続ける。
// post-install scriptlet は失敗するとインストールを壊すので使わない。
Notice string
}
PackageSpec は 1 チャネル(apt→deb / rpm→rpm)のパッケージ生成指定。依存 3 区分は フォーマット固有(ディストロで名前が異なるため呼び出し側で解決して渡す)。
type Packager ¶
type Packager interface {
Packages(ctx context.Context, root, configPath string) ([]Artifact, error)
}
Packager は deb/rpm パッケージ生成境界(apt/rpm チャネル)。GitHub には触れず ローカルに nfpm パッケージを作り、その成果物(os/arch/path/sha256)を返す。
type PrebuiltBinary ¶ added in v0.7.0
type PrebuiltBinary struct {
OS string
Arch string
Path string // 利用者 root からの相対パス
SHA256 string // 宣言 sha(任意)。空でなければ実 sha と照合する
}
PrebuiltBinary は解決済みのビルド済みバイナリ 1 つ。config.PrebuiltBinary の写し (build は下位ドメインで config を import しないため、値だけ受け取る)。
type PrebuiltBuilder ¶ added in v0.7.0
type PrebuiltBuilder struct {
Binaries []PrebuiltBinary
}
PrebuiltBuilder は BYO-binary の Builder 実装(依頼①)。configPath は使わない (GoReleaser 設定は不要)。渡されたバイナリの存在と sha256 を検証し、Artifact にする。
type PrebuiltContainerizer ¶ added in v0.7.0
type PrebuiltContainerizer struct {
Bin string // 既定 "docker"
LookPath func(string) (string, error)
Run Runner
}
PrebuiltContainerizer は docker buildx で BYO の OCI イメージを作る(末端差し替え)。
func NewPrebuiltContainerizer ¶ added in v0.7.0
func NewPrebuiltContainerizer() *PrebuiltContainerizer
NewPrebuiltContainerizer は本番用(exec ベース)を差した実体を返す。
func (*PrebuiltContainerizer) PushMultiArch ¶ added in v0.7.0
func (b *PrebuiltContainerizer) PushMultiArch(ctx context.Context, root, distDir, image, version, binaryName string, bins []PrebuiltBinary) error
PushMultiArch は image に :version と :latest のマルチアーキ OCI を build+push する。 bins のうち linux のみを対象にする。返り値はエラーのみ(成果物は registry 上)。
type RegistryLogin ¶ added in v0.18.0
type RegistryLogin struct {
Bin string // 既定 "docker"
LookPath func(string) (string, error)
Run StdinRunner
}
RegistryLogin は push 先レジストリへの docker login。CI ではトークンを渡すだけで通るように、 wharfy 自身がログインする(手元の docker が既に認証済みでも、渡されたトークンで上書きする ——利用者が wharfy に渡した資格情報こそが、wharfy の使うべき資格情報)。
func NewRegistryLogin ¶ added in v0.18.0
func NewRegistryLogin() *RegistryLogin
NewRegistryLogin は本番用(exec ベース)を差した実体を返す。
type Releaser ¶
type Releaser interface {
Release(ctx context.Context, root, configPath string) ([]Artifact, error)
}
Releaser は実リリース境界。アーカイブを GitHub Releases へ**アップロード**し、 その実アーカイブ(=配布される実体)の sha256 を返す。homebrew formula はこの実 checksum と実 URL を参照する必要があるため、snapshot(Archives)とは別経路にする。
type StdinRunner ¶ added in v0.18.0
StdinRunner は stdin を流せるコマンド実行(--password-stdin 用・テストで差し替え)。 Runner と別なのは、トークンを argv に載せない(ps に出さない)ため。
type UnavailableError ¶
type UnavailableError struct {
}
UnavailableError は下層ビルダが見つからない/起動不可(builder_unavailable)。
func (*UnavailableError) Error ¶
func (e *UnavailableError) Error() string
func (*UnavailableError) Unwrap ¶
func (e *UnavailableError) Unwrap() error