OSSの最適なリリースエンジニアリングを求める旅路
TIME rest time current/total
TopicsPlaceHolder

OSSの最適なリリースエンジニアリングを求める旅路

Go Conference mini 2022 Autumn IN SENDAI

Oct 15th, 2022

自己紹介

songmu

どうやらリリースエンジニアリングが好き

これまで開発してきたリリース関連ツール

メンテナ

その他(補助ツール)

gocredits

Goの実行バイナリを頒布するときに必要な、依存ライブラリのライセンスをまとめたCREDITSファイルを出力してくれるもの。

Goの場合、例えサードパーティライブラリを使ってないとしても、Goの標準モジュールのライセンスの同梱が必要。

tagpr (新作)

どういうものか?

これらがGitHub Actionsで自動で行われる

作った動機

効果

喜びの声

GitHub Actions設定

# .github/workflows/tagpr.yml
name: tagpr
on:
  push:
    branches: ["main"]
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: Songmu/tagpr@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

今日話すこと

アジェンダ

Webアプリケーション等でのリリース

Webアプリケーションなどでよく見られるリリース

git-pr-releaseによるリリースの簡便化

git-pr-releaseのスコープ外

Git-flowとリリース

Git-flow

Git-flowにはリリース作業をする一時ブランチが存在する

並走ブランチという古くからあるアイデア

並走ブランチが生まれてきた背景(個人的考察)

リリース用の並走ブランチを作る発想

pull requestというGitHubによる発明

git tag再考

Gitにはそもそもtagがある

並走ブランチ要るのか?

GitHubのtagサポートの弱さ

ここまでの課題

ソフトウェアリリース作業の複雑度

タグを打つ前にやること

tagを打つためのcommitを作る必要がある。

作業前

実際の作業

案外やることある。

従来のリリース作業

手元リリース機能を備えたオーサリングツール

手元リリースの課題

表出する問題

よくある共通の話題

他にもリリース時に変更するファイルはプロジェクトごとにあるが、tagprはこの2つの面倒をある程度見てくれる。

バージョニング

個人でやってる分にはいいが、引き継いだりチームでやるときに問題が表出することも

バージョン番号の管理

SemVer

https://semver.org/

人類がバージョン番号に介在する余地を残す

参考: RomVer (Romantic versioning)

参考: ZeroVer (0-based Versioning)

Your software's major version should never exceed the first and most important number in computing: zero.

バージョニングポリシーにおける課題

Changelog

Changelogは必要か

Changelogのフォーマット

Changelogは作りたいが手間はかけたくない

少し脱線: ghch (以前よく使っていたChangelog生成ツール)

GitHub Releasesのリリースノート生成機能

リリースノート生成APIの活用

その他のリリース時の更新

tagprによる解決編

ここまでの課題

pull request化

GitHubの機能をフル活用してワークフローを組む

tagprは同名のGo製コマンドですが、GitHubの機能とAPIをフル活用している。

tagprのフロー

mainが進む

branch

pull requestのマージとリリース

ブランチの更新による調整

mainの更新に追随

pull requestの内容

(余談) version.go

package tagpr

const version = "1.0.6"

var revision = "HEAD"

Goではこういうversion.goというファイルをリポジトリに配置するようにしている。

versionを明示的に書く

その他tagprでできること

conventional label

マージ済みのpull requestに major, minor のようなタグが付いていたらそれを見て次のバージョンを仮ぎめしてくれる

CHANGELOG.mdを更新しないオプション

[tagpr]
    changelog = false

GitHub Actions用出力による後続のタスクとの連携

- uses: actions/checkout@v3
- id: tagpr
  uses: Songmu/tagpr@v1
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: ./.github/actions/release
  with:
    tag: ${{ steps.tagpr.outputs.tag }}
  if: "steps.tagpr.outputs.tag != ''"

リリースコマンドの指定

[tagpr]
    command = 'go run path/to/release.go'

GitHub Actions上でtapgrが動くときに、ついでに実行するコマンドを指定できる。自動書き換え目的。

まとめ

宣伝