รัน pipeline ในเครื่องของคุณ
loha run --local รัน job ใน .loha.yml ของคุณใน container บนเครื่องของคุณเอง เพื่อให้เห็นว่าขั้นตอนใดล้มเหลว (หรือผ่าน)
ก่อนที่คุณจะ push คำสั่งนี้รัน plan เดียวกัน กับที่ loha plan แสดง ได้แก่ อิมเมจ สคริปต์ user id
capability ไดเรกทอรีทำงาน และขีดจำกัด CPU กับหน่วยความจำชุดเดียวกัน ซึ่งเซิร์ฟเวอร์ของ Loha เป็นผู้สร้าง
มีเพียงส่วนที่เครื่องส่วนตัวไม่มีเท่านั้นที่ถูกแทนที่ และสรุปท้ายการรันจะบอกให้ทราบว่าส่วนใด
การรันในเครื่องเป็นเรื่องของเครื่องคุณเท่านั้น ไม่สร้างบิลด์บนแพลตฟอร์ม ไม่รายงานอะไรกลับไป และไม่ส่งคำขอใดนอกจากคำขอ plan
loha run --local เป็นส่วนหนึ่งของฟีเจอร์ local run ซึ่งเปิดเป็นค่าเริ่มต้น หากผู้ดูแลแพลตฟอร์มของ Loha ปิดไว้สำหรับเวิร์กสเปซของคุณ
คำสั่งจะหยุดพร้อมข้อความ Local runs are not enabled for this workspace. Ask a workspace admin to turn on local_run. และออกด้วยโค้ด 2
ก่อนเริ่มใช้
ต้องมี container engine และ checkout ของรีโพสิทอรีที่ onboard กับ Loha แล้ว เช่นเดียวกับ loha plan
- Docker Desktop และ Docker Engine เป็น engine ที่ผ่านการทดสอบ ค่าเริ่มต้นคือ
docker - Podman ใช้ได้แบบ best-effort เลือกด้วย
--engine podmanหรือLOHA_CONTAINER_ENGINE=podman(แฟล็กมีผลเหนือกว่า) - หากไม่มี engine คำสั่งจะออกด้วยโค้ด
3พร้อมข้อความNo container engine found. Install Docker Desktop or Docker Engine, or pass --engine podman.ก่อนติดต่อเซิร์ฟเวอร์ หากติดตั้ง engine แล้วแต่ยังไม่ทำงาน ข้อความของ engine เองจะถูกพิมพ์ก่อน - อิมเมจถูก pull จากรีจิสทรีของมัน (ดูว่า pull เมื่อใดใน หมายเหตุเกี่ยวกับ engine) อิมเมจจากรีจิสทรีของเวิร์กสเปซต้องใช้
docker loginของคุณเอง Loha ไม่ส่งข้อมูลยืนยันตัวตนของรีจิสทรีให้ CLI
วิธีใช้
รันจากภายใน checkout:
loha run --local
Run local-3f9c2ab1, logs in /home/you/app/.loha/local-runs/local-3f9c2ab1/logs
Job test
✓ test/wait-for-services (3.4s)
✓ test/checkout (0.9s)
[test/migrate] applying 12 migrations
✓ test/migrate (5.1s)
[test/unit] 148 passed
✓ test/unit (41s)
JOB STEP MODE RESULT TIME
test checkout emulated passed 0.9s
test migrate run passed 5.1s
test unit run passed 41s
≠ Source: staged working tree, not a clone of the pushed commit
≠ Network: this machine's network, not build-pod egress rules
≠ Services: containers sharing one network namespace, not pod sidecars
ค่าข้างต้นเป็นตัวอย่าง เอาต์พุตของ container แสดงเป็น [job/step] line โดยใช้ชื่อ job และขั้นตอนเดียวกับหน้าบิลด์
โดยค่าเริ่มต้น job รันทีละตัวตามลำดับ needs ส่วน matrix รันทีละชุดต่อกัน และ --parallel N ให้รัน job ที่พร้อมแล้วพร้อมกันได้สูงสุด N ตัว
(ดู Parallel job) job และขั้นตอนที่ปิดอยู่จะแสดงพร้อมเหตุผล ซึ่งเป็นข้อความเดียวกับที่ loha plan พิมพ์
เมื่อเซิร์ฟเวอร์ส่งผลของ trigger มา การรันจะพิมพ์ก่อนว่าบล็อก on: ของ pipeline ทำอะไรกับ event ที่คุณ plan:
! On: would fire (<reason>) หรือ ! On: would not fire (<reason>)
แล้วรันต่อไปไม่ว่ากรณีใด เพราะการรันในเครื่องเป็นของคุณที่จะเริ่มเมื่อไรก็ได้ loha plan พิมพ์คำตอบเดียวกันเป็นบรรทัด On:
แฟล็ก
แฟล็กของ plan เป็นชุดเดียวกับ loha plan และมีความหมายเหมือนกัน คือกำหนดว่าจะรัน plan ใด
| แฟล็ก | ใช้ทำอะไร |
|---|---|
--local | จำเป็นต้องระบุ loha run ที่ไม่มีแฟล็กนี้จะแสดงคำแนะนำให้ใช้ loha deploy และออกด้วยโค้ด 2 |
--file, --branch, --event, --sha, --repo, --trigger, --var KEY=VALUE | แฟล็กของ plan เหมือน loha plan |
--base <branch>, --tag <tag> | จำลอง branch ปลายทางของ pull request (--event pull_request) หรือ tag ที่ถูก push (--event tag) เหมือน loha plan ใช้กับ event อื่นเป็นข้อผิดพลาดการใช้คำสั่ง |
--engine docker|podman | container engine (ค่าเริ่มต้น: LOHA_CONTAINER_ENGINE ถ้าไม่มีใช้ docker) |
--job <id> | รันเฉพาะ job นี้และ job ที่ต้องใช้ ระบุซ้ำได้ |
--parallel N | รัน job ที่พร้อมแล้วพร้อมกันได้สูงสุด N ตัว ตั้งแต่ 1 ถึง 16 (ค่าเริ่มต้น 1) ใช้ร่วมกับ --mount-source ไม่ได้ (ดู Parallel job) |
--matrix KEY=VALUE | รันเฉพาะ instance ของ matrix ที่มีค่านี้ ระบุซ้ำได้ ต้องตรงทุกค่า (ดู Matrix) |
--step <job>/<step> | รันเฉพาะขั้นตอนนี้ ต้องใช้ --reuse (ดู รันขั้นตอนซ้ำและเปิด shell) |
--from <job>/<step> | รันขั้นตอนนี้และทุกขั้นตอนหลังจากนั้น ต้องใช้ --reuse ใช้ร่วมกับ --step ไม่ได้ |
--reuse <volume> | ใช้ volume ของซอร์สที่การรัน --keep ครั้งก่อนทิ้งไว้เป็นพื้นที่ทำงานตามสภาพที่เป็นอยู่ |
--shell <job>/<step> | รันทุกอย่างก่อนขั้นตอนนั้น แล้วเปิด /bin/sh ใน container ของมันแทนการรันขั้นตอน ต้องมีเทอร์มินัล ใช้ร่วมกับ --json, --step, --from หรือ --parallel ไม่ได้ |
--approve | อนุมัติทุก approval gate โดยไม่ถาม (ดู Approval) |
--secret NAME | ให้ขั้นตอนต่าง ๆ ได้ secret ชื่อ NAME โดยอ่านค่าจากตัวแปรสภาพแวดล้อมชื่อเดียวกันของคุณ ระบุซ้ำได้ |
--env-file <path> | ไฟล์บรรทัด KEY=VALUE ที่ให้ค่า secret และตัวแปรทั่วไปที่ plan ไม่แสดงค่า (ดู Secret และตัวแปร) |
--mount-source | mount working tree ของคุณโดยตรงแทนการคัดลอก เร็วกว่า แต่ผลลัพธ์จากการ build จะถูกเขียนลงใน working tree และผลอาจต่างจากคลัสเตอร์ |
--committed-only | ใช้ไฟล์ pipeline และซอร์สจาก HEAD โดยไม่สนใจการแก้ไขในเครื่อง ใช้ร่วมกับ --mount-source ไม่ได้ |
--no-limits | ไม่ใช้ขีดจำกัด CPU และหน่วยความจำของ plan |
--platform linux/amd64 | รัน container สำหรับ platform นี้ (จำลองเมื่อต่างจากเครื่องของคุณ) |
--keep | เก็บ volume ของซอร์สไว้หลังรันและพิมพ์ชื่อ |
--json | พิมพ์ event แบบ JSON หนึ่งรายการต่อบรรทัดบน stdout แทนข้อความ (ดู เอาต์พุตสำหรับเครื่องอ่าน) |
คำสั่งที่ใช้ร่วมกันไม่ได้จะถูกปฏิเสธด้วยโค้ด 2 ก่อนเริ่ม engine และก่อนส่งคำขอใด ๆ ได้แก่ --parallel นอกช่วง 1 ถึง 16,
--step หรือ --from โดยไม่มี --reuse, --step พร้อม --from, --shell พร้อม --json, --step, --from หรือ --parallel,
--shell เมื่อ stdin และ stdout ไม่ใช่เทอร์มินัลทั้งคู่ (--shell needs an interactive terminal.), --reuse หรือ --parallel พร้อม --mount-source,
รายการ --matrix ที่ไม่ใช่ KEY=VALUE หรือซ้ำคีย์, --tag กับ event อื่นที่ไม่ใช่ tag และ --base กับ event อื่นที่ไม่ใช่ pull_request
สิ่งที่มีแต่ plan ที่ตรวจได้ เช่น job หรือขั้นตอนที่ไม่มีอยู่ หรือตัวเลือก --matrix ที่ไม่ตรงกับอะไรเลย (รวมถึงค่าว่าง --matrix KEY=) ก็ออกด้วยโค้ด 2 เช่นกัน ทันทีที่ทราบ plan
เช่นเดียวกับ volume ของ --reuse ที่ไม่มีอยู่ หรือไม่ใช่ volume ของการรัน loha ที่ถูกเก็บไว้ของรีโพสิทอรีนี้
โค้ดทางออก
| โค้ด | ความหมาย |
|---|---|
0 | ทุกขั้นตอนที่เปิดอยู่ผ่าน |
1 | ขั้นตอนล้มเหลวหรือหมดเวลา ยกเลิกด้วย Ctrl-C หรือเตรียมการรันไม่สำเร็จ (เช่น engine ล้มเหลวขณะสร้าง workspace) |
2 | plan ถูกปฏิเสธ (พิมพ์ข้อผิดพลาดของเซิร์ฟเวอร์เหมือน loha plan) หรือใช้คำสั่งผิด: ไม่มี --local แฟล็กหรือชุดแฟล็กไม่ถ ูกต้อง เป้าหมาย --job, --step, --from, --shell หรือ --matrix ที่ไม่มีอยู่ volume ของ --reuse ที่ถูกปฏิเสธ ไม่มีตัวแปรสภาพแวดล้อมของ --secret ยังไม่เปิดการรันในเครื่อง หรือข้อผิดพลาดของเซิร์ฟเวอร์หรือการยืนยันตัวตน |
3 | ไม่มี container engine หรือ engine ไม่ทำงาน |
ขั้นตอนที่ออกด้วยโค้ด 137 จะแสดงเป็น killed: likely out of memory at the <class> limit (<memory>)
ซึ่งระบุคลาสทรัพยากรของ job และขีดจำกัดหน่วยความจำ เพื่อให้แยกได้ว่าเป็นการถูกฆ่าจากหน่วยความจำไม่พอ ไม่ใช่เทสต์ล้มเหลว
เมื่อใช้ --no-limits หรือเมื่อ plan ไม่ได้กำหนดขีดจำกัดหน่วยความจำ จะแสดงเป็น killed (exit 137), possibly out of memory
ขั้นตอนแบบสคริปต์ที่ออกด้วยโค้ด 126, 127 หรือ 255 จะแสดงเป็น
exited with code <n>; the image may have no /bin/sh (the step's script needs one) เพราะสคริปต์ถูกรันด้วย /bin/sh
อิมเมจที่ไม่มี shell (เช่นอิมเมจ scratch หรือ distroless) จึงรันสคริปต์ run: ไม่ได้ ให้ใช้อิมเมจที่มี shell หรือใช้ขั้นตอนที่ระบุ command
เมื่อ job ล้มเหลวก่อนที่ขั้นตอนใดจะเริ่ม เช่น service เริ่มไม่ขึ้น เอาต์พุตแบบข้อความจะพิมพ์ ✗ <job>: <reason>
เพื่อให้เห็นสาเหตุบนหน้าจอ ไม่ใช่เฉพาะในไฟล์ log
อะไรถูกรันบ้าง
แต่ละขั้นตอนมี badge ใน loha plan และการรันในเครื่องทำตาม badge นั้น
- ขั้นตอน
runรันตามที่เขียน ใช้อิมเมจและสคริปต์เดียวกัน ใน container ที่เริ่มด้วย user ของ plan,--cap-drop ALLพร้อม capability ที่ plan ขอ,--security-opt no-new-privilegesและขีดจำกัด CPU กับหน่วยความจำของ job ขีดจำกัดหน่วยความจำถูกส่งเป็น--memory-swapด้วย container จึงใช้ swap เกินขีดจำกัดไม่ได้ เพราะ node ของคลัสเตอร์ไม่มี swap ขั้นตอนที่หน่วยความจำไม่พอบนคลัสเตอร์จึงหน่วยความจำไม่พอในเครื่องด้วย container ไม่เคยรันแบบ privileged - ขั้นตอน
emuถูกแทนด้วยของที่เทียบเท่าในเครื่อง การ checkout ถูกแทนด้วยการ stage ซอร์สของคุณ (ดู ซอร์ส) task cachecache@v2,upload-artifactและ job output ที่artifacts-saveกับartifacts-restoreส่งต่อ รันสคริปต์จริงกับเซิร์ฟเวอร์เล็ก ๆ บนเครื่องของคุณ (ดู Cache และ Job output และ artifact) การ build อิมเมจ (buildah-build,docker-build) ถูก build ด้วย container engine ของคุณ (ดู การ build อิมเมจ) และ approval gate จะถามคุณในเทอร์มินัล (ดู Approval) - ขั้นตอน
skipไม่รันบนเครื่องของคุณ ได้แก่ สิ่งที่ push, deploy, แจ้งเตือน หรือเซ็นชื่อ และ security gate ที่ Loha จัดการgit-cloneของรีโพสิทอรีนี้ถูกจดจำจาก pathgroup/projectดังนั้น SSH host alias หรือ URL ของ mirror ก็ยังนับว่าเป็นรีโพสิทอรีนี้ การ clone รีโพสิทอรีอื่นจะถูกข้ามพร้อมข้อความClones another repository; not available locally.และมีหมายเหตุระบุ URL ทั้งสอง (ไม่รวมข้อมูลรับรอง) หากไม่มีอะไร stage ซอร์สของคุณไว้ จะมีอีกหมายเหตุว่าNothing was staged for <job>; later steps see an empty workspace.
ความล้มเหลวครั้งแรกหยุดการรัน เมื่อขั้นตอนใดล้มเหลว ขั้นตอนที่เหลือของ job นั้นจะแสดง not run
job ที่ต้องใช้ job ที่ล้มเหลวจะแสดง skipped: needs <job>, which failed และ job อื่นที่ยังไม่เริ่มจะแสดง
not run: the run failed คลัสเตอร์ทำงานแบบเดียวกัน คือหยุดจัดตารางงานเมื่อมี task ล้มเหลว
job ต่าง ๆ ใช้ volume เดียว ตลอดการรัน ไฟล์ที่ job ก่อนหน้าเขียนไว้จึงอยู่ให้ job ถัดไป ยกเว้น matrix: แต่ละ instance ได้
workspace ว่างของตัวเอง เหมือนบนคลัสเตอร์ และรับ output ของ job ก่อนหน้าผ่าน artifacts-restore
(ดู Job output และ artifact)
timeout ของขั้นตอนกับ retries จาก plan ถูกบังคับใช้ และ timeout ของ pipeline ใช้กับการรันทั้งหมด ไม่มี timeout ของ job แยกต่างหาก
Matrix
matrix มาถึงในรูปที่ขยายแล้ว หนึ่ง job ต่อหนึ่งชุด และแต่ละ instance ได้ workspace ของตัวเอง จึงไม่มีสอง instance ที่เขียนไฟล์เดียวกัน โดยค่าเริ่มต้น instance รันทีละตัวต่อกัน
--matrix KEY=VALUE รันเฉพาะ instance ที่ matrix มีค่านั้น เช่น --matrix node=22 เพื่อลองเพียงชุดเดียว ระบุซ้ำได้และทุกรายการต้องตรงกัน
(--matrix node=22 --matrix os=linux) ตัวเลือกมีผลเฉพาะ job ที่มีแกนนั้น: job ที่ไม่มี matrix และ job ที่ matrix ไม่มีแกนนั้นรันตามปกติ
ตัวเลือกที่ไม่ตรงกับ instance ใดเลย หรือระบุแกนที่ไม่มี job ใดมี จะหยุดการรันด้วยโค้ด 2 และแสดงรายการแกนที่มี
ค่าว่าง (--matrix node=) ไม่ตรงกับ instance ใด จึงหยุดการรันในแบบเดียวกัน
Parallel job
--parallel N (1 ถึง 16 ค่าเริ่มต้น 1) ให้รันได้สูงสุด N job พร้อมกัน คือ job ใดก็ตามที่ needs ผ่านแล้ว ไม่ใช่เฉพาะ instance ของ matrix
เหมือนที่คลัสเตอร์รัน job ที่เป็นอิสระต่อกันพร้อมกัน บรรทัดเอาต์พุตยังมี prefix [job/step] ดังนั้น log ที่สลับกันก็ยังอ่านได้
ความล้มเหลวครั้งแรกยังหยุดไม่ให้ job ใหม่เริ่ม job ที่กำลังรันอยู่จะรันจนจบ
--parallel ใช้ร่วมกับ --mount-source ไม่ได้ เพราะ job จะเขียน working tree ของคุณพร้อมกัน
การตรวจทรัพยากร ดูแต่ละ job แยกกัน ไม่ได้ดู N job รวมกัน ดังนั้นเมื่อ N สูง engine อาจถูกขอมากกว่าที่มี
ลด N หรือเพิ่มทรัพยากรให้ engine VM หาก job ถูกฆ่า