Gitのタグ機能およびそれを利用した成果物自動生成について
ka
kaosfield
CC BY-NC-SA 4.0
Copyright (C) 2023 ka
GitHub Pages: https://kaosf.github.io/20230803-git-tag
Repository: kaosf/20230803-git-tag - GitHub
SHA256によりプロジェクトのある時点でのスナップショットが一意に決まる
しかしとても人間が読めたものではない
ブランチはmainは常に動くしそれ以外は生成消滅がいつ起こるか分からない
そこで タグ を付ける機能が存在する
git tag v1.0.0
git tag -d v1.0.0
git push origin v1.0.0
git push origin :v1.0.0 # or git push origin -d v1.0.0
まずはリポジトリ用意
mkdir tag-experiment cd tag-experiment echo "Hello World" > README.md git init git add . git commit -m "Initial commit"
※GUIツールを利用している人は適宜読み替えて下さい
リポジトリ作成
20230803-git-tag-practice とする
20230803-git-tag-practice
git remote add origin git@github.com:kaosf/20230803-git-tag-practice.git git push origin main -u
※以後ユーザ名 kaosf は各自のものに適宜修正して下さい
kaosf
更新する
echo "Version 1.0.0" >> README.md git add . git commit -m "Update" git push
タグをつけてpushしてみる
git tag v1.0.0 git push origin v1.0.0
https://github.com/kaosf/20230803-git-tag-practice/tags
見てみるとタグがリモートリポジトリ上でも出来ている
タグを消して修正してみる
git tag -d v1.0.0 git push origin -d v1.0.0 echo "Fix" >> README.md git add . git commit -m "Fix" git push git tag v1.0.0 git push origin v1.0.0
タグがpushされたときに何かを生成してさらにそれを誰でもダウンロード可能な状態にしてみる
CIにはGitHub Actionsを用いることにする
my-command というコマンドを作る
my-command
実行するとタグで示すバージョンを表示してくれるツールにする
./my-command #=> v1.0.0
cat <<'EOF' > my-command #!/bin/bash echo VERSION EOF chmod +x my-command
意味は後述
my-command を作り内容を以下の通りにする
#!/bin/bash echo VERSION
また実行可能ファイルとするため chmod +x を実行する
chmod +x
VERSION の部分を置き換えて
VERSION
#!/bin/bash echo v1.0.0
このようなファイルを生成することをビルド作業とする
cat <<'EOF' > build.sh cat my-command | sed "s/VERSION/$1/" > dist/my-command chmod +x dist/my-command EOF
build.sh を用意する
build.sh
これを
bash build.sh vX.X.X
のように実行すれば dist ディレクトリに目的のモノが出来上がる想定である
dist
※実際にはこれが cargo build だったり make になったりするであろう
cargo build
make
mkdir dist touch dist/.keep cat <<'EOF' > dist/.gitignore /* !/.keep EOF
.github/workflows/build.yml
name: build my-command on: push: tags: [ 'v*.*.*' ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build run: bash build.sh ${{ github.ref_name }} - name: Tar files run: tar -czvf dist/my-command.tar.gz -C dist my-command - uses: actions/upload-artifact@v3 with: name: my-command path: dist/my-command.tar.gz
作るコマンドは後述
mkdir -p .github/workflows cat <<'EOF' > .github/workflows/build.yml name: build my-command on: push: tags: [ 'v*.*.*' ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Build run: bash build.sh ${{ github.ref_name }} - name: Tar files run: tar -czvf dist/my-command.tar.gz -C dist my-command - uses: actions/upload-artifact@v3 with: name: my-command path: dist/my-command.tar.gz EOF
git add . git commit -m "Impl my-command" git push
git tag v1.0.1 git push origin v1.0.1
これでGitHub Actionsが動き v1.0.1 の my-command.tar.gz が出来上がる
my-command.tar.gz
GitHub Actionsのページからダウンロード出来る
発展内容としてリリースページを作ってそこに登録も自動で…等が出来ると良い
簡単な例を実際に自分の手で実行してみることはとても重要