第六章: 蓝盾CI/CD流水线配置

202 阅读5分钟

本章将详细介绍在蓝盾(Blue Shield)CI/CD环境中配置Flutter Engine自定义构建的完整流程。通过三个核心脚本实现环境配置、Flutter依赖管理和Android项目构建的自动化部署。

目录结构

writer_build_engin_shell/
└── landun_shell_ci/
    ├── config_android.sh    # Android环境配置脚本
    ├── build_flutter.sh     # Flutter环境搭建脚本  
    └── build_android.sh     # Android项目构建脚本

6.1 蓝盾环境概述

6.1.1 蓝盾文件结构

蓝盾CI/CD环境采用固定的目录结构,所有项目文件都位于 /data/landun/workspace 下:

/data/landun/workspace/
├── flutter_sdk/                    # Flutter SDK及自定义引擎
│   ├── bin/                        # Flutter命令行工具
│   └── engine/                     # 自定义引擎源码
│       └── src/                    
│           └── out/                # 编译产物输出目录
│               ├── android_release_arm64/      # Android引擎
│               └── linux_host_release_x64/     # Linux主机工具
├── authorapp/                      # Android项目
│   ├── gradle.properties          # Gradle配置文件
│   ├── local.properties           # 本地环境配置
│   └── app/                        # 应用主模块
└── writer-flutter/                 # Flutter项目
    └── pubspec.yaml               # Flutter依赖配置

6.1.2 环境路径配置

蓝盾环境使用固定的系统工具路径:

# Android开发环境
ANDROID_SDK_PATH="/data/bkdevops/apps/android-sdk-linux/android-sdk_new_with_ndk_new"
ANDROID_NDK_PATH="/data/bkdevops/apps/ndk/android-ndk-r26d"
GRADLE_HOME_PATH="/data/bkdevops/apps/gradle/7.5"

# Flutter引擎路径
FLUTTER_ENGINE_OUT="$WORKSPACE/flutter_sdk/engine/src/out/android_release_arm64"
FLUTTER_ENGINE_HOST_OUT="$WORKSPACE/flutter_sdk/engine/src/out/linux_host_release_x64"

6.2 Android环境配置脚本 (config_android.sh)

6.2.1 脚本功能

负责配置Android项目的Flutter引擎依赖,包括修改 gradle.properties 和创建 local.properties 文件。

6.2.2 核心配置代码

#!/bin/bash
set -e

# 蓝盾环境路径配置
LANDUN_WORKSPACE="/data/landun/workspace"
FLUTTER_SDK_PATH="${LANDUN_WORKSPACE}/flutter_sdk"
ANDROID_PROJECT_PATH="${LANDUN_WORKSPACE}/authorapp"
GRADLE_PROPERTIES_PATH="${ANDROID_PROJECT_PATH}/gradle.properties"

# Android SDK配置
ANDROID_SDK_PATH="/data/bkdevops/apps/android-sdk-linux/android-sdk_new_with_ndk_new"
ANDROID_NDK_PATH="/data/bkdevops/apps/ndk/android-ndk-r26d"

# Flutter引擎路径
FLUTTER_ENGINE_BASE="${FLUTTER_SDK_PATH}/engine/src/out"
FLUTTER_ENGINE_OUT="${FLUTTER_ENGINE_BASE}/android_release_arm64"
FLUTTER_ENGINE_HOST_OUT="${FLUTTER_ENGINE_BASE}/linux_host_release_x64"

6.2.3 环境检查函数

check_environment() {
    # 检查工作目录
    if [ ! -d "${LANDUN_WORKSPACE}" ]; then
        echo "错误: 蓝盾工作目录不存在: ${LANDUN_WORKSPACE}"
        exit 1
    fi
    
    # 检查Android SDK
    if [ ! -d "${ANDROID_SDK_PATH}" ]; then
        echo "错误: Android SDK目录不存在: ${ANDROID_SDK_PATH}"
        exit 1
    fi
    
    # 检查Flutter引擎产物
    if [ ! -d "${FLUTTER_ENGINE_OUT}" ]; then
        echo "错误: Flutter引擎输出目录不存在: ${FLUTTER_ENGINE_OUT}"
        exit 1
    fi
    
    # 验证关键文件
    ENGINE_LIB="${FLUTTER_ENGINE_OUT}/libflutter.so"
    if [ ! -f "${ENGINE_LIB}" ]; then
        echo "错误: 引擎库文件不存在: ${ENGINE_LIB}"
        exit 1
    fi
}

6.2.4 配置文件修改

配置gradle.properties

configure_flutter_engine() {
    # 备份原文件
    cp "${GRADLE_PROPERTIES_PATH}" "${GRADLE_PROPERTIES_PATH}.backup"
    
    # 清理旧配置
    sed -i.tmp \
        -e '/^local-engine-out=/d' \
        -e '/^local-engine-host-out=/d' \
        -e '/^local-engine-build-mode=/d' \
        "${GRADLE_PROPERTIES_PATH}"
    
    # 添加新配置
    cat >> "${GRADLE_PROPERTIES_PATH}" << EOF
# 蓝盾自动配置的Flutter引擎路径
local-engine-out=${FLUTTER_ENGINE_OUT}
local-engine-host-out=${FLUTTER_ENGINE_HOST_OUT}
local-engine-build-mode=release
EOF
}

配置local.properties

configure_local_properties() {
    LOCAL_PROPERTIES_PATH="${ANDROID_PROJECT_PATH}/local.properties"
    
    cat > "${LOCAL_PROPERTIES_PATH}" << EOF
# 蓝盾环境配置
sdk.dir=${ANDROID_SDK_PATH}
flutter.sdk=${FLUTTER_SDK_PATH}
ndk.dir=${ANDROID_NDK_PATH}
EOF
}

6.3 Flutter环境搭建脚本 (build_flutter.sh)

6.3.1 脚本功能

负责在蓝盾环境中搭建Flutter开发环境,包括环境变量配置、依赖安装和版本验证。

6.3.2 核心环境变量配置

#!/bin/bash
set -e

# Git LFS优化配置
export GIT_LFS_SKIP_SMUDGE=1
git config --global lfs.fetchexclude "*"
git config --global lfs.skipdownloaderrors true

WORKSPACE_ROOT=$(pwd)

# Flutter环境变量配置
export FLUTTER_ROOT="$WORKSPACE_ROOT/flutter_sdk"
export FLUTTER_SDK_ROOT="$WORKSPACE_ROOT/flutter_sdk"
export FLUTTER_ENGINE_ROOT="$WORKSPACE_ROOT/flutter_sdk/engine/src"
export FLUTTER_ENGINE_OUT="$WORKSPACE_ROOT/flutter_sdk/engine/src/out"
export FLUTTER_LOCAL_ENGINE="linux_host_release_x64"
export FLUTTER_LOCAL_ENGINE_SRC_PATH="$WORKSPACE_ROOT/flutter_sdk/engine/src"
export PATH="$WORKSPACE_ROOT/flutter_sdk/bin:$WORKSPACE_ROOT/flutter_sdk/engine/src/out/linux_host_release_x64:$PATH"
export FLUTTER_SUPPRESS_ANALYTICS=true
export FLUTTER_NO_ANALYTICS=true
export LANG=en_US.UTF-8

6.3.3 目录结构验证

# 验证目录结构
if [ ! -d "$WORKSPACE_ROOT/flutter_sdk" ]; then
    echo "错误: Flutter SDK 目录不存在: $WORKSPACE_ROOT/flutter_sdk"
    exit 1
fi

if [ ! -d "$WORKSPACE_ROOT/writer-flutter" ]; then
    echo "错误: Flutter 项目目录不存在: $WORKSPACE_ROOT/writer-flutter"
    exit 1
fi

6.3.4 Flutter版本验证

# 验证Flutter版本
flutter --version --verbose

# 检查Dart可用性
if command -v dart >/dev/null 2>&1; then
    dart --version
else
    echo "错误: Dart 不可用"
    exit 1
fi

6.3.5 依赖安装流程

# 清理缓存
flutter pub cache clean

cd "$WORKSPACE_ROOT/writer-flutter"

# 清理并安装依赖
flutter clean
flutter pub get
flutter precache

6.4 Android项目构建脚本 (build_android.sh)

6.4.1 脚本功能

负责执行Android项目的编译打包,使用自定义Flutter引擎进行构建。

6.4.2 核心构建配置

#!/bin/bash

cd ${WORKSPACE}/authorapp
chmod 777 gradlew

origin_dir=${WORKSPACE}/authorapp
output_dir="${origin_dir}/outputs"

# 初始化构建环境
function set_up() {
    if [ -d ${output_dir} ]; then
        rm -rf ${output_dir}
    fi
    mkdir ${output_dir}
    cd ${WORKSPACE}/authorapp
}

set_up

6.4.3 引擎参数配置

# 使用合并后的双架构引擎 - 支持ARM32和ARM64
ENGINE_ARGS="-Plocal-engine-out=${WORKSPACE}/flutter_sdk/engine/src/out/android \
-Plocal-engine-host-out=${WORKSPACE}/flutter_sdk/engine/src/out/linux_host_release_x64 \
-Plocal-engine-build-mode=release \
-Ptarget-platform=android-arm,android-arm64"

6.4.4 构建执行逻辑

if [ ${TYPE} = "debug" ]; then
    if [ ${SOURCE} = "All" ]; then
        ./gradlew clean assembleDebugChannels ${ENGINE_ARGS}
    else
        ./gradlew clean assembleDebugChannels -PchannelList=${SOURCE} ${ENGINE_ARGS}
    fi
else
    if [ ${SOURCE} = "All" ]; then
        ./gradlew clean assembleReleaseChannels ${ENGINE_ARGS}
    else
        ./gradlew clean assembleReleaseChannels -PchannelList=${SOURCE} ${ENGINE_ARGS}
    fi
fi

# 复制构建产物
cp "$WORKSPACE/authorapp/app/build/outputs/channels/"*.apk "${output_dir}"

6.5 蓝盾流水线配置流程

6.5.1 执行顺序

蓝盾流水线按以下顺序执行脚本:

  1. 环境配置阶段: 执行 config_android.sh

    • 配置Android环境路径
    • 设置Flutter引擎依赖
  2. 依赖安装阶段: 执行 build_flutter.sh

    • 搭建Flutter环境
    • 安装项目依赖
  3. 项目构建阶段: 执行 build_android.sh

    • 编译Android项目
    • 生成APK文件

6.5.2 蓝盾流水线YAML配置示例

version: '1.1'
name: Flutter Engine Custom Build
desc: 自定义Flutter引擎Android项目构建流水线

stages:
  - name: 环境配置
    jobs:
      - name: 配置Android环境
        steps:
          - checkout: self
          - script: |
              bash writer_build_engin_shell/landun_shell_ci/config_android.sh

  - name: 依赖安装  
    jobs:
      - name: 安装Flutter依赖
        steps:
          - script: |
              bash writer_build_engin_shell/landun_shell_ci/build_flutter.sh

  - name: 项目构建
    jobs:
      - name: 构建Android项目
        steps:
          - script: |
              bash writer_build_engin_shell/landun_shell_ci/build_android.sh
        artifacts:
          - path: authorapp/outputs/*.apk
            name: android-apk

6.5.3 环境变量配置

蓝盾流水线需要配置以下环境变量:

# 构建类型
TYPE=release

# 构建渠道
SOURCE=All

# 工作目录(蓝盾自动设置)
WORKSPACE=/data/landun/workspace

6.6 关键配置说明

6.6.1 引擎路径映射

蓝盾环境中的引擎路径映射关系:

本地开发环境 → 蓝盾环境
./flutter_sdk/engine/src/out/android → /data/landun/workspace/flutter_sdk/engine/src/out/android_release_arm64
./flutter_sdk/engine/src/out/linux_host_release_x64 → /data/landun/workspace/flutter_sdk/engine/src/out/linux_host_release_x64

6.6.2 Gradle参数传递

通过Gradle参数传递引擎配置:

-Plocal-engine-out=${FLUTTER_ENGINE_OUT}
-Plocal-engine-host-out=${FLUTTER_ENGINE_HOST_OUT} 
-Plocal-engine-build-mode=release
-Ptarget-platform=android-arm,android-arm64

6.6.3 多架构支持

构建脚本支持ARM32和ARM64双架构:

-Ptarget-platform=android-arm,android-arm64

这确保生成的APK在不同ARM架构的Android设备上都能正常运行。

6.7 故障排除

6.7.1 常见问题

  1. 引擎路径不存在

    # 检查引擎目录
    ls -la /data/landun/workspace/flutter_sdk/engine/src/out/
    
  2. 依赖下载失败

    # 清理缓存重试
    flutter pub cache clean
    flutter pub get
    
  3. 构建权限问题

    # 确保gradlew可执行
    chmod 777 gradlew
    

6.7.2 调试建议

  1. 在每个脚本中添加详细的日志输出
  2. 验证关键文件和目录的存在性
  3. 检查环境变量的正确设置
  4. 保留构建产物便于问题定位

总结

本章详细介绍了蓝盾CI/CD环境中Flutter Engine自定义构建的完整配置流程。通过三个核心脚本的协同工作,实现了从环境配置、依赖安装到项目构建的全自动化部署。

关键要点:

  • 遵循蓝盾固定的目录结构和路径规范
  • 正确配置Flutter引擎的本地依赖路径
  • 支持多架构Android应用构建
  • 完善的错误检查和故障恢复机制

这套配置方案为Flutter Engine定制化开发提供了稳定可靠的CI/CD支持,大大提高了开发效率和部署质量。