เขียน PowerShell ผิด กลายเป็นว่า ทำ rm -rf /* แทน !!!!

เคสนี้แบบว่าน่าจะเบลอด้วย ผมกำลังเขียน Script เพื่อทำ Automate จัดการพวก artifact ต่างๆ ตัว Script จะประมาณนี้ครับ Clear พื้นที่ Path ปลายทาง ก่อนจะนำเอา artifact ชุดใหม่ใส่เข้าไป

if (Test-Path "${env:GBASEOUTPUT}\\*") { Remove-Item "${env:GBASEOUTPUT}\\*" -Recurse -Force}

แต่ตอนที่ Execute ผ่าน Jenkins ปรากฏว่า มันนานผิดปกติ ปกติไม่ถึงวินาทีก็เสร็จแล้ว แต่ทว่ารอบนี้มัน run มาแล้ว 5 นาที ยังไม่เสร็จ ด้วยความแบบว่าเอ๊ะใจ มันเกิดอะไรขึ้นเลย Pause ไว้ก่อนครับ ความ Peak มันอยู่ที่ว่า ตอนจะเข้าไปดู Log ตัว Job + Log ใน Jenkins เองก็หายไปด้วยครับ ในใจคิดว่า มันไม่ใช่ rm -rf /* แบบในข่าวใช่ไหมมมมมมมมมมมมมมมมมมม

จากนั้นลองไปดูใน Drive C: เชี่ยแล้วไง ปกติมันมีเนื้อที่ Free อยู่ 50 GB ไหนมาเป็น 110 GB ได้

พอไปสารภาพบาปกับ Owner VM Peak ไปอีก !!! >> No backup

  • ตอนนั้นในหัวแบบว่า ทำไงดี ตุ๊ดดดดดดดดดดดดดดดดดดดดดดดดดดดดดด นึกถึง Feature ที่แบบว่าไม่เคยใช้เลย เพราะ มันกินที่อย่าง System Restore
  • ลองไปดูโอ้ว มี Check Point ตอนบ่าย 2 วันนั้นพอดี เลยลอง Restore ดู สรุปง่ายๆ
    • OS มาครบ
    • Program มาไม่ครบ เพราะลอง Run Script Test แล้วมันเดี้ยง เลยต้องมาทยอยลง Runtime ใหม่ ใช้เวลาไปเกือบเที่ยงวันยัดเที่ยงคืนเองงงง
    • Data ไม่ได้ตรวจนะ ปกติจะเอาไปฝาก Drive D หรือไม่ทำเป็น Code ไว้กับ GitLab เลย อย่าง Task ที่มีปัญหาจะ Automate เพื่อ Pack Winform App นี่แหละ

สรุป

  • ใน Linux คำสั่ง
rm -rf /*
  • ก็มีใน PowerShell เหมือนกัน ต้องระวังด้วย แม้ว่าจะเขียน Test Path ดักแล้ว มันไป Run ที่ Root Drive C: เพราะ ถ้าตัวแปร GBASEOUTPUT มีค่าว่างแล้ว ตัวยทำลายล้างดีๆเลย
if (Test-Path "${env:GBASEOUTPUT}\\*") { Remove-Item "${env:GBASEOUTPUT}\\*" -Recurse -Force}
  • ทำ Backup ไว้เสมอครับ และอย่า Test On Production ถ้าไม่มี Backup !!!!!!!!!!
  • และก็สำหรับคนที่ใช้ jenkins อาจจะใช้ Plugin มาครอบการทำงานแทน เช่น File Operations Plugin (jenkins.io) อย่างน้อย base path คือ Workspace ครับ

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.