upload-artifact CI/CD运行是否需上传build文件夹到分支
分支现状
当前开发工作在两个独立分支上开展:
- trunk
- distribute
CI/CD 配置现状
CI/CD流水线配置在distribute分支,向该分支执行push操作时会触发工作流,执行.github/workflow/main.yml中定义的任务,当前配置内容如下:
name: Build & upload to Firebase App Distribution on: [push] jobs: build: runs-on: ubuntu-latest steps: # 检出当前仓库代码 - name: Checkout uses: actions/checkout@v2.4.2 # 上传工作流产物(.apk) - uses: actions/upload-artifact@v3 with: name: release-apk path: build/app/outputs/flutter-apk/app-release.apk # 通过Firebase App Distribution向测试人员分发安装包 - name: Firebase App Distribution uses: wzieba/Firebase-Distribution-Github-Action@v1.3.3 with: appId: ${{secrets.FIREBASE_APP_ID}} token: ${{secrets.FIREBASE_TOKEN} groups: Testers file: build/app/outputs/flutter-apk/app-release.apk
目前/build/目录已被加入.gitignore规则,不会被推送到远端distribute分支,该分支当前仅存放触发CI/CD所需的.github/workflow/main.yml文件。
待解答疑问
- 是否需要将
/build/从.gitignore中移除,把build文件夹推送到distribute分支,才能让upload-artifact读取到路径为build/app/outputs/flutter-apk/app-release.apk的文件? upload-artifact的文件读取来源是什么?是从触发工作流的当前分支读取(当前场景下分支内不存在build文件夹),还是从本地项目目录读取(当前场景下本地存在build文件夹)?
当前工作流运行已出现报错,运行环境为distribute分支,该分支.gitignore已配置忽略/build/目录。
解答
结论先行:不需要把build目录提交到仓库,报错的核心原因是工作流缺少Flutter构建步骤,CI运行环境中根本没有生成apk文件。
针对两个疑问逐一说明:
- 绝对不要把
/build/从.gitignore中移除。build目录是构建过程生成的临时产物,把这类可自动生成、体积大的文件提交到Git仓库是错误实践,会导致仓库体积恶性膨胀、版本历史混乱。 upload-artifact既不读取你本地电脑的文件,也不直接从Git仓库的提交树中找文件,它的读取来源是GitHub Actions分配的临时Runner虚拟机的工作目录:- 你本地电脑上的文件不会自动同步到CI的Runner环境。Runner是全新初始化的Ubuntu虚拟机,执行
actions/checkout步骤时只会拉取触发工作流的当前分支的已提交内容,不会拉取你本地未提交的代码,也不会拉取你本地生成的build目录。 - 你当前的工作流仅执行了代码检出操作,完全没有配置Flutter环境、执行apk构建的步骤,Runner工作目录里自然不存在
build/app/outputs/flutter-apk/app-release.apk文件,这是报错的直接原因。 - 另外你当前的yaml配置存在语法错误:
${{secrets.FIREBASE_TOKEN}缺少右侧闭合大括号,也会导致工作流解析失败。
- 你本地电脑上的文件不会自动同步到CI的Runner环境。Runner是全新初始化的Ubuntu虚拟机,执行
修复方案
在Checkout步骤之后、上传产物步骤之前,补全Java/Flutter环境配置、依赖安装、apk构建步骤,修改后的核心工作流配置参考:
steps: - name: Checkout uses: actions/checkout@v2.4.2 # 配置Android构建所需的Java环境 - name: Setup Java uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: '11' # 配置Flutter环境,版本替换为你本地开发使用的对应版本 - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: '3.10.6' channel: 'stable' # 拉取项目依赖 - name: Install dependencies run: flutter pub get # 构建release版本APK - name: Build release APK run: flutter build apk --release # 原有上传、分发步骤保持不变,注意补全token的闭合大括号 - uses: actions/upload-artifact@v3 with: name: release-apk path: build/app/outputs/flutter-apk/app-release.apk - name: Firebase App Distribution uses: wzieba/Firebase-Distribution-Github-Action@v1.3.3 with: appId: ${{secrets.FIREBASE_APP_ID}} token: ${{secrets.FIREBASE_TOKEN}} groups: Testers file: build/app/outputs/flutter-apk/app-release.apk
内容的提问来源于stack exchange,提问作者Shehroz Ali
相关产品推荐
相关产品推荐

