Câu trả lời:
Bạn không thể thực thi tập lệnh Pipeline cục bộ, vì toàn bộ mục đích của nó là tập lệnh Jenkins. (Đó là một lý do tại sao tốt nhất là giữ mã Jenkinsfile
ngắn và giới hạn mã thực sự liên quan đến các tính năng của Jenkins; logic xây dựng thực tế của bạn nên được xử lý bằng các quy trình bên ngoài hoặc công cụ xây dựng mà bạn gọi thông qua một dòng sh
hoặc bat
bước.)
Nếu bạn muốn kiểm tra sự thay đổi để Jenkinsfile
sống nhưng không có cam kết đó, sử dụng các Replay tính năng được thêm vào trong 1,14
JENKINS-33925 theo dõi mong muốn cho khung kiểm tra tự động.
Tôi có một giải pháp phù hợp với tôi. Nó bao gồm một jenkins địa phương chạy trong docker và hook web git để kích hoạt đường ống trong jenkins địa phương trên mỗi cam kết. Bạn không còn cần phải đẩy đến kho lưu trữ github hoặc bitbucket của mình để kiểm tra đường ống.
Điều này chỉ được thử nghiệm trong môi trường linux.
Nó khá đơn giản để thực hiện công việc này mặc dù hướng dẫn này là một chút dài. Hầu hết các bước đều ở đó.
Tạo một tệp có tên Dockerfile thay cho lựa chọn của bạn. Tôi đang đặt nó để /opt/docker/jenkins/Dockerfile
lấp đầy nó với điều này:
FROM jenkins/jenkins:lts
USER root
RUN apt-get -y update && apt-get -y upgrade
# Your needed installations goes here
USER jenkins
Xây dựng hình ảnh local_jenkins
Điều này bạn sẽ chỉ cần thực hiện một lần hoặc sau khi bạn đã thêm một cái gì đó vào Dockerfile.
$ docker build -t local_jenkins /opt/docker/jenkins/
Bắt đầu và khởi động lại local_jenkins
Thỉnh thoảng bạn muốn bắt đầu và khởi động lại jenkins một cách dễ dàng. Ví dụ, sau khi khởi động lại máy của bạn. Đối với điều này, tôi đã tạo một bí danh mà tôi đặt trong .bash_aliases
thư mục nhà của tôi.
$ 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
Đảm bảo /opt/docker/jenkins/jenkins_home
thư mục tồn tại và bạn có quyền đọc và ghi quyền đối với người dùng.
Để bắt đầu hoặc khởi động lại jenkins của bạn, chỉ cần gõ:
$ localjenkinsrestart
Tất cả mọi thứ bạn làm trong jenkins địa phương của bạn sẽ được lưu trữ trong thư mục / opt / docker / jenkins / jenkins_home và được bảo quản giữa các lần khởi động lại.
Tạo khóa truy cập ssh trong docker jenkins của bạn
Đây là một phần rất quan trọng để làm việc này. Đầu tiên chúng ta khởi động container docker và tạo một bash shell cho nó:
$ localjenkinsrestart
$ docker exec -it jenkins /bin/bash
Bây giờ bạn đã nhập vào container docker, cái này bạn có thể thấy bởi một cái gì đó giống như jenkins@e7b23bad10aa:/$
trong thiết bị đầu cuối của bạn. Băm sau @ sẽ chắc chắn khác nhau.
Tạo chìa khóa
jenkins@e7b23bad10aa:/$ ssh-keygen
Nhấn enter trên tất cả các câu hỏi cho đến khi bạn nhận được lời nhắc trở lại
Sao chép chìa khóa vào máy tính của bạn. Từ trong container docker máy tính của bạn là 172.17.0.1, bạn có nên tự hỏi.
jenkins@e7b23bad10aa:/$ ssh-copy-id user@172.17.0.1
user = tên người dùng của bạn và 172.17.0.1 là địa chỉ IP cho máy tính của bạn từ trong container docker.
Bạn sẽ phải nhập mật khẩu của bạn tại thời điểm này.
Bây giờ, hãy thử hoàn thành vòng lặp bằng cách ssh-ing vào máy tính của bạn từ trong thùng chứa docker.
jenkins@e7b23bad10aa:/$ ssh user@172.17.0.1
Lần này bạn không cần nhập mật khẩu. Nếu bạn làm như vậy, một cái gì đó đã đi sai và bạn phải thử lại.
Bây giờ bạn sẽ ở trong thư mục nhà máy tính của bạn. Hãy thử ls
và có một cái nhìn.
Đừng dừng lại ở đây vì chúng ta có một chuỗi vỏ ssh mà chúng ta cần phải thoát ra.
$ exit
jenkins@e7b23bad10aa:/$ exit
Đúng! Bây giờ chúng tôi đã trở lại và sẵn sàng để tiếp tục.
Cài đặt Jenkins của bạn
Bạn sẽ tìm thấy Jenkins địa phương trong trình duyệt của bạn tại http: // localhost: 8787 .
Lần đầu tiên bạn trỏ trình duyệt của mình đến Jenkins địa phương, bạn sẽ thấy tuyệt vời với Trình hướng dẫn cài đặt. Mặc định là tốt, hãy chắc chắn rằng bạn cài đặt plugin đường ống trong khi thiết lập.
Thiết lập jenkins của bạn
Điều rất quan trọng là bạn kích hoạt bảo mật dựa trên ma trận trên http: // localhost: 8787 / configureSecurity và tự cung cấp cho mình tất cả các quyền bằng cách thêm chính mình vào ma trận và đánh dấu vào tất cả các ô. (Có một biểu tượng tick-all-box ở phía bên phải)
Jenkins’ own user database
làm vương quốc bảo mậtMatrix-based security
trong phần Ủy quyềnUser/group to add:
và nhấp vào [ Add ]
nútPrevent Cross Site Request Forgery exploits
được bỏ chọn. (Vì Jenkins này chỉ có thể truy cập từ máy tính của bạn nên đây không phải là vấn đề lớn)[ Save ]
và đăng xuất khỏi Jenkins và nhập lại chỉ để đảm bảo nó hoạt động.
Nếu không, bạn phải bắt đầu lại từ đầu và làm trống /opt/docker/jenkins/jenkins_home
thư mục trước khi khởi động lạiThêm người dùng git
Chúng tôi cần cho phép git hook của chúng tôi đăng nhập vào Jenkins địa phương của chúng tôi với các quyền tối thiểu. Chỉ cần nhìn thấy và xây dựng công việc là đủ. Do đó, chúng tôi tạo một người dùng được gọi git
bằng mật khẩu login
.
Hướng trình duyệt của bạn đến http: // localhost: 8787 / securityRealm / addUser và thêm git
làm tên người dùng và login
mật khẩu. Bấm vào [ Create User ]
.
Thêm quyền cho người dùng git
Vào http: // localhost: 8787 / configureSecurity trang trong trình duyệt của bạn. Thêm người dùng git vào ma trận:
git
vào trường User/group to add:
và bấm vào[ Add ]
Bây giờ là lúc để kiểm tra các hộp cho quyền tối thiểu cho người dùng git. Chỉ những thứ này là cần thiết:
Hãy chắc chắn rằng Prevent Cross Site Request Forgery exploits
hộp kiểm được bỏ chọn và nhấp vào[ Save ]
Chúng tôi giả sử rằng chúng tôi có tên người dùng user
và dự án kích hoạt git của chúng tôi với Jenkinsfile
tên được gọi project
và được đặt tại/home/user/projects/project
Trong http: // localhost: 8787 Jenkins của bạn thêm một dự án đường ống mới. Tôi đặt tên cho nó là hookpipeline để tham khảo.
New Item
trong menu Jenkinshookpipeline
[ OK ]
Poll SCM
trong phần Build Triggers. Để trống Lịch trình.Pipeline script from SCM
Repository URL
trường nhậpuser@172.17.0.1:projects/project/.git
Script Path
trường nhậpJenkinsfile
Chuyển đến /home/user/projects/project/.git/hooks
thư mục và tạo một tệp có tên post-commit
này:
#!/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"
Làm cho tập tin này thực thi:
$ chmod +x /home/user/projects/project/.git/hooks/post-commit
Kiểm tra móc sau cam kết:
$ /home/user/projects/project/.git/hooks/post-commit
Kiểm tra Jenkins nếu dự án hookpipeline của bạn được kích hoạt.
Cuối cùng thực hiện một số thay đổi tùy ý cho dự án của bạn, thêm các thay đổi và thực hiện một cam kết. Điều này bây giờ sẽ kích hoạt các đường ống trong Jenkins địa phương của bạn.
Những ngày hạnh phúc!
docker build -t local_jenkins /opt/docker/jenkins/Dockerfile
với docker build -t local_jenkins /opt/docker/jenkins
vì Docker phàn nàn về "không thể để chuẩn bị bối cảnh: bối cảnh phải là một thư mục".
$ docker inspect jenkins | grep Gateway
ssh user@docker.for.mac.localhost
thay vì sử dụng địa chỉ IP. Đồng thời đảm bảo rằng bạn đã bật tính năng Đăng nhập từ xa từ Tùy chọn hệ thống của macOs -> Menu Thư mục được chia sẻ
TL; DR
Thử nghiệm dài hạn Jenkins Pipeline ngày càng trở nên khó khăn. Không giống như cổ điển cách tiếp cận cấu hình công việc khai báo nơi người dùng bị giới hạn ở những gì UI tiếp xúc với Jenkins Pipeline mới là ngôn ngữ lập trình đầy đủ cho quy trình xây dựng nơi bạn trộn phần khai báo với mã của riêng bạn. Là nhà phát triển giỏi, chúng tôi cũng muốn có một số thử nghiệm đơn vị cho loại mã này.
Có ba bước bạn nên tuân theo khi phát triển Jenkins Pipelines. Các bước 1. nên bao gồm 80% các trường hợp sử dụng.
Ví dụ
Các pipelineUnit GitHub repo chứa một số mẫu Spock về cách sử dụng khuôn khổ thử nghiệm Jenkins Pipeline Unit
Jenkins có tính năng 'Phát lại', cho phép bạn nhanh chóng phát lại công việc mà không cần cập nhật nguồn:
Tại thời điểm viết (cuối tháng 7 năm 2017) với plugin Blue Ocean, bạn có thể kiểm tra cú pháp của một đường ống khai báo trực tiếp trong trình chỉnh sửa đường ống trực quan . Trình chỉnh sửa, hoạt động từ Giao diện người dùng Blue Ocean khi bạn nhấp vào "cấu hình" chỉ cho các dự án github (đây là sự cố đã biết và họ đang làm việc để làm cho nó hoạt động trên git, v.v.).
Nhưng, như đã giải thích trong câu hỏi này, bạn có thể mở trình soạn thảo duyệt tới:
[Jenkins URL]/blue/organizations/jenkins/pipeline-editor/
Sau đó bấm vào giữa trang và nhấn Ctrl+S
, điều này sẽ mở một textarea nơi bạn có thể dán một tập lệnh khai báo đường ống. Khi bạn nhấp vào Cập nhật , nếu có lỗi cú pháp, trình chỉnh sửa sẽ cho bạn biết lỗi cú pháp ở đâu. Giống như trong ảnh chụp màn hình này:
Nếu không có lỗi cú pháp, textarea sẽ đóng và trang sẽ trực quan hóa đường ống của bạn. Đừng lo lắng nó sẽ không tiết kiệm được gì (nếu đó là một dự án github, nó sẽ cam kết thay đổi Jenkinsfile).
Tôi mới biết về Jenkins và điều này khá hữu ích, không có điều này tôi đã phải thực hiện một Jenkinsfile nhiều lần, cho đến khi nó hoạt động (rất khó chịu!). Hi vọng điêu nay co ich. Chúc mừng.
Một chút muộn cho bữa tiệc, nhưng đó là lý do tại sao tôi viết jenny
, một sự tái hiện nhỏ của một số bước cốt lõi của Jenkinsfile. ( https://github.com/bmustiata/jenny )
Theo như tôi biết thì Plugin Pipeline này là "Engine" của cơ chế Jenkinsfile mới, vì vậy tôi khá tích cực, bạn có thể sử dụng nó để kiểm tra các tập lệnh của mình.
Tôi không chắc chắn nếu có bất kỳ bước bổ sung cần thiết khi bạn sao chép nó vào Jenkinsfile, tuy nhiên cú pháp vv phải hoàn toàn giống nhau.
Chỉnh sửa: Tìm thấy tài liệu tham khảo trên "cơ", kiểm tra này mô tả tính năng, đoạn cuối cùng, mục đầu tiên.
Trong thiết lập phát triển của tôi - thiếu một trình soạn thảo Groovy thích hợp - rất nhiều vấn đề Jenkinsfile bắt nguồn từ các lỗi cú pháp đơn giản . Để giải quyết vấn đề này, bạn có thể xác thực Jenkinsfile theo trường hợp Jenkins của bạn (đang chạy tại $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
Lệnh trên là một phiên bản sửa đổi một chút từ https://github.com/jenkinsci/pipeline-model-def định-plugin / wiki / xác nhận-(or-linting)-a-Declarative-Jenkinsfile- from-the-command- line
Ngoài tính năng Phát lại mà những người khác đã đề cập (ditto về tính hữu dụng của nó!), Tôi cũng thấy những điều sau đây cũng hữu ích:
Đặt khóa SSH của bạn vào hồ sơ Jenkins của bạn, sau đó sử dụng công cụ khai báo khai báo như sau:
ssh jenkins.hostname.here declarative-linter < Jenkinsfile
Điều này sẽ làm một phân tích tĩnh trên Jenkinsfile của bạn. Trong trình chỉnh sửa bạn chọn, xác định phím tắt chạy tự động lệnh đó. Trong Visual Studio Code, đây là những gì tôi sử dụng, đi đến Nhiệm vụ> Định cấu hình tác vụ, sau đó sử dụng JSON sau đây để tạo lệnh Xác thực Jenkinsfile :
{
"version": "2.0.0",
"tasks": [
{
"label": "Validate Jenkinsfile",
"type": "shell",
"command": "ssh jenkins.hostname declarative-linter < ${file}"
}
]
}
Tôi đang sử dụng phát lại trong tương lai, để thực hiện một số cập nhật và chạy nhanh.
Với một số hạn chế và đối với các đường ống dẫn kịch bản, tôi sử dụng giải pháp này:
node('master') {
stage('Run!') {
def script = load('...you job file...')
}
}
def execute() {
... main job code here ...
}
execute()