มาเขียน Jenkins Pipeline ให้ส่ง Slack Notification แบบสวยงามกันดี

Ingkwan
Ingkwan’s Knowledge Hub
2 min readApr 5, 2018

--

เนื่องจากมีการใช้ 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

--

--