1

我可以使用以下程序更改构建的描述。这会将构建的描述更改为“FOO FOO FOO”。不幸的是,我的登录不起作用。现在,这个测试 Jenkins 构建服务器上没有安全性。但是,在我们的常规 Jenkins 服务器上,您需要登录才能更改构建的描述:

#! /usr/bin/env perl

use 5.12.0;
use warnings;

use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
use Data::Dumper;

use constant {
    JENKINS_BASE            => "http://build.vegibank.com/",
    USER_ID                 => "buildguy",
    PASSWORD                => "swordfish",
};

use constant {
    LOGIN_URL               => JENKINS_BASE . '/j_acegi_security_check',
    JOB_URL                 => JENKINS_BASE . '/job',
    SUBMIT_DESCRIPTION      => 'submitDescription',
};

my $job_number = 4;
my $job_name   = "proginator-2.0";
my $description = "FOO FOO FOO";

my $user_agent = LWP::UserAgent->new or die qq(Can't get User Agent);

#
# My Login Stuff (but it doesn't do anything w/ security off
#

my $response = $user_agent->request (
    POST LOGIN_URL,
    [
        j_username => USER_ID,
        j_password => PASSWORD,
    ],
);

$response = $user_agent->request (
    POST "@{[JOB_URL]}/$job_name/$job_number/@{[SUBMIT_DESCRIPTION]}",
    [
        description => "$description",
    ],
);

我正在尝试连接到 Jenkins 登录会话,但我认为我做得不太对。当我尝试登录时,我得到一个302响应和我的响应对象的以下转储:

$VAR1 = bless( {
     '_protocol' => 'HTTP/1.1',
     '_content' => '',
     '_rc' => '302',
     '_headers' => bless( {
            'connection' => 'close',
            'client-response-num' => 1,
            'set-cookie' => 'JSESSIONID=1D5DF6FAF8714B2ACA4D496FBFE6E983; Path=/jenkins/; HttpOnly',
            'location' => 'http://build.vegicorp.com/;jsessionid=1D5DF6FAF8714B2ACA4D496FBFE6E983',
            'date' => 'Mon, 13 May 2013 20:02:35 GMT',
            'client-peer' => '10.10.21.96:80',
            'content-length' => '0',
            'client-date' => 'Mon, 13 May 2013 20:02:35 GMT',
            'content-type' => 'text/plain; charset=UTF-8',
            'server' => 'Apache-Coyote/1.1'
    }, 'HTTP::Headers' ),
     '_msg' => 'Moved Temporarily',
     '_request' => bless( {
            '_content' => 'j_username=buildguy&j_password=swordfish',
            '_uri' => bless( do{\(my $o = 'http://build.vegicorp.com/j_acegi_security_check')}, 'URI::http' ),
            '_headers' => bless( {
                   'user-agent' => 'libwww-perl/6.03',
                   'content-type' => 'application/x-www-form-urlencoded',
                   'content-length' => 42
     }, 'HTTP::Headers' ),
            '_method' => 'POST',
            '_uri_canonical' => $VAR1->{'_request'}{'_uri'}
     }, 'HTTP::Request' )
}, 'HTTP::Response' );

我想我一定是在访问一个有效的页面,因为我得到了一个 302 代码,但我的字段可能不正确(或者我去错了页面)。

任何人都可以帮忙吗?

4

2 回答 2

2

我的授权失败是因为……技术术语是什么?哦,是的…… “都做错了。”

在谷歌搜索并得到了很多无用的垃圾之后,我高兴地决定看看 Jenkins 网站是否有关于这方面的内容。而且,它确实在一个名为Authenticating scripted clients的页面下。事实上,他们甚至为脚本客户端提供了一个 Perl LWP 示例

哈哈,我太努力了。看来 Jenkins 将使用基本的 HTTP 身份验证机制,我不必通过尝试弄清楚他们的登录表单是如何工作的。显然,即使您的身份验证机制远非基本,Jenkins 也在为您简化基本身份验证机制——就像一个好的程序应该做的那样。

所以,我所要做的就是使用基本的身份验证机制。

my $browser = LWP::UserAgent->new or die qq(Cannot get User Agent);
my $request = HTTP::Request->new;
$request->authorization_basic(USER_ID, PASSWORD);
$request->method("GET");
$request->url("$jenkins_url");
my $response = $browser->request($request);
if ( not $response->is_success ) {
    die qq(Something went horribly wrong...);
}
于 2013-05-13T21:08:35.667 回答
1

我已经看到登录成功时的重定向——它设置会话 cookie 并将您重定向到主页。

您的帖子可能会失败,因为 UA 对象没有保留会话 cookie。根据文档,“默认设置是没有 cookie_jar,即永远不会自动将“Cookie”标头添加到请求中。尝试:

my $ua = LWP::UserAgent->new( cookie_jar => HTTP::Cookies->new() );

为描述更改帖子存储和重用您的会话。

(此外,凭据在您的标头转储中可见,可能需要编辑......编辑:我是个白痴,它们也在您的常量中并且很可能是假的。)

于 2013-05-13T20:49:06.033 回答