2025-09-22 17:28:58 +08:00

253 lines
7.6 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# .gitea/workflows/ci.yml
name: Flutter CI/CD Pipeline
# 触发条件
on:
push:
branches:
- develop_sky
- release_sky
- master_sky
- canary_release_sky
- /^feat_[a-zA-Z]+$/ # 注意Gitea 不支持正则分支名直接写在 YAML 中,需用 if 判断
tags:
- v* # 匹配 v1.0.0 等 tag
pull_request:
branches:
- develop_sky
- release_sky
- canary_release_sky
- /^feat_[a-zA-Z]+$/
# 全局环境变量
env:
LC_ALL: en_US.UTF-8
LANG: en_US.UTF-8
PUB_HOSTED_URL: https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL: https://storage.flutter-io.cn
# 所有 job 共用的 runner 标签
defaults:
run:
shell: bash
jobs:
# ============ 1. 打印环境信息 ============
print_env:
name: Print Environment
runs-on: macos,flutter # 必须匹配你 Runner 的 labels
if: |
contains(github.ref, 'develop_sky') ||
contains(github.ref, 'release_sky') ||
contains(github.ref, 'canary_release_sky') ||
startsWith(github.ref, 'refs/heads/feat_') ||
startsWith(github.ref, 'refs/tags/v')
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Set up Ruby
run: |
export PATH="/opt/homebrew/bin:$PATH"
eval "$(rbenv init -)"
rbenv global 2.6.10
ruby -v
which ruby
gem env
- name: Print Env
run: |
java --version
printenv | sort
- name: Set NEXT_VERSION from file
run: |
echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV
if: always() && !cancelled()
# ============ 2. 生成 Git Tag仅 master_sky ============
generate_git_tag:
name: Generate Git Tag
needs: print_env
runs-on: macos,flutter
if: github.branch == 'master_sky'
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup SSH & Generate Tag
run: |
bash pre_build.sh sky
project_url=$(echo $CI_GITEA_SERVER_URL | sed 's|http://||')
git remote set-url origin git@gitea.example.com:your-namespace/your-repo.git
bash tag_generator.sh generate_tag
# ============ 3. 生成下一个版本号 ============
generate_next_version:
name: Generate Next Version
needs: print_env
runs-on: macos,flutter
if: |
contains(github.ref, 'develop_sky') ||
contains(github.ref, 'release_sky') ||
contains(github.ref, 'canary_release_sky') ||
startsWith(github.ref, 'refs/heads/feat_')
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Generate Version
run: |
bash tag_generator.sh generate_version
id: version_gen
- name: Save Version for Downstream
run: |
echo "NEXT_VERSION=$(cat app_new.version)" >> $GITHUB_ENV
if: always()
outputs:
next_version: ${{ env.NEXT_VERSION }}
# ============ 4. 构建 Android ============
build_android:
name: Build Android APK/AAB
needs: [print_env, generate_next_version]
runs-on: macos,flutter
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup Flutter & Fastlane (Android)
run: |
export PATH="/opt/homebrew/bin:$PATH"
eval "$(rbenv init -)"
rbenv global 2.6.10
bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/
bundle install --gemfile android/Gemfile --path vendor/bundle_android --quiet
flutter clean
flutter pub get
- name: Build Android
run: |
bash android/build.sh
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: android-artifacts
path: build/app/outputs/flutter-apk/
# ============ 5. 构建 iOS ============
build_ios:
name: Build iOS IPA
needs: [print_env, generate_next_version]
runs-on: macos,flutter
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Setup Flutter & Fastlane (iOS)
run: |
export PATH="/opt/homebrew/bin:$PATH"
eval "$(rbenv init -)"
rbenv global 2.6.10
bundle config mirror.https://rubygems.org https://mirrors.aliyun.com/rubygems/
bundle install --gemfile ios/Gemfile --path vendor/bundle_ios --quiet
flutter clean
flutter pub get
- name: Build iOS
run: |
bash ios/build.sh
- name: Upload Artifacts
uses: actions/upload-artifact@v4
with:
name: ios-artifacts
path: build/app/outputs/flutter-ipa/
# ============ 6. 发布 Release仅当打 tag 时) ============
create_release:
name: Create Release & Upload Assets
needs: [build_android, build_ios]
runs-on: macos,flutter
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Download Artifacts
uses: actions/download-artifact@v4
- name: Generate Release Description
run: |
bash release_description_generator.sh
cat changelog.md
- name: Upload to Gitea Package Registry & Create Release
env:
STARLOCK_VERSION: ${{ split(github.ref, '/')[2] }} # 提取 tag 名,如 v1.0.0 -> v1.0.0
run: |
TAG_NAME="${STARLOCK_VERSION}"
VERSION_PART="${TAG_NAME#v}" # 去掉 v 前缀
# 上传到 Gitea 通用包Generic Package
curl -f -i \
-H "Authorization: Bearer $CI_GITEA_TOKEN" \
--upload-file "starlock-sky-release-${TAG_NAME}.apk" \
"$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.apk"
curl -f -i \
-H "Authorization: Bearer $CI_GITEA_TOKEN" \
--upload-file "starlock-sky-release-${TAG_NAME}.aab" \
"$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.aab"
curl -f -i \
-H "Authorization: Bearer $CI_GITEA_TOKEN" \
--upload-file "starlock-sky-release-${TAG_NAME}.ipa" \
"$CI_GITEA_SERVER_URL/api/packages/$GITHUB_REPOSITORY_OWNER/StarLock/$VERSION_PART/starlock-sky-release-${TAG_NAME}.ipa"
# 创建 Gitea Release使用 Gitea API
RELEASE_NOTES="$(cat changelog.md)"
curl -f -i -X POST \
-H "Authorization: Bearer $CI_GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"tag_name": "'"$TAG_NAME"'",
"target_commitish": "'"$GITHUB_SHA"'",
"title": "Release '"$TAG_NAME"'",
"note": '"$(printf '%s' "$RELEASE_NOTES" | jq -R -s '.')"',
"is_draft": false,
"is_prerelease": false
}' \
"$CI_GITEA_SERVER_URL/api/v1/repos/$GITHUB_REPOSITORY/releases"
# ============ 7. 通知 ============
notify_success:
name: Notify on Success
needs: [create_release, build_android, build_ios]
runs-on: macos,flutter
if: success()
steps:
- run: bash notify.sh success
notify_failure:
name: Notify on Failure
needs: [build_android, build_ios, create_release]
runs-on: macos,flutter
if: failure()
steps:
- run: bash notify.sh failure
# ============ 8. 清理 ============
clean_up:
name: Clean Workspace
runs-on: macos,flutter
needs: [notify_success, notify_failure]
if: always()
steps:
- name: Reset Git
run: |
git reset --hard
git clean -fdx