GitLab CI无法在Job间传递目录及文件问题求助
GitLab CI跨Job传递HOME目录文件的解决方案
GitLab CI的artifacts仅支持上传项目工作目录内的文件,你配置的/home/user是绝对路径,不属于项目目录范围,所以触发警告并导致文件上传失败,job_b自然无法获取到所需文件。
修改方案
核心思路是把需要传递的文件先放到项目内的临时目录,通过artifacts传递后,再在job_b中移回真实HOME路径:
- 在job_a中,创建项目内的临时目录模拟HOME结构,同时复制文件到真实HOME和临时目录(保证job_a正常执行Ansible)
- 配置artifacts指向项目内的临时目录
- 在job_b中,将下载的临时目录内容移回真实HOME路径,再执行Ansible剧本
修改后的完整CI配置
job_a: stage: build script: # 创建项目内的临时目录,复刻HOME的目录结构 - mkdir -p ./ci_artifacts/${HOME}/.ssh ./ci_artifacts/${HOME}/files ./ci_artifacts/${HOME}/inventory ./ci_artifacts/${HOME}/a_playbooks ./ci_artifacts/${HOME}/roles # 同步复制文件到真实HOME和临时目录 - cp $ssh_key ${HOME}/.ssh/ && cp $ssh_key ./ci_artifacts/${HOME}/.ssh/ - cp config ${HOME}/.ssh/config && cp config ./ci_artifacts/${HOME}/.ssh/config - cp -r dir/files/ ${HOME}/files/ && cp -r dir/files/ ./ci_artifacts/${HOME}/files/ - cp -r dir/inventory/ ${HOME}/inventory && cp -r dir/inventory/ ./ci_artifacts/${HOME}/inventory - cp -r playbooks ${HOME}/a_playbooks && cp -r playbooks ./ci_artifacts/${HOME}/a_playbooks - cp dir/ansible.cfg ${HOME}/ansible.cfg && cp dir/ansible.cfg ./ci_artifacts/${HOME}/ansible.cfg - cp dir/site.yml ${HOME}/site.yml && cp dir/site.yml ./ci_artifacts/${HOME}/site.yml - cp -r dir/roles ${HOME}/roles && cp -r dir/roles ./ci_artifacts/${HOME}/roles # 执行job_a的Ansible剧本 - ansible-playbook -i ${HOME}/inventory/hosts.yml ${HOME}/site.yml when: manual artifacts: paths: - ./ci_artifacts/ expire_in: 1 week job_b: stage: build dependencies: - job_a script: # 将artifacts中的文件移回真实HOME路径 - cp -r ./ci_artifacts/${HOME}/* ${HOME}/ # 可选:验证文件是否正常部署 - ls -lrth ${HOME}/.ssh/ - ls -lrth ${HOME}/files/ # 执行job_b的Ansible剧本 - ansible-playbook -i ${HOME}/inventory/my-cluster/hosts.yml ${HOME}/a_playbooks/site.yml when: manual
关键说明
- 临时目录
./ci_artifacts/${HOME}完全复刻真实HOME的结构,确保job_b移动后文件路径与job_a完全一致 - 复制文件时同步操作真实HOME和临时目录,既保证job_a能正常执行Ansible,又能收集文件到artifacts
- job_b无需重复处理原始文件,直接通过artifacts传递的内容恢复HOME环境
内容的提问来源于stack exchange,提问作者khaled lhale
相关产品推荐
相关产品推荐

