Một job triển khai kết nối, sao chép artifact của nó và báo cáo thành công. Tunnel mà nó mở có thể vẫn còn hoạt động khi job tiếp theo bắt đầu, và tuyến đường nó thay đổi thuộc về toàn bộ host. Kết quả build mô tả lệnh, không mô tả trạng thái mà nó để lại. Hãy coi VPN là một tài nguyên có vòng đời, không phải một dòng ở đầu một giai đoạn.

Còn gì khác chạy trên host này

Một node Jenkins có thể chạy nhiều executor cùng lúc, và một job thay đổi tuyến đường của host, thiết lập resolver hoặc kết nối toàn hệ thống sẽ thay đổi chúng cho mọi người. Việc job khác có nhận ra hay không phụ thuộc vào chính sách tuyến đường và lọc, không phụ thuộc vào một quy tắc chung về VPN. Truy cập kho mã, truy cập artifact và kênh điều khiển là những yêu cầu riêng mà runner vẫn cần. Hãy thêm chúng vào danh sách đích triển khai trước khi chọn một tunnel đầy đủ.

Nếu kênh điều khiển sẽ đi qua tunnel, thiết kế phải nói rõ điều đó một cách có chủ ý. Phát hiện điều này trong lúc khôi phục không phải là một kế hoạch. Hãy viết ra hai danh sách: job phải với tới gì một cách riêng tư và runner phải với tới gì bất kể thế nào.

Job này có cần quyền truy cập riêng tư không?

Hãy hỏi trước khi thêm tunnel xem giai đoạn build có cần nó không. Một agent triển khai riêng tư có thể lấy artifact đã được phê duyệt và thực hiện việc triển khai, điều này giữ giai đoạn build chung ra ngoài mạng riêng tư. Cách tách đó thường rẻ hơn việc dạy từng bước build đi qua tunnel.

Hãy chọn ranh giới từ quy trình làm việc chứ không phải từ thói quen. Nếu câu trả lời là không, phần còn lại của trang này là không cần thiết, và đó là kết quả tốt nhất có thể.

Trạng thái mà job tiếp theo thừa hưởng

Hãy mô tả điều gì phải đúng trước job, trong khi nó có quyền truy cập riêng tư, và sau khi nó kết thúc, kể cả khi bị hủy. Trạng thái kết thúc là thứ thường bị bỏ ngỏ nhất, và chính nó là thứ job tiếp theo thừa hưởng. Hãy viết nó bên cạnh pipeline thay vì để nó trong trí nhớ của ai đó.

MomentWhat proves itWhat leaks if it is skipped
Job start: pre-flight route checkThe route table shows no tunnel from an earlier job, and the profile list is emptyA stale route sends deployment traffic into a dead tunnel
Job end: disconnect and shredThe profile is down and the temporary key file is goneThe next job inherits an open tunnel and a usable credential
Cancelled job: reboot or disposalThe host is replaced or rebooted before the next job startsA killed process leaves the tunnel up with no owner

Một agent chuyên dụng hoặc dùng một lần giúp việc thực thi các ranh giới đó dễ hơn. Container hoặc namespace chỉ hữu ích nếu cách bố trí mạng và quyền của nó thực sự cô lập thay đổi.

Hãy dừng kết nối, không phải chương trình

Hãy dùng đường kết thúc của pipeline để đóng kết nối mà job này đã mở và xóa thông tin xác thực tạm thời của nó. Đừng khớp tiến trình theo tên chương trình trên một host mà các job khác dùng; hãy dừng đúng kết nối cụ thể. Hai lệnh bên dưới là toàn bộ việc dọn dẹp, và không lệnh nào phụ thuộc vào việc tìm ra một tiến trình.

vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"

Kết thúc không phải là cô lập: một runner chết đi vẫn giữ tunnel mà nó đã mở, và một tiến trình bị dừng cưỡng bức sẽ bỏ qua toàn bộ khối. Đó là lý do một mình lệnh dọn dẹp không thể là toàn bộ thiết kế. Đây là cách nó thất bại trong thực tế: một job triển khai bị hủy ở bước sao chép, khối kết thúc không bao giờ chạy, và job tiếp theo trên cùng host bắt đầu với một tunnel còn sống và một tuyến đường trỏ tới mạng mà nó không thể với tới. Sự cố trông giống như một vấn đề 'DNS' trong build tiếp theo, nhiều giờ sau khi job gây ra nó đã kết thúc.

Hãy ghi tên profile và đường dẫn thông tin xác thực vào đầu ra của job. Một lệnh ngắt kết nối trần không có định danh thì khó kiểm toán về sau. Dòng log cũng là thứ chứng minh khối đã chạy khi một cuộc điều tra sau này hỏi tới.

Hãy cho job một host mà không ai khác dùng

Hạ tầng dùng một lần loại bỏ vấn đề thừa kế thay vì quản lý nó. Một agent mới cho mỗi job bắt đầu mà không có tuyến đường, không có profile và không có thông tin xác thực của ai khác, và việc hủy nó dọn sạch mọi thứ job để lại. Điều đó tốn hơn cho mỗi build, và đó là cái giá trung thực của một ranh giới không phụ thuộc vào mã dọn dẹp. Với những job chạm vào mạng sản xuất, nó thường là lựa chọn rẻ hơn khi đã đếm số sự cố.

Ở nơi một runner dùng chung buộc phải ở lại, hãy kiểm thử thất bại và hủy bỏ cẩn thận như việc sao chép thành công. Bài kiểm thử phải cho thấy job tiếp theo sẽ thấy gì nếu job này bị hủy giữa chừng. Một job kết thúc khi quyền truy cập và trạng thái tạm thời của nó đã chấm dứt, không phải khi lệnh sao chép trả về không.

Bài viết liên quan