name: build on: push: tags: - 'v*' env: IS_STABLE: ${{ !contains(github.ref, '-') }} jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: include: - platform: android os: ubuntu-latest - platform: windows os: Windows-2022 arch: amd64 - platform: linux os: ubuntu-22.04 arch: amd64 - platform: macos os: macos-13 arch: amd64 - platform: macos os: macos-latest arch: arm64 - platform: windows os: windows-11-arm arch: arm64 - platform: linux os: ubuntu-24.04-arm arch: arm64 steps: - name: Setup rust if: startsWith(matrix.os, 'windows-11-arm') run: | Invoke-WebRequest -Uri "https://win.rustup.rs/aarch64" -OutFile rustup-init.exe .\rustup-init.exe -y --default-toolchain stable $cargoPath = "$env:USERPROFILE\.cargo\bin" Add-Content $env:GITHUB_PATH $cargoPath - name: Checkout uses: actions/checkout@v4 with: submodules: recursive - name: Setup Android Signing if: startsWith(matrix.platform,'android') run: | echo "${{ secrets.KEYSTORE }}" | base64 --decode > android/app/keystore.jks echo "${{ secrets.SERVICE_JSON }}" | base64 --decode > android/app/google-services.json echo "keyAlias=${{ secrets.KEY_ALIAS }}" >> android/local.properties echo "storePassword=${{ secrets.STORE_PASSWORD }}" >> android/local.properties echo "keyPassword=${{ secrets.KEY_PASSWORD }}" >> android/local.properties - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.24.0' cache-dependency-path: | core/go.sum - name: Setup Flutter Master if: startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm') uses: subosito/flutter-action@v2 with: channel: 'master' cache: true - name: Setup Flutter if: ${{ !(startsWith(matrix.os, 'windows-11-arm') || startsWith(matrix.os, 'ubuntu-24.04-arm')) }} uses: subosito/flutter-action@v2 with: channel: 'stable' cache: true # flutter-version: 3.29.3 - name: Get Flutter Dependency run: flutter pub get - name: Setup run: dart setup.dart ${{ matrix.platform }} ${{ matrix.arch && format('--arch {0}', matrix.arch) }} ${{ env.IS_STABLE == 'true' && '--env stable' || '' }} - name: Upload uses: actions/upload-artifact@v4 with: name: artifact-${{ matrix.platform }}${{ matrix.arch && format('-{0}', matrix.arch) }} path: ./dist overwrite: true changelog: runs-on: ubuntu-latest needs: [ build ] steps: - name: Checkout uses: actions/checkout@v4 if: ${{ env.IS_STABLE == 'true' }} with: fetch-depth: 0 ref: refs/heads/main - name: Generate if: ${{ env.IS_STABLE == 'true' }} run: | tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate)) preTag=$(grep -oP '^## \K.*' CHANGELOG.md | head -n 1) currentTag="" for ((i = 0; i <= ${#tags[@]}; i++)); do if (( i < ${#tags[@]} )); then tag=${tags[$i]} else tag="" fi if [ -n "$currentTag" ]; then if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then break fi fi if [ -n "$currentTag" ]; then echo "## $currentTag" >> NEW_CHANGELOG.md echo "" >> NEW_CHANGELOG.md if [ -n "$tag" ]; then git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md else git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> NEW_CHANGELOG.md fi echo "" >> NEW_CHANGELOG.md fi currentTag=$tag done cat CHANGELOG.md >> NEW_CHANGELOG.md cat NEW_CHANGELOG.md > CHANGELOG.md - name: Commit if: ${{ env.IS_STABLE == 'true' }} run: | git add CHANGELOG.md if ! git diff --cached --quiet; then echo "Commit pushing" git config --local user.email "chen08209@gmail.com" git config --local user.name "chen08209" git commit -m "Update changelog" git push if [ $? -eq 0 ]; then echo "Push succeeded" else echo "Push failed" exit 1 fi fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} upload: permissions: write-all needs: [ build ] runs-on: ubuntu-latest services: telegram-bot-api: image: aiogram/telegram-bot-api:latest env: TELEGRAM_API_ID: ${{ secrets.TELEGRAM_API_ID }} TELEGRAM_API_HASH: ${{ secrets.TELEGRAM_API_HASH }} ports: - 8081:8081 steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Download uses: actions/download-artifact@v4 with: path: ./dist/ pattern: artifact-* merge-multiple: true - name: Generate release.md run: | tags=($(git tag --merged $(git rev-parse HEAD) --sort=-creatordate)) preTag=$(curl --silent "https://api.github.com/repos/chen08209/FlClash/releases/latest" | grep -Po '"tag_name": "\K.*?(?=")' || echo "") currentTag="" for ((i = 0; i <= ${#tags[@]}; i++)); do if (( i < ${#tags[@]} )); then tag=${tags[$i]} else tag="" fi if [ -n "$currentTag" ]; then if [ "$(echo -e "$currentTag\n$preTag" | sort -V | head -n 1)" == "$currentTag" ]; then break fi fi if [ -n "$currentTag" ]; then if [ -n "$tag" ]; then git log --pretty=format:"%B" "$tag..$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md else git log --pretty=format:"%B" "$currentTag" | awk 'NF {print "- " $0} !NF {print ""}' >> release.md fi echo "" >> release.md fi currentTag=$tag done - name: Push to telegram env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TAG: ${{ github.ref_name }} RUN_ID: ${{ github.run_id }} run: | python -m pip install --upgrade pip pip install requests python release_telegram.py - name: Patch release.md run: | version=$(echo "${{ github.ref_name }}" | sed 's/^v//') sed "s|VERSION|$version|g" ./.github/release_template.md >> release.md - name: Generate sha256 if: env.IS_STABLE == 'true' run: | cd ./dist for file in $(find . -type f -not -name "*.sha256"); do sha256sum "$file" > "${file}.sha256" done - name: Release if: ${{ env.IS_STABLE == 'true' }} uses: softprops/action-gh-release@v2 with: files: ./dist/* body_path: './release.md' - name: Create Fdroid Source Dir if: ${{ env.IS_STABLE == 'true' }} run: | mkdir -p ./tmp cp ./dist/*android-arm64-v8a* ./tmp/ || true echo "Files copied successfully" - name: Push to fdroid repo if: ${{ env.IS_STABLE == 'true' }} uses: cpina/github-action-push-to-another-repository@v1.7.2 env: SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} with: source-directory: ./tmp/ destination-github-username: chen08209 destination-repository-name: FlClash-fdroid-repo user-name: 'github-actions[bot]' user-email: 'github-actions[bot]@users.noreply.github.com' target-branch: main commit-message: Update from ${{ github.ref_name }} target-directory: /tmp/