ข้ามไปยังเนื้อหาหลัก

Run Command (รันคำสั่ง Shell ในคอนเทนเนอร์)

ทางเลือกยืดหยุ่นสำหรับรันคำสั่ง shell ใดก็ได้ภายใน container image ที่กำหนด

การอ้างอิง (Reference): loha/run-command@v1

หมวดหมู่: Test & Lint (การทดสอบและตรวจโค้ด)

รันไทม์ (Runtime): alpine:3.19 (รันแบบ non-root, ตรึงด้วย digest)

สัญญาอนุญาต (License): Apache-2.0

ควรใช้เมื่อ​

ใช้เมื่อยังไม่มี task เฉพาะทางรองรับงานนั้นๆ เช่น การทำ database migration, รันสคริปต์ตรวจสอบเฉพาะ, การรวมไฟล์ assets หรือการเรียกใช้ CLI ประจำอิมเมจ สำหรับงานประเภท lint, test และ type check แนะนำให้ใช้ task เฉพาะทางเพื่อความสะดวกในการจัดการผลลัพธ์ที่เป็นมาตรฐาน

พารามิเตอร์​

พารามิเตอร์ชนิดค่าเริ่มต้นจำเป็นคำอธิบาย
COMMANDstring—ใช่คำสั่ง shell หรือสคริปต์แบบหลายบรรทัดที่ต้องการสั่งรัน
WORKING_DIRECTORYstring.ไม่ไดเรกทอรีทำงานของ task โดยคิดเทียบจาก root ของ workspace
IMAGEstringalpine@sha256:6baf43584bcb78f2e5847d1de515f23499913ac9f12bdf834811a3145eb11ca1ไม่คอนเทนเนอร์อิมเมจที่ใช้สำหรับรันคำสั่ง (ค่าเริ่มต้นคือ Alpine)
SHELLenum: sh, bash, ashshไม่เชลล์ที่ใช้ในการประมวลผลคำสั่ง เช่น sh, bash หรือ ash
FAIL_ON_ERRORenum: true, falsetrueไม่กำหนดให้ task ล้มเหลวเมื่อคำสั่งพบข้อผิดพลาด; หากตั้งเป็น false จะเป็นโหมดรายงานผลอย่างเดียว

พื้นที่ทำงาน (Workspaces)​

  • source (จำเป็น): เชื่อมโยงจาก pipeline workspace source

ผลลัพธ์ (Results)​

ผลลัพธ์ (Result)คำอธิบาย
EXIT_CODEค่า exit code ของคำสั่ง (0 หมายถึงทำงานสำเร็จ)
OUTPUT_PATHเส้นทางของไฟล์ log ที่บันทึกเอาต์พุตของคำสั่ง

การทำงาน​

สั่งรันคอนเทนเนอร์จาก IMAGE (ค่าเริ่มต้นคือ Alpine) เปลี่ยนไดเรกทอรีการทำงานไปยัง WORKING_DIRECTORY และส่งคำสั่ง COMMAND ให้กับตัวแปลคำสั่ง SHELL ที่เลือก โดยค่าสถานะ exit code จะถูกส่งกลับใน EXIT_CODE และบันทึกข้อความ log ไว้ที่ OUTPUT_PATH ทั้งนี้ task จะทำงานในฐานะผู้ใช้ non-root (UID 1000) เพื่อความปลอดภัย

ตัวอย่าง​

คำสั่ง script บรรทัดเดียว​

steps:
- name: validate-config
uses: loha/run-command@v1
with:
COMMAND: 'python scripts/validate-config.py'

สคริปต์ bash หลายบรรทัดพร้อม strict mode​

steps:
- name: setup-database
uses: loha/run-command@v1
with:
SHELL: 'bash'
COMMAND: |
set -euo pipefail
echo "Running migrations..."
npm run db:migrate
npm run db:seed

เลือกใช้อิมเมจที่มีเครื่องมือและ CLI เฉพาะทาง​

steps:
- name: terraform-validate
uses: loha/run-command@v1
with:
COMMAND: 'terraform validate'
IMAGE: 'hashicorp/terraform:1.6'

การรันคำสั่งตรวจสอบแบบไม่ทำให้ pipeline ล้มเหลว​

steps:
- name: optional-benchmark
uses: loha/run-command@v1
with:
COMMAND: 'npm run benchmark'
FAIL_ON_ERROR: 'false'

การแก้ปัญหา​

ปัญหา: ระบบแจ้งว่าไม่พบคำสั่งหรือโปรแกรมที่ต้องการใช้งาน

วิธีแก้: อิมเมจ Alpine ค่าเริ่มต้นจะมีขนาดเล็กมากและมีเครื่องมือจำกัด ให้เปลี่ยนพารามิเตอร์ IMAGE เป็นอิมเมจที่มีโปรแกรมนั้นอยู่แล้ว หรือเพิ่มคำสั่งติดตั้งโปรแกรมในสคริปต์ของคุณ


ปัญหา: สคริปต์แบบหลายบรรทัดหยุดการทำงานก่อนจะจบคำสั่งทั้งหมด

วิธีแก้: ตรวจสอบการตั้งค่า set -e หรือ set -euo pipefail ให้สอดคล้องกับพฤติกรรมที่ต้องการ เนื่องจาก shell เริ่มต้นอาจหยุดหรือทำงานต่อขึ้นอยู่กับการจัดการ error


ปัญหา: เกิดข้อผิดพลาดไม่มีสิทธิ์เขียนไฟล์ในไดเรกทอรี (Permission denied)

วิธีแก้: เนื่องจาก task รันด้วยสิทธิ์ผู้ใช้ UID 1000 ให้ตรวจสอบและปรับแก้สิทธิ์ ownership ของไฟล์หรือโฟลเดอร์ที่สร้างไว้ตั้งแต่ขั้นตอนก่อนหน้า แทนการขอสิทธิ์ root