Jenkinsfile의 변경 사항을 로컬에서 어떻게 테스트합니까?


210

jenkins 파이프 라인을 작성할 때 그것이 작동하는지 확인하기 위해 각각의 새로운 변경을 커밋하는 것은 매우 불편한 것 같습니다.

코드를 커밋하지 않고 로컬로 실행할 수 있습니까?

답변:


139

전체 목적은 Jenkins를 스크립팅하는 것이므로 Pipeline 스크립트를 로컬로 실행할 수 없습니다. ( JenkinsfileJenkins 기능을 실제로 처리하는 코드로 짧고 제한 하는 것이 가장 좋은 이유 중 하나는 실제 빌드 로직을 외부 프로세스 또는 한 줄 sh또는 bat단계 를 통해 호출하는 빌드 도구로 처리해야한다는 것 입니다.)

변경 사항을 적용 Jenkinsfile하지만 커밋 하지 않고 변경 사항을 테스트하려면 1.14에 추가 된 재생 기능을 사용 하십시오.

JENKINS-33925 는 자동화 된 테스트 프레임 워크에 필요한 것을 추적합니다.


블로그 게시물에 '재생'버튼이 있다고 말합니다. 어디 생각나? 찾을 수없는 것 같습니다.
BoltzmannBrain

8
@BoltzmannBrain, 빌드 작업의 Jenkins 페이지로 이동하십시오. 왼쪽에는 이전 빌드 실행 목록이 표시됩니다. 빌드 실행 ID (예 : "# 123") 또는 빌드 실행 날짜를 가리키면 작은 아래쪽 화살표가 나타납니다. 클릭하면 "재생"옵션이있는 상황에 맞는 메뉴가 나타납니다. 이 옵션은 빌드 실행 페이지에서도 사용할 수 있습니다.
Good Night Nerd Pride

2
Concourse를 사용하면 대상 빌드 서버에 대해 로컬 스크립트를 실행할 수 있으므로 변경 사항을 커밋하기 전에 원격 서버에서도 실제로 작동하는지 확인할 수 있습니다. concourse.ci/fly-cli.html . Jenkins 재생 기능은 제한 사항이 있으며 재생을 위해 먼저 빌드를 작성해야한다는 점을 제외하면 이와 유사합니다.
mdo123

2
찾고있는 것을 제공하는 것을 목표로하는 이 프로젝트 를 살펴볼 수 있습니다 .
Romain

1
JenkinsPipelineUnit 살펴보기 ( github.com/jenkinsci/JenkinsPipelineUnit )
user864279

78

나에게 잘 맞는 솔루션이 있습니다. 도커에서 실행되는 로컬 젠킨스와 모든 커밋마다 로컬 젠킨스의 파이프 라인을 트리거하는 git 웹 후크로 구성됩니다. 파이프 라인을 테스트하기 위해 더 이상 github 또는 bitbucket 리포지토리로 푸시 할 필요가 없습니다.

이것은 Linux 환경에서만 테스트되었습니다.

이 명령이 오래 걸리더라도이 작업을 수행하는 것은 매우 간단합니다. 대부분의 단계가 있습니다.

이것이 당신이 필요로하는 것입니다

  • Docker가 설치 되어 작동 중입니다. 이것은이 명령의 일부가 아닙니다.
  • 도커에서 로컬로 실행되는 Jenkins. 아래에 방법을 설명했습니다.
    • 로컬 Jenkins 도커 사용자가 로컬 git repo에서 가져올 수있는 올바른 권한 (ssh 액세스 키). 아래에 방법을 설명했습니다.
    • 로컬 git 저장소에서 가져 오는 Jenkins 파이프 라인 프로젝트. 아래에 설명되어 있습니다.
    • 최소한의 권한으로 로컬 Jenkins의 자식 사용자. 아래에 설명되어 있습니다.
  • 파이프 라인 프로젝트를 트리거하는 커밋 후 웹 후크가있는 git 프로젝트. 아래에 설명되어 있습니다.

이것이 당신이하는 방법입니다

젠킨스 도커

선택하는 대신 Dockerfile이라는 파일을 작성하십시오. 나는 이것을 /opt/docker/jenkins/Dockerfile채우고 있습니다 :

FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins

local_jenkins 이미지를 빌드하십시오.

Dockerfile에 무언가를 추가 한 후 또는 한 번만 수행하면됩니다.

$ docker build -t local_jenkins /opt/docker/jenkins/

local_jenkins를 시작하고 다시 시작하십시오.

때때로 jenkins를 쉽게 시작하고 다시 시작하려고합니다. 예를 들어 컴퓨터를 재부팅 한 후 이를 위해 .bash_aliases홈 폴더에 넣는 별칭을 만들었습니다 .

$ echo "alias localjenkinsrestart='docker stop jenkins;docker rm jenkins;docker run --name jenkins -i -d -p 8787:8080 -p 50000:50000 -v /opt/docker/jenkins/jenkins_home:/var/jenkins_home:rw local_jenkins'" >> ~/.bash_aliases
$ source .bash_aliases  # To make it work

/opt/docker/jenkins/jenkins_home폴더가 존재하고 사용자에게 폴더에 대한 읽기 및 쓰기 권한이 있는지 확인하십시오 .

젠킨스를 시작하거나 다시 시작하려면 다음을 입력하십시오.

$ localjenkinsrestart

로컬 젠킨스에서 수행하는 모든 작업은 / opt / docker / jenkins / jenkins_home 폴더에 저장되고 재시작간에 유지됩니다.

docker jenkins에서 ssh 액세스 키 만들기

이것이 작동하는 데 매우 중요한 부분입니다. 먼저 docker 컨테이너를 시작하고 bash 쉘을 만듭니다.

$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash

이제 도커 컨테이너에 들어갔습니다. 이것은 jenkins@e7b23bad10aa:/$터미널 과 같은 것으로 볼 수 있습니다 . @ 다음의 해시는 확실히 다릅니다.

키 만들기

jenkins@e7b23bad10aa:/$ ssh-keygen

프롬프트가 다시 표시 될 때까지 모든 질문에 대해 Enter를 누르십시오.

키를 컴퓨터에 복사하십시오. 도커 컨테이너 내에서 컴퓨터는 172.17.0.1입니다.

jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1

user = 사용자 이름 및 172.17.0.1은 docker 컨테이너 내에서 컴퓨터의 IP 주소입니다.

이 시점에서 비밀번호를 입력해야합니다.

이제 도커 컨테이너 내에서 컴퓨터를 ssh-ing하여 루프를 완료하십시오.

jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1

이번에는 비밀번호를 입력 할 필요가 없습니다. 그렇게하면 문제가 발생하여 다시 시도해야합니다.

이제 컴퓨터 홈 폴더에있게됩니다. 시도 ls하고보세요.

우리가 꺼내야 할 ssh 쉘 체인이 있기 때문에 여기서 멈추지 마십시오.

$ exit
jenkins@e7b23bad10aa:/$ exit

권리! 이제 다시 돌아와서 계속할 준비가되었습니다.

젠킨스 설치

http : // localhost : 8787 의 브라우저에서 로컬 Jenkins를 찾을 수 있습니다 .

브라우저를 로컬 Jenkins로 처음 가리킬 때 설치 마법사를 사용하십시오. 기본값은 괜찮습니다. 설치하는 동안 파이프 라인 플러그인을 설치하십시오.

젠킨스 설정

이다 매우 중요 당신이 매트릭스 기반의 보안 활성화 것을 // localhost를 : 8787 / configureSecurity을 HTTP를 하고 자신에게 모든 권한을 부여 행렬에 자신을 추가하고 모든 상자를 선택합니다. (맨 오른쪽에 틱 박스 전체 아이콘이 있습니다)

  • Jenkins’ own user database보안 영역으로 선택
  • Matrix-based security인증 섹션에서 선택
  • 필드에 사용자 이름을 User/group to add:입력하고 [ Add ]버튼을 클릭하십시오
  • 위 표에서 사용자 이름 옆에 사람 아이콘이 나타납니다. 교차하면 사용자 이름을 잘못 입력 한 것입니다.
  • 표의 맨 오른쪽으로 이동하여 모두 체크 버튼을 클릭하거나 행의 모든 ​​상자를 수동으로 체크하십시오.
  • 확인란 Prevent Cross Site Request Forgery exploits이 선택 해제되어 있는지 확인하십시오 . (이 Jenkins는 컴퓨터에서만 접근 할 수 있으므로 그렇게 큰 문제는 아닙니다)
  • [ Save ]Jenkins를 클릭 하고 로그 아웃 한 다음 다시 로그인하여 작동하는지 확인하십시오. 시작하지 않고 /opt/docker/jenkins/jenkins_home다시 시작하기 전에 폴더를 비우고 시작할 필요가없는 경우

자식 사용자 추가

git hook이 최소한의 권한으로 로컬 Jenkins에 로그인하도록 허용해야합니다. 작업을보고 구축하는 것만으로 충분합니다. 따라서 우리 git는 password 라는 사용자를 만듭니다 login.

브라우저를 http : // localhost : 8787 / securityRealm / addUser로 연결 하고 git사용자 이름과 login비밀번호로 추가하십시오 . 를 클릭하십시오 [ Create User ].

자식 사용자에게 권한 추가

받는 사람 이동 에 http : // localhost를 : 8787 / configureSecurity의 페이지를 브라우저에. git 사용자를 행렬에 추가하십시오.

  • git필드에 쓰고 User/group to add:클릭하십시오[ Add ]

이제 git 사용자에게 최소한의 권한이 있는지 박스를 체크 할 차례입니다. 이것들 만 필요합니다 :

  • 전체 : 읽기
  • 직업 : 빌드
  • 직업 : 발견
  • 직업 : 읽기

Prevent Cross Site Request Forgery exploits확인란이 선택되어 있지 않은지 확인하고[ Save ]

파이프 라인 프로젝트 생성

우리는 우리가 사용자 이름이 가정 user와 우리의 자식이 프로젝트를 활성화 Jenkinsfile그것에를 호출 project하고에 위치/home/user/projects/project

에서 당신 에 http : // localhost를 : 8787 젠킨스는 새로운 파이프 라인 프로젝트를 추가 할 수 있습니다. 참고 용으로 hookpipeline이라고 명명했습니다.

  • New ItemJenkins 메뉴에서 클릭
  • 프로젝트 이름을 hookpipeline
  • 파이프 라인을 클릭하십시오
  • 딸깍 하는 소리 [ OK ]
  • Poll SCM빌드 트리거 섹션에서 확인란을 선택 하십시오. 스케줄을 비워 두십시오.
  • 파이프 라인 섹션에서 :
    • 고르다 Pipeline script from SCM
    • 에서 Repository URL필드 입력user@172.17.0.1:projects/project/.git
    • 에서 Script Path필드 입력Jenkinsfile
  • hookpipeline 프로젝트 저장
  • Hookpipeline을 수동으로 한 번 빌드하십시오. 이는 Poll SCM이 작동을 시작하는 데 필요합니다.

자식 고리 만들기

/home/user/projects/project/.git/hooks폴더로 이동하여 다음 post-commit을 포함 하는 파일을 작성 하십시오.

#!/bin/sh
BRANCHNAME=$(git rev-parse --abbrev-ref HEAD)
MASTERBRANCH='master'

curl -XPOST -u git:login http://localhost:8787/job/hookpipeline/build
echo "Build triggered successfully on branch: $BRANCHNAME"

이 파일을 실행 가능하게 만드십시오.

$ chmod +x /home/user/projects/project/.git/hooks/post-commit

커밋 후 후크를 테스트하십시오.

$ /home/user/projects/project/.git/hooks/post-commit

hookpipeline 프로젝트가 트리거되었는지 Jenkins에서 확인하십시오.

마지막으로 프로젝트를 임의로 변경하고 변경 사항을 추가하고 커밋을 수행하십시오. 이제 로컬 Jenkins에서 파이프 라인이 트리거됩니다.

행복한 날!


나는 대체했다 docker build -t local_jenkins /opt/docker/jenkins/Dockerfiledocker build -t local_jenkins /opt/docker/jenkins"컨텍스트는 디렉토리 여야합니다 문맥을 준비 할 수없는"도커에 대해 불평하기 때문이다.
Etienne Neveu

1
Mac에서이 오류가 발생합니다. 누군가 나를 도와 줄 수 있습니까? >> ERROR : SSH : 22 172.17.0.1 포트 호스트에 연결 : 연결이 거부 -
마노 쉬 레스타

@ManojShrestha : ip 172.17.0.1은 docker 컨테이너를 실행하는 시스템의 기본 ip입니다. 대신 머신 (MAC : s) ip를 사용할 수 있습니다.
javabeangrinder

@ManojShrestha : 또한 다음과 같이 설정의 게이트웨이 IP를 찾으려고 시도 할 수 있습니다. $ docker inspect jenkins | grep Gateway
javabeangrinder

2
docker 호스트가 macOS에 설치되어 있고 docker 컨테이너 내에서 ssh 로그인 ssh user@docker.for.mac.localhost 하려면 IP 주소를 사용하는 대신 사용해야 합니다. 또한 macOs 시스템 환경 설정-> 공유 폴더 메뉴에서 원격 로그인 기능을 활성화했는지 확인하십시오
Paolo Angioletti

61

TL; DR

긴 버전
Jenkins 파이프 라인 테스트는 점점 더 어려워지고 있습니다. 사용자가 UI에 노출 된 내용으로 제한되었던 기존의 선언적 작업 구성 방식 과 달리 새로운 Jenkins Pipeline은 선언적 부분을 자신의 코드와 혼합하는 빌드 프로세스를위한 완전한 프로그래밍 언어입니다. 훌륭한 개발자로서 우리는 이런 종류의 코드에 대한 단위 테스트를 원합니다.

Jenkins Pipelines를 개발할 때 따라야 할 세 가지 단계가 있습니다. 1 단계 는 사용 사례의 80 %를 포함해야합니다.

  1. 빌드 스크립트 (예 : Maven, Gradle, Gulp 등)에서 가능한 많이 수행하십시오. 그런 다음 파이프 라인 스크립트에서 빌드 작업을 올바른 순서로 호출합니다. 빌드 파이프 라인은 빌드 작업을 오케스트레이션 및 실행하지만 특별한 테스트가 필요한 주요 로직은 없습니다.
  2. 이전 규칙을 완전히 적용 할 수 없으면 파이프 라인 공유 라이브러리 로 이동 하여 자체적으로 사용자 정의 로직을 개발 및 테스트하여 파이프 라인에 통합 할 수 있습니다.
  3. 위의 모든 것이 실패하면 최근에 나온 라이브러리 중 하나를 시도 할 수 있습니다 (2017 년 3 월). Jenkins Pipeline Unit 테스트 프레임 워크 또는 pipelineUnit (예). 2018 년부터 명령 줄 도구에서 Jenkins 파이프 라인을 실행하기위한 패키지 인 Jenkinsfile Runner 도 있습니다 .

pipelineUnit GitHub의의의 repo 사용하는 방법에 대한 몇 가지 스팍 예제를 포함 젠킨스 파이프 라인 단위 테스트 프레임 워크를


1
이 두 라이브러리를 간단히 비교할 수 있습니까?
sorin

24

Jenkins에는 소스를 업데이트하지 않고 작업을 빠르게 재생할 수있는 '재생'기능이 있습니다.

재생 기능


1
프로젝트 또는 분기 페이지가 아닌 빌드 페이지에 표시됩니다.
ArtOfWarfare

17

쓰기의 순간 (7 월 2017 끝)블루 오션 당신이 직접 선언 파이프 라인의 구문을 확인하실 수 있습니다 플러그인 시각적 파이프 라인 편집기 . 편집기는 github 프로젝트에 대해서만 "구성"을 클릭하면 Blue Ocean UI에서 작동 합니다 (알려진 문제이며 git 등에서도 작동하도록하기 위해 노력하고 있습니다).

그러나이 질문에 설명 된대로 편집기를 열어 다음을 탐색 할 수 있습니다.

[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/

그런 다음 페이지 가운데를 클릭 Ctrl+S하고을 누르면 파이프 라인 선언 스크립트를 붙여 넣을 수있는 텍스트 영역이 열립니다. 업데이트 를 클릭 할 때 구문 오류가있는 경우 편집기에서 구문 오류의 위치를 ​​알려줍니다. 이 스크린 샷에서와 같이 :

빠른 테스트로 "steps"대신 "stepps"를 잘못 입력했습니다.

구문 오류가 없으면 텍스트 영역이 닫히고 페이지가 파이프 라인을 시각화합니다. 아무것도 저장하지 않을 것을 걱정하지 마십시오 (github 프로젝트 인 경우 Jenkinsfile 변경 사항을 커밋합니다).

나는 Jenkins를 처음 사용하고 이것이 매우 유용합니다.이 없이는 Jenkinsfile을 여러 번 커밋해야 작동 할 때까지 (매우 성가신!) 도움이 되었기를 바랍니다. 건배.


2
2017 년 현재 Jenkins는 포인트 앤 클릭 소프트웨어 엔지니어 문제를 해결하기 위해 노력하고 있기 때문에;) .... 최소한 Atom은 적절한 Groovy 린터를 보유하고 있습니다. Groovy 뿐이지 만 도움이됩니다.
소린

구문 강조 표시가있는 편집기는 클래식 젠킨스 UI의 일부입니다.
Vadimo

6

파티에 조금 늦었지만, 이것이 내가 쓴 jenny핵심 Jenkinsfile 단계의 작은 재 구현입니다. ( https://github.com/bmustiata/jenny )


위반은 없지만 파이프 라인 구문이 일정한 플럭스 상태에 있기 때문에 물건을 지속적으로 업데이트하지 않으면 쓸모가 없습니다.
krad

취할수없는. 지금까지 본 파이프 라인 구문에서 기본적인 파이프 라인 단계 ( jenkins.io/doc/pipeline/steps/workflow-basic-steps )에 대해 거의 표준화되었습니다 . 이전 버전과 호환되지 않는 변경 사항이 발생하지 않고 ~ 2 년 동안 사용하고 있습니다. Jenkins 플러그인은 imho로 사용해서는 안되며 변경되는 API는 API를 보장하는 공유 라이브러리의 사용자 정의 명령을 사용하여 추상화 할 수 있습니다. 선언적 구문에 대해 이야기하고 있다면 사실 일 수 있습니다. 파이프 라인에서 프로그래밍 방식의 API 만 사용하며 이것이 Jenny가 지원하는 것입니다. Rock solid :)
bogdan.mustiata

5

내가 아는 한이 파이프 라인 플러그인 은 새로운 Jenkinsfile 메커니즘의 "엔진"이므로 스크립트를 로컬로 테스트하는 데 사용할 수 있습니다.

Jenkinsfile에 복사 할 때 필요한 추가 단계가 있는지 확실하지 않지만 구문 등은 정확히 동일해야합니다.

편집 : "엔진"에 대한 참조를 찾았습니다 . 기능 설명, 마지막 단락, 첫 번째 항목을 확인하십시오.


5

적절한 Groovy 편집기가없는 개발 환경에서 많은 Jenkinsfile 문제는 간단한 구문 오류 에서 비롯됩니다 . 이 문제를 해결하기 위해 Jenkins 파일을 Jenkins 인스턴스에 대해 검증 할 수 있습니다 (에서 실행 $JENKINS_HTTP_URL).

curl -X POST -H $(curl '$JENKINS_HTTP_URL/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)') -F "jenkinsfile=<Jenkinsfile" $JENKINS_HTTP_URL/pipeline-model-converter/validate

위의 명령은 https://github.com/jenkinsci/pipeline-model-definition-plugin/wiki/Validating-(or-linting)-a-Declarative-Jenkinsfile-from-the-command-line 에서 약간 수정 된 버전입니다.


4
이것은 단지 내가 찾던 물건의 일종이다 - 불행하게도 그것은 단지 작동 선언 파이프 라인 및 파이프 라인 :( 대본이 없습니다
thom_nic

2

다른 사람들이 이미 언급 한 Replay 기능 외에도 (유용성에 차이가 있습니다!) 다음 사항도 유용하다는 것을 알았습니다.

  1. 파이프 라인 코드를 입력하거나 Jenkinsfile의 저장소 / 분기를 가리켜 서 무언가를 신속하게 테스트 할 수있는 테스트 파이프 라인 작업을 작성하십시오. 보다 정확한 테스트를 위해서는 자신의 포크를 가리키는 멀티 브랜치 파이프 라인을 사용하여 제품에 영향을주지 않고 빠르게 변경하고 커밋 할 수 있습니다. BRANCH_NAME env와 같은 항목은 멀티 브랜치에서만 사용할 수 있습니다.
  2. Jenkinsfile은 Groovy 코드이므로 "groovy Jenkinsfile"을 사용하여이를 호출하여 기본 구문을 검증하십시오.

숨기고 사용자를 혼동하지 않는 별도의 작업을 사용하는 것이 가장 중요한 것 중 하나입니다. IntelliJ로 Jenkins 파일을 편집합니다. 구문 오류를 잘 보여줍니다. 그러나 답장 버튼이 핵심입니다. 기본 변경 실행으로 분기를 만듭니다. 보통 약간 잘못되었습니다. 그런 다음 Jenkinsfile을 편집하여 재생 창에 복사하여 붙여 넣은 다음 다시 실행하십시오. 정상적으로 작동 할 때까지 반복하고 작업 버전을 커밋하십시오.
johnfo

2

SSH 키를 Jenkins 프로파일에 넣고 다음과 같이 선언적 linter 를 사용하십시오 .

ssh jenkins.hostname.here declarative-linter < Jenkinsfile

이것은 Jenkinsfile에 대한 정적 분석을 수행합니다. 선택한 편집기에서 해당 명령을 자동으로 실행하는 키보드 단축키를 정의하십시오. 내가 사용하는 Visual Studio Code에서 작업> 작업 구성으로 이동 한 후 다음 JSON을 사용하여 Jenkinsfile 유효성 검사 명령 을 만듭니다 .

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Validate Jenkinsfile",
      "type": "shell",
      "command": "ssh jenkins.hostname declarative-linter < ${file}"
    }
  ]
}

0

나는 미래의 재생을 사용하고 있으며 일부 업데이트를 수행하고 빠르게 실행합니다.


1
이 작업을 수행하는 방법에 대한 추가 정보를 제공해 주시겠습니까?
kosnik

1
Bit-bucket을 소스 관리자로 사용하고 있으며 Jenkins에서 프로젝트를 만들었으므로 저장소를 자동으로 검색하고 싶습니다.이 게시물을 추천합니다. 내 repo를 누를 때마다 Jenkins는 자동으로 Jenkins 파일을 재생하고 실패하면 왼쪽 메뉴에 Replay라는 버튼이 있습니다. ==>이 버튼은 Jenkins 파일이 들어있는 편집기를 열고 편집하고 작업을 재생할 수 있습니다 ,
AhmedDrira

0

몇 가지 제한 사항과 스크립팅 된 파이프 라인에 대해이 솔루션을 사용합니다.

  1. 인라인 그루비 스크립트를 사용한 파이프 라인 작업 :

node('master') {
    stage('Run!') {
                def script = load('...you job file...')
    }
}

  1. 테스트를위한 Jenkinsfile은 lesfurets와 동일한 구조를 갖습니다.

def execute() {
 ... main job code here ...
}
execute()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.