来自Jenkins我试图做一个maven版本,代码托管在github上,在repo上。对于构建用户,我生成了一个OAuth令牌,以便以RW模式访问存储库。
在Jenkins中,我配置了像https://token@github.com/username/project
这样的存储库结帐网址,没有任何凭据,因为前面的令牌应该足够了。
在我的pom中,因为我确实设置了任何用户名/密码,而不是令牌。价值很简单:
<developerConnection>scm:git:https://github.com/username/project</developerConnection>
但是当maven试图推送pom文件的提交时,我收到了一个错误:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.1:prepare (default-cli) on project cloudstack: Unable to commit files
[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR] fatal: could not read Username for 'https://github.com': No such device or address
[ERROR] -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.1:prepare (default-cli) on project cloudstack: Unable to commit files
Provider message:
The git-push command failed.
Command output:
fatal: could not read Username for 'https://github.com': No such device or address
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
知道如何解决这个问题吗?
答案 0 :(得分:3)
您可以将Maven Release插件配置为不拉动并推送任何更改:
<ListBox x:Name="lbxtgbTab3" FontSize="{StaticResource BUTTON_FONTSIZE}" HorizontalContentAlignment="Stretch" Background="{x:Null}" BorderBrush="{x:Null}" FontWeight="Bold">
<ToggleButton Name="tgb4Tab3" Background="{x:Null}" Height="{StaticResource BUTTON_HEIGHT}" Click="ToggleButton_Click" Padding="0" FontWeight="Bold">
<TextBlock Name="otb4Tab3" Text="4 - GESTIONE P.P." Margin="0" Background="Red" TextAlignment="Center" TextWrapping="Wrap"/>
</ToggleButton>
</ListBox>
在Jenkins中,您可以使用Git Publisher构建后操作来推送您的分支和标记。 Git Publisher将使用您的OAuth凭据。
推送标签并不容易,因为您需要指定Maven生成的确切标签名称,例如: ...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<localCheckout>true</localCheckout>
<pushChanges>false</pushChanges>
</configuration>
</plugin>
...
。
要从生成的POM中解析版本,我在Maven构建步骤后的“Execute Shell”构建步骤中使用XMLStarlet:
foo-2.0.1
该脚本生成包含发行版本的属性文件。使用“注入环境变量”构建步骤(EnvInject Plugin)将属性文件读取为构建环境变量。然后,您可以在“Git Publisher”中将标记名称指定为#!/usr/bin/env bash
VERSION=$(xmlstarlet sel -N x="http://maven.apache.org/POM/4.0.0" -t -v "x:project/x:version" target/checkout/pom.xml)
echo "RELEASE_VERSION=$VERSION" > version.properties
。
这不是很好,但它有效。也许某人有更好的(也更简单)的方式。
答案 1 :(得分:3)
在Jenkins Credentials绑定插件的帮助下,我设法为maven发布插件解决了这个问题。请注意,ssh身份验证不需要此解决方案。 这是有问题的SCM部分:
<scm>
<connection>scm:git:http://${env.GIT_USERNAME}:${env.GIT_PASSWORD}@server.host.name/path/to/project.git</connection>
<url>http://server.host.name/path/to/project.git</url>
<tag>HEAD</tag>
</scm>
然后,我使用with credentials插件,在Jenkins管道脚本中使用以下内容:
withCredentials([[$class: 'UsernamePasswordMultiBinding',
credentialsId: 'id-of-credentials-from-those-set-up-in-Manage-Jenkins',
usernameVariable: 'GIT_USERNAME',
passwordVariable: 'GIT_PASSWORD'
]]) {
performRelease()
}
请注意,env.GIT_USERNAME和withCredentials中设置的变量是相同的,这不是偶然的。
我必须道歉,因为这个解决方案假设您熟悉Jenkins管道脚本。
您可以通过在运行自己的自定义maven发布插件脚本之前在环境中设置git凭据来进行调整。
答案 2 :(得分:0)
我只是通过添加一些变化来遵循user3596523的建议。 这是我遵循的步骤,
根据建议,我在下面添加的行是pom.xml
<scm> <connection>scm:git:http://${GIT_USERNAME}:${GIT_PASSWORD}@server.host.name/path/to/project.git</connection>
<url>http://server.host.name/path/to/project.git</url>
<tag>HEAD</tag>
</scm>
由于我们可以将秘密注入jenkin作业(https://support.cloudbees.com/hc/en-us/articles/203802500-Injecting-Secrets-into-Jenkins-Build-Jobs)中,因此我已使用构建绑定注入了GIT_USERNAME和GIT_PASSWORD。希望它可以绕过创建管道脚本。请按照上面的链接进行详细了解。
答案 3 :(得分:0)
我能够找到另一种处理方式。为此,您将需要
一旦安装配置文件提供程序插件:
将 scm 添加到 pom.xml
<scm>
<connection>scm:git:https://github.com/user/project.git</connection>
<developerConnection>scm:git:https://github.com/user/project.git</developerConnection>
<url>https://github.com/user/project/${project.scm.tag}</url>
<tag>HEAD</tag>
</scm>
在 Jenkinsfile
中添加阶段stage("Maven release") {
steps {
configFileProvider([configFile(fileId: 'maven-settings', variable: 'MAVEN_SETTINGS')]) {
sh "mvn -B clean release:clean"
sh "mvn -B release:prepare -s ${env.MAVEN_SETTINGS}"
sh "mvn -B release:perform -s ${env.MAVEN_SETTINGS}"
}
}
}
有效的源代码示例可在'app-rest' project下找到