Maven发布/ Github OAuth令牌/ Jenkins:无法读取' https://github.com'的用户名:没有这样的设备或地址

时间:2016-02-18 14:34:19

标签: git maven github jenkins oauth

来自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)

知道如何解决这个问题吗?

4 个答案:

答案 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的建议。 这是我遵循的步骤,

  1. 根据建议,我在下面添加的行是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>

  2. 由于我们可以将秘密注入jenkin作业(https://support.cloudbees.com/hc/en-us/articles/203802500-Injecting-Secrets-into-Jenkins-Build-Jobs)中,因此我已使用构建绑定注入了GIT_USERNAME和GIT_PASSWORD。希望它可以绕过创建管道脚本。请按照上面的链接进行详细了解。 enter image description here

答案 3 :(得分:0)

我能够找到另一种处理方式。为此,您将需要


一旦安装配置文件提供程序插件

    管理Jenkins->托管文件->添加新配置下的
  • 定义 settings.xml enter image description here

  • 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下找到