name: Flutter Build - Sky on: push: branches: - develop_sky jobs: # 第一个 job:只负责计算版本号(所有 job 依赖它) determine-version: name: 🧮 Determine Version runs-on: sky outputs: next_version: ${{ steps.version.outputs.next_version }} next_version_full: ${{ steps.version.outputs.next_version_full }} build_number: ${{ steps.version.outputs.build_number }} steps: - name: Checkout Code uses: actions/checkout@v4 with: fetch-depth: 0 - name: Determine Version id: version run: | LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "v1.0.0_sky") BASE_VERSION=$(echo "$LAST_TAG" | grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+' | head -1) [ -z "$BASE_VERSION" ] && BASE_VERSION="v1.0.0" MAJOR=$(echo $BASE_VERSION | cut -d'.' -f1 | sed 's/v//') MINOR=$(echo $BASE_VERSION | cut -d'.' -f2) PATCH=$(echo $BASE_VERSION | cut -d'.' -f3) COMMIT_COUNT=$(git log --pretty=%B "${LAST_TAG}.." | grep -v '^$' | sort -u | wc -l | tr -d ' ') NEW_PATCH=$((PATCH + COMMIT_COUNT)) NEXT_VERSION="v${MAJOR}.${MINOR}.${NEW_PATCH}" NEXT_VERSION_FULL="${NEXT_VERSION}_sky_dev" BUILD_NUMBER=$NEW_PATCH echo "NEXT_VERSION=$NEXT_VERSION" >> $GITEA_ENV echo "NEXT_VERSION_FULL=$NEXT_VERSION_FULL" >> $GITEA_ENV echo "BUILD_NUMBER=$BUILD_NUMBER" >> $GITEA_ENV # 输出给其他 job 使用 echo "::set-output name=next_version::$NEXT_VERSION" echo "::set-output name=next_version_full::$NEXT_VERSION_FULL" echo "::set-output name=build_number::$BUILD_NUMBER" # 并行 Job 1:Android APK build-apk: name: 📦 Build APK needs: determine-version runs-on: sky steps: - name: Checkout Code uses: actions/checkout@v4 - name: Setup Flutter run: flutter pub get - name: Build APK run: | flutter build apk \ --no-tree-shake-icons \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ --build-name=${{ needs.determine-version.outputs.next_version }} - name: Upload APK Artifact uses: actions/upload-artifact@v4 with: name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.apk path: build/app/outputs/flutter-apk/app-sky_dev-release.apk # 并行 Job 2:Android AAB build-aab: name: 📦 Build AAB needs: determine-version runs-on: sky steps: - name: Checkout Code uses: actions/checkout@v4 - name: Setup Flutter run: flutter pub get - name: Build App Bundle run: | flutter build appbundle \ --no-tree-shake-icons \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ --build-name=${{ needs.determine-version.outputs.next_version }} - name: Upload AAB Artifact uses: actions/upload-artifact@v4 with: name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.aab path: build/app/outputs/bundle/skyRelease/app-sky-release.aab # 并行 Job 3:iOS IPA build-ios: name: 🍎 Build iOS needs: determine-version runs-on: macos # 必须使用 macOS runner steps: - name: Checkout Code uses: actions/checkout@v4 - name: Setup Flutter run: flutter pub get - name: Build iOS run: | flutter build ios \ --no-codesign \ --flavor sky \ -t lib/main_sky_dev.dart \ --build-number=${{ needs.determine-version.outputs.build_number }} \ --build-name=${{ needs.determine-version.outputs.next_version }} - name: Upload IPA Artifact uses: actions/upload-artifact@v4 with: name: starlock-sky-dev-${{ needs.determine-version.outputs.next_version_full }}.ipa path: build/ios/ipa/Runner.ipa # 最后一个 job:汇总并打 tag publish: name: 🏷️ Create Tag & Notify needs: [build-apk, build-aab, build-ios] runs-on: sky if: success() steps: - name: Checkout Code uses: actions/checkout@v4 - name: Create and Push New Tag run: | NEW_TAG=${{ needs.determine-version.outputs.next_version_full }} git config user.name "Gitea Runner" git config user.email "runner@gitea.local" git tag "$NEW_TAG" git push origin "$NEW_TAG" || echo "Tag $NEW_TAG already exists"