Github Actions事始め
#Github
#GithubActions
#LT
https://gyazo.com/8893554043a736d206a2c51d8718d912
GPTに書いてもらった
GithubActionsの前に、、、
CI/CD
CI/CDにおける、「パイプライン」・「デプロイ」部分をよく記載する。beeeyan.icon
GitHub Actionsとは
あらかじめ定義した処理と条件の組合せ(=ワークフロー/Workflow)を自動化するGitHub公式の機能です。
リポジトリに対するプッシュなどの処理をトリガーとして、専用のWorkflowに定義しておいた処理を自動で実行します。
LTのGoal
「GithubActions」の構築が自分もできるかも?と思える。
副) 今回作ったactionを導入する実案件に導入する。
Q GithubActionsを始めるときの下準備。
Githubで管理しているリポジトリに.github/workflows/を作る。
そこに任意の名前でymlファイルを作成する
→これだけでOK
じゃあ早速作ってみよう!!
題材仕様)
Flutterプロジェクト
パッチバージョンを上げるプルリクエストを自動生成してくれるGithubActions
トリガー
(developから)mainブランチにプルリクエストをつくったとき
結果
developに対して、ビルドバージョンとパッチバージョンが挙がったプルリクエストが作成される。
作成意図
忘れるから
Androidリリースでビルド番号で良くおこられる。
書く内容の大枠(二種類ある認識)
ワークフロー (Github上の操作系)
code:flow.yml
name:
on:
jobs:
「name」名前つける
「on」トリガー・ワークフローが動く条件
「jobs」処理の中身
descriptionもあった方がいいかも?
ワークフローにはないっぽいbeeeyan.icon
https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions
アクション(Deployなど) 今回対象外
code:action.yml
name:
description:
inputs:
runs:
今回つくったファイル
code:version-up.yml
name: version up
on:
pull_request:
types: opened
branches:
- main
jobs:
create-version-up-pr:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FILE_PATH: pubspec.yaml
TZ: 'Asia/Tokyo'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Checkout develop branch
run: git fetch origin develop:develop && git checkout develop
- name: Set current datetime as env variable
run: echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- name: Create new branch
run: |
git switch -c fix/versionup_${{ env.CURRENT_DATETIME }}
git push -u origin fix/versionup_${{ env.CURRENT_DATETIME }}
- name: version up
run: |
OLD_VERSION=$(awk '/version:/ {print $2; exit}' ${{ env.FILE_PATH }})
IFS='.' read -r -a version_parts <<< "${OLD_VERSION%+*}"
IFS='+' read -r -a build_parts <<< "${OLD_VERSION##*.}"
new_patch=$((version_parts2 + 1))
new_build=$((build_parts1 + 1))
NEW_VERSION="${version_parts0}.${version_parts1}.$new_patch+$new_build"
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
sed -i "0,/version: .*/s//version: $NEW_VERSION/" "${{ env.FILE_PATH }}"
- name: Add and Commit
uses: EndBug/add-and-commit@v9
with:
branch: fix/versionup_${{ env.CURRENT_DATETIME }}
message: ${{ env.NEW_VERSION }}
add: "${{ env.FILE_PATH }}"
- name: Create pull request
uses: repo-sync/pull-request@v2
with:
source_branch: fix/versionup_${{ env.CURRENT_DATETIME }}
destination_branch: develop
pr_title: ${{ env.NEW_VERSION }}
トリガー
code:version-up.yml
on:
pull_request:
types: opened
branches:
- main
mainに対してプルリクエストが作成されたとき、の書き方
トリガー部分の参考
https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#on
types: [opened]
プルリクをオープンした場合のみ
code:version-up.yml
jobs:
create-version-up-pr:
runs-on: ubuntu-latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FILE_PATH: pubspec.yaml
TZ: 'Asia/Tokyo'
実行内容
create-version-up-pr 名前
runs-on: ubuntu-latest
処理を動かすOSの指定
基本は「ubuntu-latest」でいいと思う
その他 https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#github-ホステッド-ランナーの選択
env 処理で利用する環境変数
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
呪文レベル
Githubに対して操作させたいときはGH_TOKENの指定が必要
GitHubは枠ーフローで使用するシークレットキーを自動的に生成してくれています。別で設定とかいらない。
TZ: 'Asia/Tokyo'
タイムゾーンの指定
ちなみにGPTからのフィードバックですが、
基本は「envフィールドは各ステップではなく、ジョブのレベルで定義されるべきです」とのことです。
code:version-up.yml
steps:
- name: Checkout
uses: actions/checkout@v4
stepsにnameをつけていって処理が書ける
まずはコードのチェックアウトが必要。
https://github.com/actions/checkout
ちょっとブラックボックス化してしまうが、外部で用意してくれている処理を利用している。
code:version-up.yml
- name: Checkout develop branch
run: git fetch origin develop:develop && git checkout develop
developブランチからブランチを切りたいのでブランチ移動
ブランチ移動しないとフィルターで指定したmainにいる模様。
zennに記事をまとめていて気づいたが、「Checkout」「Checkout develop branch」は一気にできる。
↓
code:version-up.yml
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: develop
code:version-up.yml
- name: Set current datetime as env variable
run: echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
現在時刻を登録
$GITHUB_ENVにデータを入れることで別の処理(step)で値を使うことができる
code:version-up.yml
- name: Create new branch
run: |
git switch -c fix/versionup_${{ env.CURRENT_DATETIME }}
git push -u origin fix/versionup_${{ env.CURRENT_DATETIME }}
ブランチ作成・新規ブランチpush
code:version-up.yml
- name: version up
run: |
OLD_VERSION=$(awk '/version:/ {print $2; exit}' ${{ env.FILE_PATH }})
IFS='.' read -r -a version_parts <<< "${OLD_VERSION%+*}"
IFS='+' read -r -a build_parts <<< "${OLD_VERSION##*.}"
new_patch=$((version_parts2 + 1))
new_build=$((build_parts1 + 1))
NEW_VERSION="${version_parts0}.${version_parts1}.$new_patch+$new_build"
echo "NEW_VERSION=${NEW_VERSION}" >> $GITHUB_ENV
sed -i "0,/version: .*/s//version: $NEW_VERSION/" "${{ env.FILE_PATH }}"
shell!
file更新!
code:version-up.yml
- name: Add and Commit
uses: EndBug/add-and-commit@v9
with:
branch: fix/versionup_${{ env.CURRENT_DATETIME }}
message: ${{ env.NEW_VERSION }}
add: "${{ env.FILE_PATH }}"
コミット
これもブラックボックスですが「uses: EndBug/add-and-commit@v9」というものを使っている
https://github.com/EndBug/add-and-commit
code:version-up.yml
- name: Create pull request
uses: repo-sync/pull-request@v2
with:
source_branch: fix/versionup_${{ env.CURRENT_DATETIME }}
destination_branch: develop
pr_title: ${{ env.NEW_VERSION }}
コミット
これもブラックボックスですが「uses: repo-sync/pull-request@v2」というものを使っている
https://github.com/repo-sync/pull-request
メモ:VSCodeにymlの拡張機能を入れよう!
参考
GitHub Actionsさんはリリース用プルリクエストの作成も自動化できるようです
GitHub Actionsで「ブランチ作成 → jsonファイル更新 → コミット → プルリクエスト」までを実行する