🚀
【FlutterWeb】【GithubActions】CloudFlarePagesでデプロイ
FirebaseHostingとの比較
メリット 👌
- 帯域幅の制限がない点。無料の範囲でとりあえず、月間のアクセス量を気にせず運用可能。
デメリット 🧐
- 強いて言えば、デプロイ方法がやや劣る。(そこまで気にならないが)
CloudFlarePagesのデプロイ手法(3つ)
- 1 手動でアップロード
- 2 WranglerCLI経由でアップロード
- 3 Git連携(リポジトリ監視)(リポジトリが更新されたらデプロイ走る)
-> 3を選択
「Git連携(リポジトリ監視)」 の運用について
「build/web」をどこに置くか問題
A: 1つリポジトリで運用 (Flutterプロジェクト用の1つ)
- 「build/web」を、.gitignoreにせず、「Git管理」するパターン
(※2...A: 1つのリポジトリで運用する場合のパターン)
B: 2つのリポジトリで運用 (Flutterプロジェクト用 & build/web用)
- [build/web]のみ管理するリポジトリを別途作成するパターン
→ Bで対応
(※1...Aにしなかった理由は、末尾記載 )
B: 2つのリポジトリで運用 の対応方法
全体図
1: [FlutterプロジェクトのGitリポジトリ]
↓
2: [GithubActions]
↓
3: [build/web用のGitリポジトリ]
↓
4: [CloudFlarePages]
- 1:
- Flutterアプリを開発
- 2:
- [build/web]を生成し、下のGitリポジトリにPushする処理
- 3:
- [build/web]のみ管理。CloudFlare側でGit連携して、デプロイ監視。
- 4:
- 上のリポジトリの[build/web]を自動デプロイ
- ※事前に[build/web]用のリポジトリを作成が必要
GithubActionsの利用
処理の概要
- 1 web_pushブランチにPushで処理開始
- 2
$ flutter build web
を実行し、[build/web]を生成 - 3 生成した[build/web]を 「build/web用のリポジトリ」にPush
- ※Pushされると、CloudFlare側で、デプロイ処理が走る。
- [その他] キャッシュ処理(flutter sdk, pub get,等)
GithubActionsのコード
name: Build [build/web] & Push to [web/build] to other Web Repository.
on:
push:
branches:
- web_push # トリガーとなるブランチ
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout This Repository
uses: actions/checkout@v4
- name: Set up Git
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Install SSH key
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
# flutter-version: '3.0.0' # 任意のバージョンを指定する場合
channel: 'stable' # Stableの最新版を指定
cache: true
- run: flutter --version
- name: Cache Flutter dependencies
id: cache-flutter-deps
uses: actions/cache@v3
with:
path: |
~/.pub-cache
${{ github.workspace }}/.packages
key: ${{ runner.os }}-flutter-${{ hashFiles('**/pubspec.lock') }}
restore-keys: |
${{ runner.os }}-flutter-
- name: Check cache status
run: |
if [ ${{ steps.cache-flutter-deps.outputs.cache-hit }} == 'true' ]; then
echo "Using cached dependencies."
else
echo "Cache not found, running flutter pub get."
fi
- name: Install dependencies
run: flutter pub get
- name: Build Flutter Web
run: flutter build web --release
- name: Clone Web Repository
run: |
git clone git@github.com:{GITUSERNAME}/{GITREPOSITORYNAME.git} web-repo
cd web-repo
git checkout main
- name: Create target directory if it does not exist
run: |
mkdir -p web-repo/build/web
- name: Copy Files
run: |
rsync -a --delete build/web/ web-repo/build/web/
- name: Commit and Push Changes
run: |
cd web-repo
git add .
git commit -m "GithubActions: Push To web/build from flutter app repository."
git push origin main
↑をコピペする際に、変更が必要な箇所
- 1, SSH_PRIVATE_KEY の定義・設定
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
の箇所で利用
refs: GitHubにSSH接続する方法 - 2, 「build/web管理用」のリポジトリのURL を適宜変更
git clone git@github.com:{GIT_USERNAME}/{GIT_REPOSITORY_NAME.git} web-repo
flutterのバージョン指定
name: Set up Flutter
の処理で指定。
指定方法はいろいろあるため、適宜指定。
-> refs: flutter-action:README
-> pubspec.ymlのFlutterバージョンを指定する方法 が、運用上よさそう?
使ってみて😃
- mainブランチで開発した内容を、「push_web」ブランチに「マージ&Push」で、webデプロイできるので便利🎶
- FlutterWebだと、GithubActionsの使用OSがLinuxなので無料枠(2000分/月)はだいぶ余裕があるのでよい🎶
(iOSアプリだと、MacOS稼働なため、リソース消費が3倍な上に、ビルド時間増加傾向なので、すぐ消費される)
※1...Aにしなかった理由は、別途記載)
※1...Aにしなかった理由は、別途記載)
build/webをGit管理にする際に、下記構造で、「web」のみ管理。それ以外は、.gitignoreする。
としたかった。が、うまくできなかったため、断念。
project/
├── .gitignore
├── build/
│ ├── web/
│ │ ├── index.html
│ │ └── assets/
│ │ ├── style.css
│ │ └── script.js
│ └── ios/
│ └── file.txt
│ └── andoroid/
│ └── file.txt
└── src/
└── main.c
// .gitignoreファイルの末尾に記載
# 一旦、すべての build/ ディレクトリを無視
build/
# ただし、build/web/ ディレクトリは管理対象とする
!build/web/
# build/web/ ディレクトリの内容も管理対象とする
!build/web/**
この状態で、build/web/の内容をコミットする場合、
$ git add build/web
では差分が追加されず、必ず「強制オプション」が必要だった。
$ git add -f build/web
build/web の差分が、ステージングツリーに自動で反映されず、コミット漏れが起きるので、この対応を諦めた。
※↓ git のキャッシュクリアはしたが変わらず。
git rm -r --cached build/web
git add .
git commit -m "Update .gitignore and re-add build/web"
※2...A: 1つのリポジトリで運用する場合のパターン
1つのリポジトリで運用する場合のパターン MEMO
※A... 【これで対応すれば良かったかも】😅
- GithubActions側で
- 「build/web」を生成し、
- 同じリポジトリ に別途 「buildWeb/」フォルダ を作成し、そこにコピペ移動させる。
- 作成した 「buildeWeb/」フォルダのみ、Git管理 する。
※B... 【シンプル】
- build/webだけのGit管理はあきらめて、build/全体をGit管理(容量だけ気にする必要はありそう🧐)
Discussion