我在Jenkins mailing list上问了这个问题。
我有一个上游组件libraryA,我通过Maven作业jobA构建,归档和部署。这很好。我有一个下游Maven作业jobB,它依赖于libraryA。这也很棒,除了……
我有一个完全独立的管道作业,即Jenkinsfile指定的pipelineA。在该Jenkinsfile中,我构建了一个我不想存档或部署的libraryA的特定分支。在我的Jenkinsfile中,我有“ withMaven(mavenLocalRepo:'libraryA / .repository',PublisherStrategy:'EXPLICIT')”,以及其中的“ sh”“” […] mvn清洁包sonar:sonar [...]”””(这里的任何拼写错误可能都是我在此处键入错误的原因,因为我没有复制粘贴。执行这些步骤时,Jenkins没有错误。)我也尝试使用“选项:[artifactsPublisher(disabled:true)]”代替“ publisherStrategy:'EXPLICIT'”,结果相同。我已经验证了pipelineA构建libraryA时,它不会部署到我的远程Maven存储库中,并且我希望它不会被部署到那里。好。
那怎么办?
好吧,如果我先构建pipelineA,然后再构建jobB,则jobB从pipelineA获取它的库A副本,从而导致构建失败。如果然后运行jobA,jobB将按预期成功。
我可以在分支PipelineA构建中更改libraryA的版本,但我不愿意这样做,因为它不适用于我的特定用例。我还能做什么?我错过了什么? (我没有管理这个Jenkins实例,因此在这方面我的访问受到限制。)
为清楚起见,这里是管道的Jenkinsfile的近似值:
#!groovy
pipeline {
environment {
GIT_CREDENTIAL_ID = 'git_credential_name'
}
agent any
tools {
maven 'internal_maven'
jdk 'openjdk'
git 'internal_git'
}
stages {
stage('Build Parent') {
steps {
checkoutRepos([[checkoutDir: 'parent', branch: 'gold', url: 'ssh://git@fake-git-url/parent.git']], env.GIT_CREDENTIAL_ID)
withMaven(publisherStrategy: 'EXPLICIT') {
sh """
cd parent
mvn -U clean verify
"""
}
stash name: 'parent', includes: 'pom.xml'
}
}
stage('Build libraryParent') {
steps {
unstash 'parent'
checkoutRepos([[checkoutDir: 'libraryParent', branch: 'gold', url: 'ssh://git@fake-git-url/libraryParent.git']], env.GIT_CREDENTIAL_ID)
withMaven(mavenLocalRepo: 'libraryParent/.repository', publisherStrategy: 'EXPLICIT') {
sh """
mvn install:install-file -Dpackaging=pom -Dfile=pom.xml -DpomFile=pom.xml
cd libraryParent
mvn clean verify -P jacoco sonar:sonar -U -Dsonar.host.url=https://fake-sonar-url -Dsonar.scm.provider=git
"""
}
dir('libraryParent/libraryA/target/') {
stash name: 'libraryA', includes: 'libraryA-1000-SNAPSHOT.jar'
}
}
}
stage('Build appA') {
steps {
sonarAnApp 'appA'
}
}
stage('Build appB') {
steps {
sonarAnApp 'appB'
}
}
stage('Build appC') {
steps {
sonarAnApp 'appC'
}
}
}
}
def sonarAnApp(final String appName) {
unstash 'parent'
unstash 'libraryA'
checkoutRepos([[checkoutDir: appName, branch: 'gold', url: "ssh://git@fake-git-url/${appName}.git"]], env.GIT_CREDENTIAL_ID)
withMaven(mavenLocalRepo: "$appName/.repository", publisherStrategy: 'EXPLICIT') {
sh """
mvn install:install-file -Dpackaging=pom -Dfile=pom.xml -DpomFile=pom.xml
mvn install:install-file -Dfile=libraryA-1000-SNAPSHOT.jar
cd $appName
mvn clean verify -P jacoco sonar:sonar -U -Dsonar.host.url=https://fake-sonar-url -Dsonar.scm.provider=git
"""
}
}