มาเขียน Jenkins Pipeline ให้ส่ง Slack Notification แบบสวยงามกันดี
เนื่องจากมีการใช้ Slack ในการคุยงานกัน แล้วตัวเองต้องทำ Jenkins Pipeline ให้คนในทีมใช้งาน ก็เลยหาวิธีส่งข้อความเพื่อรายงานผลการ Build Job ผ่าน Slack Channel ของทีมเพื่อให้สะดวกในการติดตามผลกันมากขึ้น
ตอนแรกพยายามใช้ Plugin ที่ชื่อ slackSend แต่รู้สึกว่าแอบใช้ยากและข้อจำกัดเยอะ ที่สำคัญคือมันไม่สามารถส่งเข้า Private Channel ได้
งั้นก็เขียน cURL ส่งเองเลยง่ายกว่า ทีนี้เราก็ Custom เองได้ไม่ต้องง้อ Plugin แล้ว ~
อย่างแรกเราต้องมี Webhook ใน Slack เพื่อให้สามารถรับ Request ได้ก่อน โดยเข้าไปเพิ่มในหน้า Incoming WebHooks
เมื่อเข้ามาแล้วให้กด Add Configuration
เลือก Channel ที่ต้องการ แล้วกด Add Incoming WebHooks integration จากนั้นเราจะมาตั้งค่าให้ Webhook ของเรากัน
ส่วนแรกคือ Webhook URL ซึ่งจะเป็น URL ที่เราใช้ส่ง Request ไปนั่นเอง ให้ Copy เก็บไว้เดี๋ยวเราจะเอาไปใช้ทีหลัง
เปลี่ยนชื่อกับรูปของ App เราได้ตามอัธยาศัย จากนั้น Save Settings
เมื่อดูใน Channel ของเรา จะเห็นว่าได้เพิ่ม App เข้าไปเรียบร้อยแล้ว
เราสามารถเขียน HTTP POST ได้ดังนี้ โดย https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX คือ Webhook URL ของเรา และ Payload ที่จะส่งไปอยู่ในรูปแบบ JSON
curl -X POST --data-urlencode 'payload={"text":"First line.\nSecond line."}' https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX
ทีนี้เราจะมาปรับใช้กับ Jenkinsfile กัน เพื่อให้สะดวกต่อการใช้งาน เขียนเป็น Method ได้แบบนี้ ซึ่งต้อง import groovy.json.JsonOutput ด้วย
ตัวอย่างการนำไปใช้งาน โดย def slackURL = ‘xxxxxxxxxxx’ ก็คือ Webhook URL ที่เราได้จากตอนแรก และใส่ Attachments เพื่อให้เราสามารถปรับหน้าตาของข้อความได้ตามต้องการ และในตัวอย่างจะใช้แค่ env.JOB_NAME กับ env.BUILD_NUMBER ซึ่งสามารถดู List ของ Environment Variables ได้ทั้งหมดที่นี่ค่ะ
ผลลัพธ์ที่ได้
ในส่วนของแถบสีเราสามารถกำหนดได้ทั้ง good, warning, danger หรือเป็นแบบ hex ก็ได้เช่นกัน
หรือจะเขียนให้ Catch Error แล้วแสดงข้อความตามนี้
ทีนี้เราก็สามารถติดตามผลการ Build Jobs ผ่าน Slack โดยไม่ต้องเข้าไปคอยดูใน Jenkins Dashboard เองได้แล้ว แถมยัง Custom ง่ายกว่าการใช้ Plugin SlackSend ด้วย
จริงๆแล้วเราสามารถ Custom ข้อความได้หลายแบบมากกก ศึกษาเพิ่มเติมได้จากใน References ได้ค่ะ
ลองนำไปปรับใช้กันดูนะคะ ❤
References:
- https://api.slack.com/incoming-webhooks
- https://api.slack.com/docs/message-attachments