본문으로 건너뛰기

HTTP 로 Jenkins 파라미터화 빌드 트리거

무료2017-04-15#Tool#xhr触发jenkins#远程触发jenkins#http触发jenkins构建#http trigger jenkins job

프론트엔드 자동화 테스트의 첫 걸음

서두에

비즈니스 주도, 주도하지 않으면 움직이지 않음

一.배경

Selenium 을 사용하여 프론트엔드 자동화 테스트를 수행하고, 코드를 푸시할 때마다 테스트 보고서를 생성하고 싶습니다:

1.원격 코드 push/merge

2.테스트 케이스 자동 실행

3.이메일로 테스트 결과 알림

Webhook 을 사용하여 Git 작업과 빌드 프로세스를 연결합니다. 이렇게 하면 push/merge 등의 Git 작업 시 Webhook 이 빌드 서비스에 알림을 보내고, 전체 빌드 프로세스를 실행한 후 빌드 완료 시 이메일로 알림을 보냅니다

원래 Jenkins 는 원스톱 서비스를 제공하며, 간단한 설정만으로 충분합니다. Webhook 이 Jenkins job 을 트리거하고, 빌드 완료 후 이메일을 보냅니다

하지만 프론트엔드 환경의 특수성 (테스트 케이스는 브라우저 환경에서 실행해야 함) 과 테스트 결과가 JS 의 손에 있기 때문에, 비동기로 테스트 케이스를 실행한 후 Jenkins 에 알림을 보내는 방법 이라는 문제가 생깁니다

Selenium 으로 브라우저를起動하고 테스트 페이지에 액세스하고, 모든 case 가 실행 완료될 때까지 대기합니다 (비동기 case 포함). 이 시점에서 테스트 결과를 얻을 수 있습니다. 하지만 빌드 스크립트는 브라우저가 아직 열리지 않은 시점에 실행 완료되고, 이메일 발송 준비가 되었지만 테스트 케이스가 아직 실행 중이지 않을 수 있습니다

따라서 이메일 발송 작업을 독립적인 job 으로 분리하여 이메일 발송을 전문으로 담당하게 합니다. 그러면 JS 가 Jenkins 에 이메일 발송을 알림하는一环만 남습니다

二.이메일 발송 전문 job

SMTP 설정

"Jenkins/시스템 관��/시스템 설정"에서 SMTP 관련 설정과시스템 관리자 이메일 주소를 입력합니다. 예를 들어:

이메일 알림
---
SMTP 서버         smtp.163.com
SMTP 인증 사용
사용자 이름             xxx
비밀번호              ***

Jenkins Location
---
시스템 관리자 이메일 주소  user@163.com

이메일 알림 섹션 하단에 테스트 이메일을 보내어 설정 테스트 옵션이 있습니다. 수신자를 입력하여 테스트 발송하고, 수신되면 OK 입니다

P.S.시스템 관리자 이메일 주소 입력에 특별히 주의하십시오. 그렇지 않으면 영원히 발송할 수 없습니다 (발신자가 설정되지 않음)

다음으로 "Extended E-mail Notification"을 설정합니다.빌드 후 이메일 알림 내용은 여기서 설정합니다. 예를 들어:

Extended E-mail Notification
---
SMTP 서버             smtp.163.com
기본 Content Type    HTML(text/html)
SMTP 인증 사용
사용자 이름               xxx
비밀번호                ***

하단의 "Enable Debug Mode"에 체크하여 이메일 발송 실패 원인을 조사하기 쉽게 합니다

파라미터화 빌드

"General/파라미터화 빌드 프로세스"에서 파라미터 이름, 기본값, 설명을 설정합니다. 예를 들어:

String Parameter
---
이름       autoTestResult
기본값     자동 테스트 실패
설명       자동 테스트 결과, 통과하지 못한 테스트 케이스는 무엇인가

"빌드 트리거/원격 빌드 트리거 (예:스크립트 사용)"에서 token 을 입력하여 빌드 암호로 사용합니다. 예를 들어:

인증 토큰  mail

"빌드"에서 shell 을 실행합니다 (파라미터 전달 테스트용):

echo $autoTestResult
echo 'hoho, the end'

"빌드 후 작업"에서 "Editable Email Notification"을 추가하고, 수신자/내용 등의 항목을 입력합니다. 예를 들어:

Project Recipient List    user@163.com
Default Subject           autoTest 알림
Default Content           $autoTestResult

다음으로 "Advanced Settings/Triggers"에서 "Always"를 추가합니다.기본적으로 빌드 실패 시에만 이메일을 발송 하지만, 무조건 발송하도록 변경합니다

다음으로 수동으로 트리거 (브라우저에서 액세스) 하여 테스트합니다:

http://localhost:2017/job/mail/buildWithParameters?token=mail&cause=shoujian&autoTestResult=allpassed

모두 정상이라면, 이번 빌드의 "Console Output" 패널에 다음과 같은 log 가 표시됩니다:

Started by remote host 0:0:0:0:0:0:0:1 with note: shoujian
Building in workspace /Users/Shared/Jenkins/Home/jobs/mail/workspace
Checking for pre-build
Executing pre-build step
Checking if email needs to be generated
No emails were triggered.
[workspace] $ /bin/sh -xe /Users/Shared/Jenkins/tmp/hudson5065606977113971836.sh
+ echo allpassed
allpassed
+ echo hoho
hoho
Checking for post-build
Performing post-build step
Checking if email needs to be generated
Email was triggered for: Always
Sending email for trigger: Always
messageContentType = text/html; charset=UTF-8
  Collecting change authors...
    build: 17
Adding recipients from project recipient list
Adding recipients from trigger recipient list
Successfully created MimeMessage
Sending email to: user@163.com
Finished: SUCCESS

그러면 이메일 1 통을 받게 됩니다:

제목:autoTest 알림
내용:allpassed

P.S.위의 단계를 따라 진행하면 모두 정상일 것입니다. 오류가 발생하거나 이메일을 받지 못한 경우, Jenkins Email sending fails 를 참조하십시오

三.HTTP 로 Jenkins 이메일 job 트리거

JS 에서 HTTP 요청을 보내 Jenkins 작업을 트리거할 경우, 3 가지 문제에 직면합니다:

  • CSRF 보호

  • CORS

  • 로그인 인증 (Basic Auth)

기본적으로 크로스사이트 요청 위조 보호와 크로스도메인 제한이 있으며, 로그인이 필요합니다 (단 Basic Auth 는 지원함)

서버를 중계하면 이들은 문제가 아닙니다. crumb 을 얻어 CSRF 를 통과하고, 크로스도메인을 무효화하고, header 로 인증합니다. 하지만 빌드 도구는 테스트 환경에서만 실행되므로 이렇게 우회할 필요가 없습니다. CSRF 보호를 끄고, CORS 화이트리스트를 활성화하고, 마지막으로 JS 가XHR 로 header 를 설정하여 Basic Auth 로그인을 완료 할 수 있습니다

CSRF 보호 끄기

"Jenkins/관리 Jenkins/Configure Global Security"에서크로스사이트 요청 위조 방지에 체크하지 않음

이제 crumb 인증이 필요 없습니다. 테스트 환경이므로 위험은 크지 않습니다

CORS 화이트리스트 활성화

CORS 플러그인이 있습니다. 이것을 위한 것입니다:CORS support for Jenkins

"Jenkins/시스템 관리/시스템 설정/CORS Filter"에서 크로스도메인 제한 관련 응답 헤더를 입력합니다. 예를 들어:

Is Enabled
Access-Control-Allow-Origins    http://localhost:3000
Access-Control-Allow-Methods    POST
Access-Control-Allow-Headers    Authorization
Access-Control-Max-Age          3600

P.S.값이 여러 개인 경우, , 로 구분합니다. 예를 들어 POST,GET

POST http://localhost:3000 을 화이트리스트에 추가하고, XHR 이 응답 헤더의 Authorization 필드를 읽는 것을 허용하며, 유효 기간을 3600 초 (1 시간) 로 설정합니다

P.S.CORS 에 대한 자세한 내용은, 跨域资源共享 CORS 详解 를 참조하십시오

XHR 로그인

new Image() 가 가장 편리하지만, Basic Auth 가 불가능합니다. XHR GET 도 가능하지만, URL 길이 제한이 걸리므로, XHR POST 를 선택합니다. 예는 다음과 같습니다:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {
        if((xhr.status >=200 && xhr.status < 300 ) || xhr.status == 304 ){
            console.info('jenkins 触发成功');
        } else {
            console.info('jenkins 触发失败 ' + xhr.status + '\n' + xhr.responseText);
        }
    }
};

var result = 'allpassed';
var url = 'http://localhost:2017/job/mail/buildWithParameters?token=mail&cause=shoujian&autoTestResult=' + result;
xhr.open('POST', url, true);
// Basic Auth
var username = 'jenkins', password = '2017';
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(username + ':' + password));
xhr.send(null);

테스트 케이스가 모두 실행 완료된 후, 테스트 결과를 POST 하여 Jenkins 에 이메일 발송을 알림합니다.これで프론트엔드 자동화 테스트를 실행할 수 있습니다

P.S.XHR Basic Auth 에 대한 자세한 내용은, Jenkins json REST api with CORS request using jQuery 를 참조하십시오

PHP 로 Jenkins 파라미터화 빌드 트리거

보안 리스크를 고려하거나, 테스트 케이스 실행 후 더 많은 작업을 수행하고 싶은 경우, 서버에서 빌드를 트리거할 수 있습니다. PHP 코드는 다음과 같습니다:

header('Access-Control-Allow-Origin:*');

// 빌드 트리거
// exec("curl -X GET \"http://127.0.0.1:2017/job/mail/build?token=mail&cause=nocause\" --user user:passwd", $res, $rt);
// 파라미터화 빌드
exec("curl -X GET \"http://127.0.0.1:2017/job/mail/buildWithParameters?token=mail&cause=nocause&autoTestResult=allpassed\" --user user:passwd", $res, $rt);
if ($rt !== 0) {
    echo '出错了<br>';
    var_dump($res);
}
else {
    echo 'ok';
}

execcurl 을 호출하여 GET 요청을 보냅니다. POST 방식도 이와 유사하므로 여기서는 자세히 설명하지 않습니다

P.S.원격 빌드 트리거에 대한 자세한 내용은, 공식 문서를 참조하십시오:Remote access API

四.마지막에

Jenkins 는 많은 세부 작업을 처리해 주며, 이러한 빌드 서비스를 수동으로 구현하는 것보다 편리하지만, 설정 가능한 항목이 많을수록 제어권은 낮아지고, 간단한 작업을 완료하기 위해서도 플러그인에 의존하거나 우회한 방법을 사용해야 합니다

어쨌든, 자동으로 테스트 케이스를 실행하고 인프라스트럭처의 안정성을 보장하는 것은 매우 좋은 일입니다. 시작해 봅시다

댓글

아직 댓글이 없습니다

댓글 작성