From eedcc0f5f362aa33bddc36b1950fbd0d091c954f Mon Sep 17 00:00:00 2001 From: CI Bot Date: Tue, 2 Jun 2026 21:19:57 +0800 Subject: [PATCH] Initial commit with CI/CD --- .gitea/workflows/android-release.yml | 60 +++++++++++++++++++++++++++ .gitea/workflows/build.gradle.signed | 45 ++++++++++++++++++++ app/build.gradle | 32 ++++++++++++++ build.gradle | 20 +++++++++ release.keystore | Bin 0 -> 2818 bytes settings.gradle | 2 + 6 files changed, 159 insertions(+) create mode 100644 .gitea/workflows/android-release.yml create mode 100644 .gitea/workflows/build.gradle.signed create mode 100644 app/build.gradle create mode 100644 build.gradle create mode 100644 release.keystore create mode 100644 settings.gradle diff --git a/.gitea/workflows/android-release.yml b/.gitea/workflows/android-release.yml new file mode 100644 index 0000000..72639d8 --- /dev/null +++ b/.gitea/workflows/android-release.yml @@ -0,0 +1,60 @@ +name: Android Release + +on: + push: + tags: + - 'v*' + +jobs: + release: + runs-on: android + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Setup Java 17 + run: | + export JAVA_HOME=/usr/lib/jvm/java-17-openjdk + export PATH=$JAVA_HOME/bin:$PATH + java -version + + - name: Setup Keystore + run: | + mkdir -p app + echo '${{ secrets.KEYSTORE_BASE64 }}' | base64 -d > app/release.keystore + + - name: Setup Gradle Properties + run: | + echo 'android.aapt2FromMavenOverride=/usr/bin/aapt2' > gradle.properties + echo 'org.gradle.daemon=false' >> gradle.properties + echo 'org.gradle.jvmargs=-Xmx2g' >> gradle.properties + echo 'android.useAndroidX=true' >> gradle.properties + + - name: Copy build.gradle + run: cp .gitea/workflows/build.gradle.signed app/build.gradle + + - name: Build Signed APK + env: + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + run: | + export ANDROID_HOME=/opt/android-sdk + export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH + gradle assembleRelease --no-daemon --stacktrace + VERSION=${GITHUB_REF#refs/tags/} + cp app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/app-${VERSION}-signed.apk + echo "APK_NAME=app-${VERSION}-signed.apk" >> $GITHUB_ENV + + - name: Create Release + run: | + VERSION=${GITHUB_REF#refs/tags/} + RESPONSE=$(curl -s -X POST "https://gitea.kg8.net/api/v1/repos/${{ github.repository }}/releases" -H "Authorization: token ${{ secrets.ACTIONS_TOKEN }}" -H "Content-Type: application/json" -d "{\"tag_name\":\"$VERSION\",\"name\":\"Release $VERSION\",\"draft\":false,\"prerelease\":false}") + RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) + echo "RELEASE_ID=$RELEASE_ID" >> $GITHUB_ENV + + - name: Upload APK + run: | + curl -s -X POST "https://gitea.kg8.net/api/v1/repos/${{ github.repository }}/releases/${{ env.RELEASE_ID }}/assets" -H "Authorization: token ${{ secrets.ACTIONS_TOKEN }}" -F "attachment=@app/build/outputs/apk/release/${{ env.APK_NAME }}" + echo '✅ APK 上传成功!' diff --git a/.gitea/workflows/build.gradle.signed b/.gitea/workflows/build.gradle.signed new file mode 100644 index 0000000..8d311bb --- /dev/null +++ b/.gitea/workflows/build.gradle.signed @@ -0,0 +1,45 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.newapp' + compileSdk 34 + + defaultConfig { + applicationId 'com.example.newapp' + minSdk 24 + targetSdk 34 + versionCode 1 + versionName '1.0' + } + + signingConfigs { + release { + storeFile file('release.keystore') + storePassword System.getenv('KEYSTORE_PASSWORD') + keyAlias System.getenv('KEY_ALIAS') + keyPassword System.getenv('KEY_PASSWORD') + v1SigningEnabled true + v2SigningEnabled true + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled false + shrinkResources false + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' +} diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..9c5c06f --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,32 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.example.newapp' + compileSdk 34 + + defaultConfig { + applicationId 'com.example.newapp' + minSdk 24 + targetSdk 34 + versionCode 1 + versionName '1.0' + } + + buildTypes { + release { + minifyEnabled false + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +dependencies { + implementation 'androidx.appcompat:appcompat:1.6.1' + implementation 'com.google.android.material:material:1.11.0' +} diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..252492e --- /dev/null +++ b/build.gradle @@ -0,0 +1,20 @@ +buildscript { + repositories { + google() + mavenCentral() + } + dependencies { + classpath 'com.android.tools.build:gradle:8.1.0' + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/release.keystore b/release.keystore new file mode 100644 index 0000000000000000000000000000000000000000..a1bdf10c56fb8efb01aed8c1eb9905ea595f8b1e GIT binary patch literal 2818 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 literal 0 HcmV?d00001 diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..e7fd690 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'android-new-app' +include ':app'