Jenkins Learn
01. Nền tảng

Job đầu tiên

Tạo, cấu hình, chạy và đọc kết quả của một Jenkins Freestyle job tối thiểu từ repository Git công khai.

Phạm vi và điều kiện

Lab này dành cho Jenkins đã cài xong, bạn có quyền tạo job và có một agent tin cậy đang trực tuyến. Ví dụ checkout một repository Git công khai của Jenkins và chạy lệnh đơn giản trên agent. Không dùng nó để chạy code không tin cậy trên controller; production cần agent tách biệt, toolchain đã kiểm soát và quyền tối thiểu.

Một Freestyle job là cách nhanh nhất để làm quen với vòng đời build: Jenkins lấy source code, chạy một hoặc nhiều build step, rồi giữ console log và trạng thái. Trong bài này, kết quả quan sát được là revision đã checkout và file jenkins-lab-result.txt được tạo trong workspace.

Mục lục

Bạn sẽ làm gì?

Sau lab, bạn có thể:

  • tạo một job qua New Item và nhận ra vì sao chọn Freestyle project;
  • cấu hình Source Code Management → Git để Jenkins checkout một revision;
  • chọn đúng agent, shell và tool Git cho build step;
  • khởi chạy job bằng Build Now, đối chiếu output với lệnh đã cấu hình, rồi phân biệt kết quả SUCCESS và FAILURE;
  • xử lý một lỗi build có chủ đích mà không cần đoán hoặc thay đổi credential bừa bãi.

Trước khi bắt đầu

Điều kiện của lab

Bạn cần các điều kiện sau:

  • URL Jenkins có thể truy cập và tài khoản có quyền Create cùng Configure job.
  • Một agent tin cậy có ít nhất một executor Online. Agent Linux cần sh và Git CLI; agent Windows cần cmd.exe và Git CLI trong PATH.
  • Git plugin đã được cài và bật để mục Git xuất hiện trong Source Code Management. Đây là plugin, không phải điều được suy ra chỉ từ Jenkins core.
  • Agent được chọn có thể truy cập HTTPS tới github.com. Repository lab là public nên không cần credential.

Nếu bạn đang học local và chưa có controller, hãy bắt đầu bằng chạy Jenkins bằng Docker. Xem Yêu cầu hệ thống để kiểm tra Java, network và dung lượng. Khái niệm controller, agent, executor và workspace được giải thích sâu hơn tại Kiến trúc Jenkins.

Không biến controller thành máy build

Với production, đặt built-in node của controller là 0 executors và chỉ chạy build trên agent riêng. Chỉ có thể dùng built-in node cho lab nhỏ khi source hoàn toàn tin cậy và bạn chấp nhận ranh giới bảo mật kém hơn. Không chạy pull request, dependency hoặc script không tin cậy trên controller.

Hiểu các mục trên giao diện

MụcVai trò trong bài nàyĐiều cần nhớ
New ItemTạo đối tượng job mới trong Jenkins.Tên job cũng là nơi Jenkins lưu cấu hình và lịch sử build.
Freestyle projectLoại job cấu hình các phần như SCM và build step qua UI.Phù hợp để học hoặc tác vụ đơn giản; cấu hình chính nằm trên controller.
Source Code Management → GitKhai báo repository, branch và credential Jenkins dùng để checkout.Cần Git plugin và Git CLI trên agent chạy checkout.
Build StepsCác lệnh Jenkins thực thi sau checkout.Execute shell cần shell Unix; Execute Windows batch command cần agent Windows.
Console OutputNhật ký tuần tự của checkout và build step.Đây là nơi bắt đầu khi build thất bại.

Freestyle job không đồng nghĩa với Pipeline. Job là đơn vị Jenkins theo dõi; Freestyle là một kiểu job có cấu hình UI. Pipeline thường lưu quy trình trong Jenkinsfile cùng repository. Để đặt lab vào bối cảnh CI/CD, xem Nền tảng CI/CD.

Lab: chạy Freestyle job đầu tiên

Luồng lab là: Jenkins checkout một repository công khai → agent chạy lệnh → Console Output in revision và file kết quả → build kết thúc SUCCESS.

direction: down
repo: Repository Git công khai {icon: ../../assets/d2/git.svg}
workspace: Workspace trên agent
command: Execute shell / batch
result: Console Output + trạng thái build
repo -> workspace: Checkout
workspace -> command -> result
Repository Git công khaiWorkspace trên agentExecute shell / batchConsole Output + trạng thái build Checkout
Repository Git công khaiWorkspace trên agentExecute shell / batchConsole Output + trạng thái build Checkout
Lab: chạy Freestyle job đầu tiên

Chuẩn bị source và xác nhận branch

Dùng repository công khai https://github.com/jenkins-docs/simple-java-maven-app.git của tổ chức Jenkins. Lab chỉ xác nhận checkout và tạo output; không chạy Maven, nên agent không cần JDK hay Maven riêng cho ví dụ này.

Trước khi điền branch vào Jenkins, chạy lệnh sau trên máy có Git và internet. Nó in branch mặc định của remote; dùng đúng tên branch sau refs/heads/ cho bước cấu hình tiếp theo.

git ls-remote --symref https://github.com/jenkins-docs/simple-java-maven-app.git HEAD

Ví dụ output có thể chứa ref: refs/heads/master HEAD. Khi đó branch specifier là */master. Nếu remote đổi branch mặc định, không đoán main hoặc master: dùng tên lệnh vừa trả về.

Vì sao dùng repository có sẵn?

Source công khai giúp lab lặp lại được mà không yêu cầu token, deploy key hoặc quyền ghi. Khi áp dụng cho repository của bạn, thay URL và branch bằng giá trị đã xác minh tương tự; không nhét token vào URL Git.

Tạo job từ New Item

Mở trang tạo job. Từ Jenkins dashboard, chọn New Item. Nhập tên freestyle-first-job. Tên nên không chứa secret, vì nó xuất hiện trong URL, lịch sử build và log.

Chọn loại job. Chọn Freestyle project, rồi chọn OK. Jenkins mở trang Configure của job mới.

Freestyle project gom SCM, trigger, môi trường và build step trong biểu mẫu. Chưa cần bật trigger cho lab: bạn sẽ chủ động chạy bằng Build Now.

Chọn nơi chạy. Trong phần General, chỉ bật Restrict where this project can be run nếu Jenkins của bạn có agent label cụ thể. Nhập label của agent tin cậy, ví dụ linux hoặc windows.

Nếu không đặt label, Jenkins có thể chọn bất kỳ executor phù hợp nào. Chỉ để lab chạy trên built-in node khi đó là controller học tập và source hoàn toàn tin cậy; không dùng lựa chọn này cho production.

Cấu hình SCM Git và credential

Trong trang Configure, tìm Source Code Management, chọn Git, rồi điền:

  • Repository URL: https://github.com/jenkins-docs/simple-java-maven-app.git
  • Credentials: để - none -, vì đây là repository public
  • Branches to build: */<branch-vừa-xác-minh>, ví dụ */master

Sau khi nhập URL, Jenkins có thể hiển thị lỗi validation nếu Git plugin chưa có, agent không có Git CLI, URL/branch sai hoặc agent không tới được Git host. Chưa chuyển sang credential chỉ để chữa mọi lỗi checkout: với repo public, credential không phải điều kiện cần.

Khi repository là private

Repository private cần một credential đọc repository có quyền tối thiểu. Tạo credential tại Manage Jenkins → Credentials theo kiểu URL của repository: token đọc-only với Username with password cho HTTPS, hoặc SSH Username with private key cho SSH. Lưu private key hoặc token trong Jenkins Credentials, không lưu trong repository, trường URL, shell command hay console log.

Chọn scope hẹp nhất mà job thực sự nhìn thấy:

  • Nếu Jenkins có credential provider theo folder, đặt job trong folder và dùng credential scope của folder để không cấp cho job ngoài folder.
  • Nếu chỉ có scope mặc định, credential chọn cho SCM checkout phải ở scope job có thể dùng; System scope chỉ dành cho Jenkins nội bộ, không dùng cho checkout của build job. Global scope cho nhiều job nhìn thấy hơn, nên chỉ dùng khi không có scope hẹp hơn và giới hạn quyền cấu hình job.
  • Credential chỉ cần quyền đọc đúng repository/branch. Dùng deploy key hoặc token riêng cho CI, giới hạn read-only, đặt expiry/rotation theo chính sách và thu hồi khi job không còn dùng.

Sau đó chọn credential từ danh sách Credentials của chính job. Không gõ token vào Repository URL như https://token@host/org/repo.git; URL đó có thể lộ trong cấu hình, lịch sử hoặc log.

Credential không làm source trở nên đáng tin

Credential chỉ cấp quyền truy cập. Code, dependency và build script checkout từ repository vẫn sẽ được thực thi trên agent. Tách agent theo ranh giới tin cậy và không cấp credential phát hành/production cho một job chỉ cần clone source.

Thêm build step có kết quả quan sát được

Trong Build Steps, chọn loại lệnh khớp hệ điều hành của agent. Đây là build step tiêu chuẩn của Freestyle job, nhưng sự có mặt của shell, cmd.exe và Git CLI là phụ thuộc của agent. Không chọn một build step/plugin khác nếu bạn chưa cài và hiểu nó.

Chọn Add build step → Execute shell, rồi dán:

set -eu
printf 'Freestyle build #%s\n' "$BUILD_NUMBER"
printf 'workspace=%s\n' "$WORKSPACE"
printf 'revision='
git rev-parse --short HEAD
printf 'build=%s\n' "$BUILD_NUMBER" > jenkins-lab-result.txt
test -s jenkins-lab-result.txt
cat jenkins-lab-result.txt

set -eu yêu cầu shell dừng khi một lệnh lỗi hoặc biến bắt buộc không có. git rev-parse xác nhận checkout đã tạo một Git work tree. test -s biến file rỗng hoặc thiếu thành lỗi rõ ràng.

Bạn có thể tùy chọn thêm Post-build Actions → Archive the artifacts với pattern jenkins-lab-result.txt để tải file từ trang build. Tính khả dụng, giao diện và report bổ sung tùy phiên bản Jenkins hoặc plugin; lab không phụ thuộc vào artifact/report vì Console Output đã đủ để xác minh lệnh chạy.

Lưu, chạy Build Now và xác nhận kết quả

Lưu cấu hình. Chọn Save. Trang job hiển thị tên freestyle-first-job, build history rỗng và các hành động của job.

Khởi chạy thủ công. Chọn Build Now. Jenkins tạo số build mới, chẳng hạn #1. Nếu build chưa bắt đầu, mở Build Queue để đọc lý do về executor hoặc label thay vì chờ mù quáng.

Mở build vừa tạo. Chọn số build trong Build History, rồi chọn Console Output. Với build thành công, log cần có các dấu vết sau, dù đường dẫn workspace và revision sẽ khác:

Freestyle build #1
workspace=/.../workspace/freestyle-first-job
revision=abc1234
build=1
Finished: SUCCESS

Dòng revision= chứng minh Git checkout có revision. Dòng build=1 chứng minh build step đã tạo và đọc lại file trong workspace. Số build không nhất thiết là 1 nếu job đã chạy trước đó.

Đọc Console Output và trạng thái build

Đọc log theo thứ tự

Console Output là bản ghi theo thời gian. Đọc từ trên xuống và dừng ở lỗi có nguyên nhân đầu tiên, không chỉ ở dòng cuối Finished: FAILURE:

  1. Tìm phần Jenkins gán executor và workspace. Nếu không có phần này, build có thể vẫn đang chờ trong queue.
  2. Tìm checkout Git. Xác nhận URL remote, branch/revision và thông báo lỗi xác thực hoặc git không tìm thấy.
  3. Tìm dòng + trên shell Unix, hoặc lệnh được echo trên Windows. Nó cho biết lệnh nào Jenkins thực sự chạy.
  4. Đọc exit code, thông báo ngay trước nó và trạng thái cuối. Sửa nguyên nhân nhỏ nhất, lưu lại rồi chạy build mới để xác minh.

Không in token để “debug”. Nếu cần xác minh credential private repository, kiểm tra ID/tên credential được chọn, quyền đọc repository, host key/TLS và log đã được Jenkins che bớt; không sao chép secret từ Jenkins sang terminal.

Ý nghĩa các trạng thái

Trạng tháiÝ nghĩa thực tếHành động đầu tiên
SUCCESSTất cả bước bắt buộc của job hoàn thành không lỗi.Kiểm tra output mong đợi, không chỉ màu trạng thái.
FAILURECheckout, build step hoặc điều kiện bắt buộc kết thúc lỗi.Đọc lỗi đầu tiên trong Console Output và exit code.
UNSTABLEJob hoàn tất nhưng có tín hiệu chất lượng không đạt, thường từ test/report hoặc plugin cấu hình riêng.Mở report liên quan; lab này không tự tạo UNSTABLE.
ABORTEDBuild bị người dùng, timeout hoặc hệ thống dừng trước khi hoàn thành.Kiểm tra ai/cơ chế đã hủy và tình trạng agent.

Màu và biểu tượng có thể thay đổi theo giao diện hoặc theme; ưu tiên chữ trạng thái, Console Output, thời lượng và revision thay vì chỉ nhìn màu.

Tạo failure có chủ đích và khắc phục

Một lab tốt phải cho bạn thấy tín hiệu đỏ có nghĩa gì. Trong build step đang dùng, thay dòng tạo file bằng một lệnh chủ động thất bại, sau đó chọn Save và Build Now.

Thay:

printf 'build=%s\n' "$BUILD_NUMBER" > jenkins-lab-result.txt

bằng:

false

Build mới phải kết thúc FAILURE. Trong Console Output, tìm false hoặc exit /b 1, rồi dòng exit code. Sau khi quan sát, khôi phục đúng lệnh tạo jenkins-lab-result.txt, Save và chạy lại. Build kế tiếp phải trở về SUCCESS.

Các lỗi thường gặp khác và cách khoanh vùng:

Triệu chứngNguyên nhân thường gặpKiểm tra trước khi sửa
git: not found hoặc không có Git executableGit CLI chưa có trên agent được chọn.Cài/cấu hình Git trên đúng agent, rồi kiểm tra git --version với tài khoản agent.
Permission denied (publickey) hoặc Authentication failedURL và kiểu credential không khớp, token/SSH key thiếu quyền đọc hoặc đã hết hạn.Kiểm tra URL, credential đã chọn, quyền read-only và host key/TLS; không in secret.
Couldn't find any revision to buildBranch specifier không khớp remote hoặc repository/credential không truy cập được branch.Chạy lại git ls-remote --symref <repository-url> HEAD, rồi dùng branch thật.
Build chờ mãiLabel không có agent online hoặc hết executor.Mở Build Queue và Manage Jenkins → Nodes; không tăng executor trên controller để bỏ qua.
Lệnh shell lỗi ngayAgent không phải Unix, thiếu tool hoặc workspace có trạng thái không như mong đợi.Kiểm tra node đã chạy, loại build step và dòng lỗi đầu tiên.

Từ lab đến production

Bảo vệ source, credential và agent

Lab dùng source công khai và lệnh vô hại; production có ranh giới khác. Áp dụng các nguyên tắc sau trước khi cho job truy cập repository riêng, registry hoặc hạ tầng phát hành:

  • Không hard-code password, token, deploy key hay URL chứa token trong job config, repository, command line hoặc log. Dùng Jenkins Credentials với quyền tối thiểu, đúng scope và rotation.
  • Để credential đọc repository riêng tách biệt với credential deploy. Job chỉ checkout code không cần token ghi repository, cloud admin hay production.
  • Chạy source không tin cậy trên agent cô lập, ngắn hạn khi có thể. Không chạy source từ pull request/fork không tin cậy trên controller hoặc agent có secret giá trị cao.
  • Khai báo toolchain của agent rõ ràng: version Git, JDK, Node.js, Maven hoặc tool dự án. Execute shell chỉ chạy command; nó không cài tool cho bạn.
  • Giữ branch/revision, Console Output, artifact và retention đủ để truy vết. Nếu publish test report hoặc dùng build step đặc biệt, đọc yêu cầu của plugin, khả năng agent và quyền truy cập trước khi thêm.

Một job có thể là đường thực thi đặc quyền

Người có quyền sửa job có thể đổi URL SCM hoặc lệnh build. Hãy hạn chế quyền Configure/Build, review thay đổi job và tách agent theo mức tin cậy. Đừng cấp credential mạnh chỉ để checkout nhanh hơn.

Khi nào chuyển sang Pipeline as Code

Freestyle phù hợp để học luồng cơ bản hoặc duy trì một tác vụ nhỏ, ổn định. Hãy chuyển sang Pipeline as Code khi quy trình có nhiều stage như test, package và deploy; cần review thay đổi CI cùng pull request; cần điều kiện, retry, input/approval, agent theo stage hoặc tái sử dụng giữa repository.

Pipeline lưu mô tả trong Jenkinsfile, nên thay đổi có lịch sử Git và được review cùng source. Việc chuyển không tự giải quyết vấn đề bảo mật: Pipeline vẫn phải dùng credential đúng scope và chạy trên agent phù hợp. Học tiếp mô hình CI/CD tại Nền tảng CI/CD và cơ chế controller–agent tại Kiến trúc Jenkins.

Checklist hoàn thành

  • Tôi có agent tin cậy online, có executor, Git CLI và shell/cmd.exe phù hợp.
  • Tôi đã tạo freestyle-first-job bằng New Item → Freestyle project.
  • Job checkout được repository, branch và revision đã xác minh.
  • Tôi để Credentials là - none - cho repository public và biết không dùng token trong URL.
  • Tôi đã chạy build step, thấy revision=..., build=... và Finished: SUCCESS trong Console Output.
  • Tôi đã tạo một FAILURE có chủ đích, đọc lỗi đầu tiên, khôi phục lệnh và chạy xanh lại.
  • Tôi biết build/report bổ sung có thể phụ thuộc plugin, toolchain và khả năng của agent.
  • Tôi không chạy source không tin cậy trên controller và biết lúc nào nên chuyển quy trình sang Jenkinsfile.

Nguồn Jenkins chính thức

Đọc tiếp

On this page