• github
  • automation

เรียกใช้งาน workflow บน GitHub ของคุณอัตโนมัติหลังจากที่ล้มเหลว

บางครั้ง workflow บน GitHub Actions ของคุณอาจจะทำงานไม่ดีและล้มเหลวด้วยเหตุผลแปลก ๆ มาดูกันว่าคุณสามารถเรียกใช้งานมันอัตโนมัติได้อย่างไรเพื่อประหยัดเวลา

Gao
Gao
Founder

บทนำ

พวกเราชื่นชอบ GitHub Actions มันทรงพลังและเสนอพื้นที่ฟรีที่กว้างขวาง

เมื่อโปรเจกต์ของเราเติบโตขึ้น เราได้เพิ่มการทดสอบการเชื่อมต่อเพิ่มมากขึ้นใน workflow ของเราใน GitHub Actions เช่นเดียวกับโปรเจกต์ที่เยี่ยมอื่น ๆ เราเรียกใช้การทดสอบของเราทุกคำร้องขอดึง, การพุช, และการปล่อย

อย่างไรก็ตาม เนื่องจากธรรมชาติของการทดสอบการเชื่อมต่อ บางครั้ง workflow ของเราล้มเหลวด้วยเหตุผลแปลก ๆ มันอาจจะเป็นปัญหาเครือข่าย, ปัญหากับเบราว์เซอร์, หรือเหตุผลอื่น ๆ ที่ยากจะทำซ้ำ

เมื่อ workflow ล้มเหลว เราต้องเรียกใช้งานมันใหม่ด้วยตนเอง มันไม่ใช่เรื่องใหญ่ในตอนแรก แต่มันก็ยังน่ารำคาญสำหรับนักพัฒนาที่มีประสิทธิภาพสูงเช่นพวกเรา

วิธีการทำงาน

ในขณะนี้ GitHub Actions ยังไม่มีวิธีการในตัวเองที่จะเรียกใช้งาน workflow ที่ล้มเหลวได้โดยอัตโนมัติ ดังนั้นไปดูวิธีการที่เราสามารถทำได้

เมื่อ workflow ไม่ กำลังทำงานและล้มเหลว คุณสามารถเรียกใช้งานมันใหม่ด้วยตนเองโดยคลิกที่ปุ่ม "Re-run jobs" จะมีเมนูหล่นลงมา และมีตัวเลือก "Re-run failed jobs" ที่ดีเพื่อข้ามงานที่สำเร็จไปแล้ว

ไอเดียนี้เรียบง่าย:

  1. เราต้องตรวจจับเมื่อ workflow ล้มเหลว
  2. เราต้องเรียกใช้งานกระบวนการใหม่ หลังจาก ที่ workflow สิ้นสุดลง

เห็นได้ชัดว่า เราไม่สามารถทำเช่นนี้ใน workflow เดียวกัน เพราะ workflow ไม่สามารถทำอะไรได้เมื่อมันไม่ได้ทำงาน ดังนั้นเราต้องการอีก workflow เพื่อเฝ้าดูสถานะของ workflow ก่อนหน้าและเรียกกระบวนการใหม่ กระบวนการนี้สามารถแสดงได้ดังนี้:

อัปเดต workflows ของคุณ

สร้างไฟล์ workflow ใหม่ในที่เก็บข้อมูลของคุณ เช่น .github/workflows/rerun.yml:

ขอบคุณ GitHub CLI, เราสามารถดูสถานะของ workflow และเรียกใช้มันใหม่ด้วยคำสั่งง่าย ๆ สองคำสั่ง:

  • gh run watch เพื่อชมสถานะของ workflow (ดูเอกสาร ที่นี่).
  • gh run rerun เพื่อเรียก workflow ใหม่. ธง --failed จะเรียกใช้เฉพาะงานที่ล้มเหลว (ดูเอกสาร ที่นี่).

ทั้งหมดที่คุณต้องทำคือให้ run_id ของ workflow ที่ล้มเหลวซึ่งสามารถทำได้โดยใช้บริบทของ github.run_id ตัวอย่างเช่น คุณสามารถเรียก workflow ใหม่โดยการเพิ่มขั้นตอนต่อไปนี้ไปยัง workflow ดั้งเดิมของคุณ:

ค่าของ if: failure() จะเรียกใช้ขั้นตอนเมื่อ job ล้มเหลวเท่านั้น ค่าของ fromJSON(github.run_attempt) < 3 จะเรียกใช้สองครั้งแรกเท่านั้น คุณสามารถปรับจำนวนตามความต้องการของคุณ

ขั้นตอนนี้ใช้คำสั่ง gh workflow run เพื่อเรียกใช้ workflow ใหม่ ดู เอกสาร สำหรับรายละเอียดเพิ่มเติม

เพิ่มเติม: เรียกใช้ workflow ใหม่จากสาขาที่ล้มเหลว

หากคุณต้องการเรียกใช้ workflow ใหม่จากสาขาที่ล้มเหลว แทนสาขาเริ่มต้น คุณสามารถใช้คำสั่งต่อไปนี้:

บริบทของ github.head_ref จะถูกใช้ถ้ามันเป็นการร้องขอดึง มิฉะนั้น github.ref_name จะถูกใช้

เครดิต

แนวคิดของวิธีนี้มาจาก ความคิดเห็นในหัวข้อการสนทนาของ GitHub นี้