답변:
전체 목적은 Jenkins를 스크립팅하는 것이므로 Pipeline 스크립트를 로컬로 실행할 수 없습니다. ( JenkinsfileJenkins 기능을 실제로 처리하는 코드로 짧고 제한 하는 것이 가장 좋은 이유 중 하나는 실제 빌드 로직을 외부 프로세스 또는 한 줄 sh또는 bat단계 를 통해 호출하는 빌드 도구로 처리해야한다는 것 입니다.)
변경 사항을 적용 Jenkinsfile하지만 커밋 하지 않고 변경 사항을 테스트하려면 1.14에 추가 된 재생 기능을 사용 하십시오.
JENKINS-33925 는 자동화 된 테스트 프레임 워크에 필요한 것을 추적합니다.
나에게 잘 맞는 솔루션이 있습니다. 도커에서 실행되는 로컬 젠킨스와 모든 커밋마다 로컬 젠킨스의 파이프 라인을 트리거하는 git 웹 후크로 구성됩니다. 파이프 라인을 테스트하기 위해 더 이상 github 또는 bitbucket 리포지토리로 푸시 할 필요가 없습니다.
이것은 Linux 환경에서만 테스트되었습니다.
이 명령이 오래 걸리더라도이 작업을 수행하는 것은 매우 간단합니다. 대부분의 단계가 있습니다.
선택하는 대신 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 SCMRepository URL필드 입력user@172.17.0.1:projects/project/.gitScript Path필드 입력Jenkinsfile/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/Dockerfile와 docker build -t local_jenkins /opt/docker/jenkins"컨텍스트는 디렉토리 여야합니다 문맥을 준비 할 수없는"도커에 대해 불평하기 때문이다.
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost 하려면 IP 주소를 사용하는 대신 사용해야 합니다. 또한 macOs 시스템 환경 설정-> 공유 폴더 메뉴에서 원격 로그인 기능을 활성화했는지 확인하십시오
TL; DR
긴 버전
Jenkins 파이프 라인 테스트는 점점 더 어려워지고 있습니다. 사용자가 UI에 노출 된 내용으로 제한되었던 기존의 선언적 작업 구성 방식 과 달리 새로운 Jenkins Pipeline은 선언적 부분을 자신의 코드와 혼합하는 빌드 프로세스를위한 완전한 프로그래밍 언어입니다. 훌륭한 개발자로서 우리는 이런 종류의 코드에 대한 단위 테스트를 원합니다.
Jenkins Pipelines를 개발할 때 따라야 할 세 가지 단계가 있습니다. 1 단계 는 사용 사례의 80 %를 포함해야합니다.
예
pipelineUnit GitHub의의의 repo 사용하는 방법에 대한 몇 가지 스팍 예제를 포함 젠킨스 파이프 라인 단위 테스트 프레임 워크를
쓰기의 순간 (7 월 2017 끝) 과 블루 오션 당신이 직접 선언 파이프 라인의 구문을 확인하실 수 있습니다 플러그인 시각적 파이프 라인 편집기 . 편집기는 github 프로젝트에 대해서만 "구성"을 클릭하면 Blue Ocean UI에서 작동 합니다 (알려진 문제이며 git 등에서도 작동하도록하기 위해 노력하고 있습니다).
그러나이 질문에 설명 된대로 편집기를 열어 다음을 탐색 할 수 있습니다.
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
그런 다음 페이지 가운데를 클릭 Ctrl+S하고을 누르면 파이프 라인 선언 스크립트를 붙여 넣을 수있는 텍스트 영역이 열립니다. 업데이트 를 클릭 할 때 구문 오류가있는 경우 편집기에서 구문 오류의 위치를 알려줍니다. 이 스크린 샷에서와 같이 :
구문 오류가 없으면 텍스트 영역이 닫히고 페이지가 파이프 라인을 시각화합니다. 아무것도 저장하지 않을 것을 걱정하지 마십시오 (github 프로젝트 인 경우 Jenkinsfile 변경 사항을 커밋합니다).
나는 Jenkins를 처음 사용하고 이것이 매우 유용합니다.이 없이는 Jenkinsfile을 여러 번 커밋해야 작동 할 때까지 (매우 성가신!) 도움이 되었기를 바랍니다. 건배.
파티에 조금 늦었지만, 이것이 내가 쓴 jenny핵심 Jenkinsfile 단계의 작은 재 구현입니다. ( https://github.com/bmustiata/jenny )
내가 아는 한이 파이프 라인 플러그인 은 새로운 Jenkinsfile 메커니즘의 "엔진"이므로 스크립트를 로컬로 테스트하는 데 사용할 수 있습니다.
Jenkinsfile에 복사 할 때 필요한 추가 단계가 있는지 확실하지 않지만 구문 등은 정확히 동일해야합니다.
편집 : "엔진"에 대한 참조를 찾았습니다 . 이 기능 설명, 마지막 단락, 첫 번째 항목을 확인하십시오.
적절한 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 에서 약간 수정 된 버전입니다.
다른 사람들이 이미 언급 한 Replay 기능 외에도 (유용성에 차이가 있습니다!) 다음 사항도 유용하다는 것을 알았습니다.
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}"
}
]
}
나는 미래의 재생을 사용하고 있으며 일부 업데이트를 수행하고 빠르게 실행합니다.