답변:
전체 목적은 Jenkins를 스크립팅하는 것이므로 Pipeline 스크립트를 로컬로 실행할 수 없습니다. ( Jenkinsfile
Jenkins 기능을 실제로 처리하는 코드로 짧고 제한 하는 것이 가장 좋은 이유 중 하나는 실제 빌드 로직을 외부 프로세스 또는 한 줄 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 Item
Jenkins 메뉴에서 클릭hookpipeline
[ OK ]
Poll SCM
빌드 트리거 섹션에서 확인란을 선택 하십시오. 스케줄을 비워 두십시오.Pipeline script from SCM
Repository URL
필드 입력user@172.17.0.1:projects/project/.git
Script 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}"
}
]
}
나는 미래의 재생을 사용하고 있으며 일부 업데이트를 수행하고 빠르게 실행합니다.