diff --git a/.github/workflows/build-beta.yml b/.github/workflows/build-beta.yml index 3db406106..8708313f1 100644 --- a/.github/workflows/build-beta.yml +++ b/.github/workflows/build-beta.yml @@ -1,119 +1,48 @@ -name: Beta 构建 - +name: 构建APK on: - push: - branches: [dev] - paths: ['package.json'] workflow_dispatch: - inputs: - force_build: - description: '强制构建 Beta 版本' - required: false - default: 'false' - type: boolean + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true jobs: - check-version: - if: github.actor == 'maotoumao' || github.event_name == 'push' + build: runs-on: ubuntu-latest - outputs: - should_build: ${{ steps.version_check.outputs.should_build }} - version: ${{ steps.version_check.outputs.version }} - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Check version format - id: version_check - run: | - VERSION=$(node -p "require('./package.json').version") - echo "Current version: $VERSION" - - # 检查版本是否符合 -beta.xx 格式 - if [[ $VERSION =~ -beta\.[0-9]{1,2}$ ]]; then - echo "✅ Version matches beta format: $VERSION" - echo "should_build=true" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - elif [[ "${{ github.event_name }}" == "workflow_dispatch" && "${{ inputs.force_build }}" == "true" ]]; then - echo "🔧 Force build triggered by workflow_dispatch" - echo "should_build=true" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - else - echo "❌ Version does not match beta format or not forced: $VERSION" - echo "should_build=false" >> $GITHUB_OUTPUT - fi - - build-beta: - needs: check-version - if: needs.check-version.outputs.should_build == 'true' - runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: Setup Java + # 安装 JDK(安卓打包必须) + - name: 安装 JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' - cache: 'gradle' - - name: Setup Node.js + # 安装 Node.js 24 + - name: 安装 Node.js 24 uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'npm' - - - name: Cache React Native dependencies - uses: actions/cache@v4 with: - path: | - node_modules - ~/.gradle/caches - ~/.gradle/wrapper - android/.gradle - key: ${{ runner.os }}-rn-${{ hashFiles('package-lock.json', 'android/gradle/wrapper/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-rn- + node-version: 24 + cache: 'yarn' - - name: Install Dependencies - run: npm ci --prefer-offline --no-audit - - - name: Setup Keystore (if secrets available) - if: ${{ secrets.RELEASE_KEYSTORE_BASE64 != '' }} - run: | - echo "${{ secrets.RELEASE_KEYSTORE_BASE64 }}" | base64 -d > android/app/release.keystore - cat > android/keystore.properties << 'EOF' - RELEASE_STORE_FILE=release.keystore - RELEASE_STORE_PASSWORD=${{ secrets.RELEASE_STORE_PASSWORD }} - RELEASE_KEY_ALIAS=${{ secrets.RELEASE_KEY_ALIAS }} - RELEASE_KEY_PASSWORD=${{ secrets.RELEASE_KEY_PASSWORD }} - EOF - chmod 600 android/keystore.properties android/app/release.keystore - - - name: Make gradlew executable - run: chmod +x android/gradlew + # 安装项目依赖 + - name: 安装依赖 + run: yarn install - - name: Build Beta APK - run: | - cd android - ./gradlew assembleRelease --parallel --build-cache --configure-on-demand + # 关键:给 gradlew 加执行权限(Linux 必须) + - name: 赋予 gradlew 执行权限 + run: chmod +x ./android/gradlew - - name: List generated APKs + # 直接用 Linux 原生命令打包,绕开 package.json 里的 Windows 命令 + - name: 构建 Release APK run: | - echo "📱 Generated APK files:" - find android/app/build/outputs/apk/release -name "*.apk" -exec ls -lh {} \; + cd android + ./gradlew assembleRelease - - name: Upload Beta APKs + # 上传正确路径的 APK + - name: 上传 APK uses: actions/upload-artifact@v4 with: - name: beta-apks-${{ needs.check-version.outputs.version }} - path: android/app/build/outputs/apk/release/*.apk - retention-days: 30 - - - name: Build Summary - run: | - echo "🎉 Beta build completed successfully!" - echo "📦 Version: ${{ needs.check-version.outputs.version }}" - echo "🚀 Triggered by: ${{ github.event_name }}" - echo "👤 Actor: ${{ github.actor }}" + name: MusicFree-APK + path: android/app/build/outputs/apk/release/app-release.apk diff --git a/.github/workflows/google.yml b/.github/workflows/google.yml new file mode 100644 index 000000000..dcbf112a4 --- /dev/null +++ b/.github/workflows/google.yml @@ -0,0 +1,116 @@ +# This workflow will build a docker container, publish it to Google Container +# Registry, and deploy it to GKE when there is a push to the "master" +# branch. +# +# To configure this workflow: +# +# 1. Enable the following Google Cloud APIs: +# +# - Artifact Registry (artifactregistry.googleapis.com) +# - Google Kubernetes Engine (container.googleapis.com) +# - IAM Credentials API (iamcredentials.googleapis.com) +# +# You can learn more about enabling APIs at +# https://support.google.com/googleapi/answer/6158841. +# +# 2. Ensure that your repository contains the necessary configuration for your +# Google Kubernetes Engine cluster, including deployment.yml, +# kustomization.yml, service.yml, etc. +# +# 3. Create and configure a Workload Identity Provider for GitHub: +# https://github.com/google-github-actions/auth#preferred-direct-workload-identity-federation. +# +# Depending on how you authenticate, you will need to grant an IAM principal +# permissions on Google Cloud: +# +# - Artifact Registry Administrator (roles/artifactregistry.admin) +# - Kubernetes Engine Developer (roles/container.developer) +# +# You can learn more about setting IAM permissions at +# https://cloud.google.com/iam/docs/manage-access-other-resources +# +# 5. Change the values in the "env" block to match your values. + +name: 'Build and Deploy to GKE' + +on: + push: + branches: + - '"master"' + +env: + PROJECT_ID: 'my-project' # TODO: update to your Google Cloud project ID + GAR_LOCATION: 'us-central1' # TODO: update to your region + GKE_CLUSTER: 'cluster-1' # TODO: update to your cluster name + GKE_ZONE: 'us-central1-c' # TODO: update to your cluster zone + DEPLOYMENT_NAME: 'gke-test' # TODO: update to your deployment name + REPOSITORY: 'samples' # TODO: update to your Artifact Registry docker repository name + IMAGE: 'static-site' + WORKLOAD_IDENTITY_PROVIDER: 'projects/123456789/locations/global/workloadIdentityPools/my-pool/providers/my-provider' # TODO: update to your workload identity provider + +jobs: + setup-build-publish-deploy: + name: 'Setup, Build, Publish, and Deploy' + runs-on: 'ubuntu-latest' + environment: 'production' + + permissions: + contents: 'read' + id-token: 'write' + + steps: + - name: 'Checkout' + uses: 'actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332' # actions/checkout@v4 + + # Configure Workload Identity Federation and generate an access token. + # + # See https://github.com/google-github-actions/auth for more options, + # including authenticating via a JSON credentials file. + - id: 'auth' + name: 'Authenticate to Google Cloud' + uses: 'google-github-actions/auth@f112390a2df9932162083945e46d439060d66ec2' # google-github-actions/auth@v2 + with: + workload_identity_provider: '${{ env.WORKLOAD_IDENTITY_PROVIDER }}' + + # Authenticate Docker to Google Cloud Artifact Registry + - name: 'Docker Auth' + uses: 'docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567' # docker/login-action@v3 + with: + username: 'oauth2accesstoken' + password: '${{ steps.auth.outputs.auth_token }}' + registry: '${{ env.GAR_LOCATION }}-docker.pkg.dev' + + # Get the GKE credentials so we can deploy to the cluster + - name: 'Set up GKE credentials' + uses: 'google-github-actions/get-gke-credentials@6051de21ad50fbb1767bc93c11357a49082ad116' # google-github-actions/get-gke-credentials@v2 + with: + cluster_name: '${{ env.GKE_CLUSTER }}' + location: '${{ env.GKE_ZONE }}' + + # Build the Docker image + - name: 'Build and push Docker container' + run: |- + DOCKER_TAG="${GAR_LOCATION}-docker.pkg.dev/${PROJECT_ID}/${REPOSITORY}/${IMAGE}:${GITHUB_SHA}" + + docker build \ + --tag "${DOCKER_TAG}" \ + --build-arg GITHUB_SHA="${GITHUB_SHA}" \ + --build-arg GITHUB_REF="${GITHUB_REF}" \ + . + + docker push "${DOCKER_TAG}" + + # Set up kustomize + - name: 'Set up Kustomize' + run: |- + curl -sfLo kustomize https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2Fv5.4.3/kustomize_v5.4.3_linux_amd64.tar.gz + chmod u+x ./kustomize + + # Deploy the Docker image to the GKE cluster + - name: 'Deploy to GKE' + run: |- + # replacing the image name in the k8s template + ./kustomize edit set image LOCATION-docker.pkg.dev/PROJECT_ID/REPOSITORY/IMAGE:TAG=$GAR_LOCATION-docker.pkg.dev/$PROJECT_ID/$REPOSITORY/$IMAGE:$GITHUB_SHA + ./kustomize build . | kubectl apply -f - + kubectl rollout status deployment/$DEPLOYMENT_NAME + kubectl get services -o wide diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 000000000..3acc1d355 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,126 @@ +name: Build Android APK +on: + workflow_dispatch: +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Setup Flutter + uses: subosito/flutter-action@v2 + with: + flutter-version: 3.13.0 + channel: stable + + - name: Flutter doctor + run: flutter doctor + + - name: Install dependencies + run: flutter pub get + + - name: Build Release APK + run: flutter build apk --release --split-per-abi + + - name: Upload APK + uses: actions/upload-artifact@v4 + with: + name: MusicFree-Release-APK + path: build/app/outputs/flutter-apk/ + - name: Setup Java JDK + uses: actions/setup-java@v5.2.0 + with: + # The Java version to set up. Takes a whole or semver Java version. See examples of supported syntax in README file + java-version: # optional + # The path to the `.java-version` file. See examples of supported syntax in README file + java-version-file: # optional + # Java distribution. See the list of supported distributions in README file + distribution: + # The package type (jdk, jre, jdk+fx, jre+fx) + java-package: # optional, default is jdk + # The architecture of the package (defaults to the action runner's architecture) + architecture: # optional + # Path to where the compressed JDK is located + jdkFile: # optional + # Set this option if you want the action to check for the latest available version that satisfies the version spec + check-latest: # optional + # ID of the distributionManagement repository in the pom.xml file. Default is `github` + server-id: # optional, default is github + # Environment variable name for the username for authentication to the Apache Maven repository. Default is $GITHUB_ACTOR + server-username: # optional, default is GITHUB_ACTOR + # Environment variable name for password or token for authentication to the Apache Maven repository. Default is $GITHUB_TOKEN + server-password: # optional, default is GITHUB_TOKEN + # Path to where the settings.xml file will be written. Default is ~/.m2. + settings-path: # optional + # Overwrite the settings.xml file if it exists. Default is "true". + overwrite-settings: # optional, default is true + # GPG private key to import. Default is empty string. + gpg-private-key: # optional + # Environment variable name for the GPG private key passphrase. Default is $GPG_PASSPHRASE. + gpg-passphrase: # optional + # Name of the build platform to cache dependencies. It can be "maven", "gradle" or "sbt". + cache: # optional + # The path to a dependency file: pom.xml, build.gradle, build.sbt, etc. This option can be used with the `cache` option. If this option is omitted, the action searches for the dependency file in the entire repository. This option supports wildcards and a list of file names for caching multiple dependencies. + cache-dependency-path: # optional + # Workaround to pass job status to post job step. This variable is not intended for manual setting + job-status: # optional, default is ${{ job.status }} + # The token used to authenticate when fetching version manifests hosted on github.com, such as for the Microsoft Build of OpenJDK. When running this action on github.com, the default value is sufficient. When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting. + token: # optional, default is ${{ github.server_url == 'https://github.com' && github.token || '' }} + # Name of Maven Toolchain ID if the default name of "${distribution}_${java-version}" is not wanted. See examples of supported syntax in Advanced Usage file + mvn-toolchain-id: # optional + # Name of Maven Toolchain Vendor if the default name of "${distribution}" is not wanted. See examples of supported syntax in Advanced Usage file + mvn-toolchain-vendor: # optional + - name: Setup Java JDK + uses: actions/setup-java@v5.2.0 + with: + # The Java version to set up. Takes a whole or semver Java version. See examples of supported syntax in README file + java-version: # optional + # The path to the `.java-version` file. See examples of supported syntax in README file + java-version-file: # optional + # Java distribution. See the list of supported distributions in README file + distribution: + # The package type (jdk, jre, jdk+fx, jre+fx) + java-package: # optional, default is jdk + # The architecture of the package (defaults to the action runner's architecture) + architecture: # optional + # Path to where the compressed JDK is located + jdkFile: # optional + # Set this option if you want the action to check for the latest available version that satisfies the version spec + check-latest: # optional + # ID of the distributionManagement repository in the pom.xml file. Default is `github` + server-id: # optional, default is github + # Environment variable name for the username for authentication to the Apache Maven repository. Default is $GITHUB_ACTOR + server-username: # optional, default is GITHUB_ACTOR + # Environment variable name for password or token for authentication to the Apache Maven repository. Default is $GITHUB_TOKEN + server-password: # optional, default is GITHUB_TOKEN + # Path to where the settings.xml file will be written. Default is ~/.m2. + settings-path: # optional + # Overwrite the settings.xml file if it exists. Default is "true". + overwrite-settings: # optional, default is true + # GPG private key to import. Default is empty string. + gpg-private-key: # optional + # Environment variable name for the GPG private key passphrase. Default is $GPG_PASSPHRASE. + gpg-passphrase: # optional + # Name of the build platform to cache dependencies. It can be "maven", "gradle" or "sbt". + cache: # optional + # The path to a dependency file: pom.xml, build.gradle, build.sbt, etc. This option can be used with the `cache` option. If this option is omitted, the action searches for the dependency file in the entire repository. This option supports wildcards and a list of file names for caching multiple dependencies. + cache-dependency-path: # optional + # Workaround to pass job status to post job step. This variable is not intended for manual setting + job-status: # optional, default is ${{ job.status }} + # The token used to authenticate when fetching version manifests hosted on github.com, such as for the Microsoft Build of OpenJDK. When running this action on github.com, the default value is sufficient. When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting. + token: # optional, default is ${{ github.server_url == 'https://github.com' && github.token || '' }} + # Name of Maven Toolchain ID if the default name of "${distribution}_${java-version}" is not wanted. See examples of supported syntax in Advanced Usage file + mvn-toolchain-id: # optional + # Name of Maven Toolchain Vendor if the default name of "${distribution}" is not wanted. See examples of supported syntax in Advanced Usage file + mvn-toolchain-vendor: # optional + diff --git a/.github/workflows/webpack.yml b/.github/workflows/webpack.yml new file mode 100644 index 000000000..d72abc20d --- /dev/null +++ b/.github/workflows/webpack.yml @@ -0,0 +1,28 @@ +name: NodeJS with Webpack名称: NodeJS与Webpack + +on:触发: + push:推送: + branches: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ] + pull_request:拉取请求拉取请求: + branches: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ]分支: [ "master" ] + +jobs:作业: + build:构建: + runs-on: ubuntu-latest运行于: ubuntu-latest + + strategy:策略: + matrix:矩阵: + node-version: [18.x, 20.x, 22.x]节点版本: [18.x,20.x,22.x] + + steps:步骤:步骤:步骤:步骤:步骤:步骤:步骤步骤:步骤:步骤:步骤:步骤:步骤:步骤:步骤: + - uses使用: actions/checkout@v4 - 使用: actions/checkout@v4 - 使用: actions/checkout@v4 - 使用: actions/checkout@v4 + + - name: Use Node.js ${{ matrix.node-version }} - name: 使用 Node.js ${{matrix.node-version}} - name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}} - name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}} - name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}} - name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}}- name: 使用 Node.js ${{matrix.node-version}} + uses: actions/setup-node@v4用途: actions/setup-node@v4 + with:与:与:与:与:与:与:与: + node-version: ${{ matrix.node-version }} + + - name: Build - 名称: 构建 - name: 构建 - 名称: 构建 - name: 构建 - 名称: 构建 - 名称: 构建 - name: 构建 - 名称: - name: 构建 - 名称: 构建 - name: 构建 - 名称: 构建 - 名称: 构建 - name: 构建 - 名称: 构建 - 名称: 构建 - 名称: 构建 - 名称: 构建 - name: 构建 - 名称: 构建 - 名称: 构建 - 名称: 构建 - 名称: 构建 - 名称: 构建 + run: |运行: |运行: |运行: |运行: |运行: |运行: |运行: |运行: |运行: |运行: |运行: |运行: | + npm installnpm 安装npm 安装npm 安装 + npx webpack