存在内部npm包依赖的Monorepo如何修改Jenkinsfile解决发布构建失败问题
多包Monorepo本地Artifactory npm发布的Jenkinsfile调整方案
核心问题定位
- 目录路径配置与实际仓库结构不匹配:当前仓库
packages目录下直接存放各npm包目录,不存在packages/tasks中间层级,原配置的包路径全部无效,构建流程无法定位到对应包的工作目录 - 包执行顺序不符合内部依赖规则:
@ds/cy-uncaught-exceptions-task依赖@ds/cy-log-task,原配置的包列表优先发布上层依赖包、最后发布底层被依赖包,导致发布环节无法从本地Artifactory拉取到匹配版本的内部依赖,触发发布报错 - 版本规则场景配置不对齐:master分支PR场景下的版本号处理逻辑未和主干提交场景对齐,易出现版本校验冲突
调整后的完整Jenkinsfile配置
// 严格按照依赖优先级排序:无内部依赖的底层包先执行发布,依赖其他内部包的上层包后执行 def packages = [ '@ds/cy-log-task': [ projectDir: 'packages/cy-log-task' ], '@ds/cy-ds-thycotic-task': [ projectDir: 'packages/cy-ds-thycotic-task' ], '@ds/cy-browser-launch-task': [ projectDir: 'packages/cy-browser-launch-task' ], // 包目录落地后将路径替换为实际位置即可 '@ds/cy-uncaught-exceptions-task': [ projectDir: 'packages/cy-uncaught-exceptions-task' ] ] def conditionals = [ [ condition: { env.TARGET_BRANCH == 'master' && env.SCM_ACTION == 'commit' }, overrides: [ nodejsPublish: true, pushVersionTag: true, // 强制串行发布,避免多包并行导致的依赖竞态 parallelJobs: 1, applicationPackages: packages.collectEntries { key, value -> [(key): value + [ bumpPatchVersion: true ]] } ] ], [ condition: { env.TARGET_BRANCH == 'master' && env.SCM_ACTION == 'pull_request' }, overrides: [ nodejsPublish: true, parallelJobs: 1, applicationPackages: packages.collectEntries { key, value -> [(key): value + [ publishArgs: '--tag pr', versionSuffixValue: { 'pr.' + env.ARTIFACT_BUILD_NUMBER }, // 对齐主干版本规则,避免PR预发布版本冲突 bumpPatchVersion: true ]] } ] ] ]
关键调整说明
- 修正所有包的
projectDir路径,移除不存在的tasks中间层级,完全匹配实际仓库目录结构 - 重新排序包的发布优先级,保证
@ds/cy-log-task先完成发布到本地Artifactory后,再执行依赖它的@ds/cy-uncaught-exceptions-task发布流程,从根源上解决内部依赖拉取失败的报错 - 新增
parallelJobs: 1配置,强制发布流程串行执行,杜绝多包并行发布时,依赖包尚未发布完成就被拉取的竞态问题 - 对齐PR场景与主干提交场景的版本 bump 规则,避免预发布版本与正式版本的号段冲突,保证本地Artifactory的包版本可追溯
- 后续新增其他包时,需同步在
packages列表中追加对应配置,路径填写实际的包目录位置,同时按照内部依赖关系调整列表顺序,保证被依赖的包排在发布队列靠前位置
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

