- ใน GitHub Actions สามารถระบุเชลล์ที่ใช้รันบล็อก
run: ได้ด้วยคีย์เวิร์ด shell
- ในเวิร์กโฟลว์นั้นเป็นตัวเลือก แต่ในการกำหนดแอ็กชันแต่ละตัวถือเป็นรายการที่จำเป็น
- ค่าเริ่มต้นจะถูกกำหนดอัตโนมัติตามระบบปฏิบัติการ: Linux/macOS ใช้
bash, Windows ใช้ pwsh
- หากตั้งค่า
shell: bash แบบชัดเจน จะมีแฟลกเริ่มต้นต่อไปนี้รวมอยู่ด้วย: --noprofile --norc -eo pipefail
สามารถระบุไฟล์ปฏิบัติการใดก็ได้เป็น shell
- โดยทั่วไปมักเข้าใจได้ง่ายว่าค่าที่ใช้กับ
shell มีข้อจำกัด
- แต่ในความเป็นจริง ไฟล์ปฏิบัติการทุกตัวที่อยู่ใน
$PATH สามารถใช้เป็นเชลล์ได้
- หากคำสั่งที่รันไม่รับอินพุตจากไฟล์ จะต้องส่งอาร์กิวเมนต์พิเศษ
{0} ให้
GitHub จะแทนที่ {0} ด้วยพาธของไฟล์ชั่วคราวให้อัตโนมัติ
ตัวอย่างเชิงทดลอง
- สามารถใช้คอมไพเลอร์ภาษา C (
tcc) ราวกับเป็นเชลล์เพื่อรันได้โดยตรง
- สามารถปรับแต่ง
$PATH เพื่อสร้างเชลล์ bash ปลอมขึ้นมาแล้วใช้งานได้เช่นกัน
GitHub ไม่ได้สนใจว่าค่าที่ระบุในรายการ shell จะเป็นไฟล์ปฏิบัติการอะไรจริง ๆ
นัยด้านความปลอดภัย
- ใน GitHub Actions เส้นแบ่งระหว่างการเขียนไฟล์กับการรันโค้ดค่อนข้างเลือนราง (ยังมีความเป็นไปได้ในการรันผ่าน
GITHUB_ENV, $GITHUB_PATH เป็นต้น)
- แม้แต่ค่าที่คุ้นเคยอย่าง
shell: bash ก็ยังถูกค้นหาผ่าน $PATH และไม่ได้ใช้พาธตายตัวอย่าง /bin/bash
- ต่างจากที่คาดไว้ ค่าอย่าง
python ก็ไม่ได้อ้างถึงทูลแคชแบบง่าย ๆ แต่เป็นการรันตามพาธจริง
2 ความคิดเห็น
ดูแค่รีโป github/runner-image ก็จะเห็นว่ามีแพ็กเกจที่ติดตั้งมาให้และใช้งานได้ทันทีอยู่ค่อนข้างเยอะ....
พอสร้างอิมเมจก็ปาไป 1GB แบบสบาย ๆ....
ความเห็นจาก Hacker News
-xของ bash ซึ่งมีประโยชน์มากสำหรับการดีบักrepository_dispatchScriptHandler.csมีโค้ดทั้งหมดสำหรับเตรียม process environment, arguments และอื่น ๆbashเพื่อให้รันโปรแกรมอะไรก็ได้goevalยังไม่รองรับการรับไฟล์โดยตรงgoeval