Skip to content

Jenkins + Flutter Android 自动打包与上传教程

本文介绍如何在 Jenkins 中配置 Flutter 项目的 Android 打包流水线,并通过 Python 脚本上传 APK 文件。

环境准备

  1. 安装 Flutter SDK
    将 Flutter SDK 安装到服务器,并配置好环境变量。

  2. 安装 Jenkins 插件

  3. Git 插件
  4. Pipeline 插件
  5. SSH Agent 插件(如果需要使用 SSH 拉取代码)

  6. 准备 Android 签名文件
    在 Android 项目中配置好 key.properties,并保证 keystore 文件路径正确。

  7. 准备上传脚本
    使用 Python 脚本(如 upload.py)实现 APK 上传逻辑,例如上传到内网服务器或第三方平台。

Jenkinsfile 流水线说明

流水线包含以下几个阶段:

  1. Clean Workspace
    清理工作区,避免残留文件影响构建。

  2. Checkout Code
    从 Git 仓库拉取指定分支代码。

  3. Check Flutter Version
    打印当前使用的 Flutter SDK 路径和版本,确保环境正确。

  4. Flutter Pub Get
    执行 flutter pub get 安装依赖。

  5. Build Android Release APK
    使用 Flutter 构建发布版本 APK,支持多架构。

  6. Find and Copy APK
    在构建目录中查找 APK 文件,并复制到指定输出路径。

  7. Publish APK using Python Script
    调用 Python 脚本上传 APK 文件。

  8. Post Always
    无论构建是否成功,最后都清理工作区。

完整 Jenkinsfile

pipeline {
    agent any

    environment {
        // Flutter SDK 路径
        FLUTTER_ROOT = '/Users/<用户名>/jenkins/ios_project/flutter'
        PATH = "/Users/<用户名>/jenkins/ios_project/flutter/bin:${env.PATH}"

        // Android keystore 路径
        ANDROID_KEYSTORE = '/Users/<用户名>/jenkins/ios_project/my-release-key.keystore'

        // APK 导出和上传路径
        EXPORT_DIR = '/Users/<用户名>/jenkins/ios_project/android'
        APK_OUTPUT_PATH = '/Users/<用户名>/jenkins/ios_project/android/apk'
        UPLOAD_SCRIPT = '/Users/<用户名>/jenkins/ios_project/android/upload.py'
    }

    parameters {
        string(name: 'BRANCH_NAME', defaultValue: 'test', description: 'Git 分支名')
    }

    stages {
        stage('Clean Workspace') {
            steps {
                sh 'rm -rf project_dir'
            }
        }

        stage('Checkout Code') {
            steps {
                sshagent(credentials: ['your-ssh-credential-id']) {
                    sh "git clone -b ${params.BRANCH_NAME} git@your.git.repo:your_project.git"
                }
            }
        }

        stage('Check Flutter Version') {
            steps {
                sh '''
                echo "Flutter path: $(which flutter)"
                flutter --version
                '''
            }
        }

        stage('Flutter Pub Get') {
            steps {
                dir('project_dir') {
                    sh "${FLUTTER_ROOT}/bin/flutter pub get"
                }
            }
        }

        stage('Build Android Release APK') {
            steps {
                dir('project_dir') {
                    sh """
                    ${FLUTTER_ROOT}/bin/flutter build apk --release --no-shrink --target-platform android-arm,android-arm64,android-x64
                    """
                }
            }
        }

        stage('Find and Copy APK') {
            steps {
                script {
                    def apkPath = findFiles(glob: '**/build/app/outputs/flutter-apk/app-release.apk')
                    if (apkPath && apkPath.length > 0) {
                        env.APK_PATH = apkPath[0].path
                        echo "找到 APK 文件: ${env.APK_PATH}"

                        // 创建 APK 输出目录并复制 APK
                        sh "mkdir -p ${APK_OUTPUT_PATH}"
                        sh "cp ${env.APK_PATH} ${APK_OUTPUT_PATH}/"
                        echo "APK 已复制到: ${APK_OUTPUT_PATH}"
                    } else {
                        error "未找到 APK 文件"
                    }
                }
            }
        }

        stage('Publish APK using Python Script') {
            steps {
                script {
                    def apkFilePath = "${APK_OUTPUT_PATH}/app-release.apk"
                    echo "调用 Python 脚本上传 APK: ${apkFilePath}"
                    sh "python3 ${UPLOAD_SCRIPT} ${apkFilePath}"
                }
            }
        }
    }

    post {
        always {
            cleanWs()
        }
    }
}

完成以上配置后,每次构建 Jenkins 流水线时,都会自动:

  1. 拉取代码
  2. 安装依赖
  3. 编译生成 APK
  4. 将 APK 拷贝到指定目录
  5. 调用 Python 脚本上传

这样即可实现 Android 自动打包与分发。