[PowerShell] มาทำ Line Notify แจ้งข้อมูลคุณภาพของ Code กันดีกว่าครับ

จริงๆต้องบอกว่าทุกปัญหามันเริ่มต้นจากความขี้เกียจแหละครับ และช่วงหลังๆสำหรับหน่วยงานต่างๆ การตรวจสอบคุณภาพของ Source Code ตอนนี้มันถูกจัดไปเป็นเงื่อนไขหนึ่งใน TOR แล้วครับ มันเลยเป็นที่มาของ Blog นี้ครับ

หลังจากที่ผมได้ตั้ง SonarQube เพื่อมาตรวจสอบคุณภาพ Code กันแล้ว ปัญหาที่พบ

  • ไอ้ที่มันแหกกฏไปต้องทำอย่างไร ?
    • ทำใจ อยู่ที่เรียนรู้ อยู่ที่ยอมรับมัน
    • และจัดทีมมาแก้ไขมันครับ ตรงนี้ต้องมี Automate Test ประกบเสมอนะครับ
  • แล้วของใหม่ที่กำลังเพิ่มขึ้นเรื่อยจะคุมอย่างไร
    • แจ้งทีม
    • ทำ Line Notify ขึ้นมาครับ เป็นที่มาของ Blog นี้เลยครับ

ทำไมต้องมี Line Notify ในเรื่องของ Code Quality หละ

  • มันจะมีไอ้บ้าที่ไหน เข้ามาไล่ตรวจใน SonarQube ทุกวันแบบผมหละ 5555
  • ตรวจทุกวันเหนื่อย เสียเวลา และหงุดหงิดอีก เพราะจริงตอนที่เอา Sonar ขึ้นครั้งแรก เคยแจ้งคนที่เกี่ยวข้องให้แก้ ปรากฏว่า ไม่ใช่งานตัวเองซะงั้น

มาเข้ากันที่ Technical ดีกว่าครับ

  • สิ่งที่ต้องมี
    • SonarQube Server
    • รู้จุดที่ต้องการข้อมูล และ API
    • ทำอย่างไรให้มันแจ้งเตือน

ลงมือทำ

  • SonarQube Server - อันนี้ไม่ขออธิบายนะครับ น่าจะมีหลาย Blog เขียนไว้แล้ว
  • รู้จุดที่ต้องการข้อมูล และ API
    • โจทย์ของผมในตอนนี้ คือ สนใจ Isssue ประเภท BUG ที่เป็น New Coming (มาใหม่สดๆร้อนๆ)
    • API ที่ผมต้องใช้
      http://:/api/issues/search?componentKeys=inv&resolved=false&sinceLeakPeriod=true&types=BUG
    • จริงๆ API มันมี Pattern นะ ลองดูจาก Doc ของ SonarQube ได้ครับ
  • ทำอย่างไรให้มันแจ้งเตือน
    • ใช้ Line Notify ครับ เพราะทุกคนที่เกี่ยว้ข้องกับ Code ใช้ครับ
    • และใช้ PowerShell เขียน เพราะ ผมว่ามันง่าย และสะดวกดี ถ้าจะจัดการงานอะไรที่ไม่ซับซ้อนบน Windows ครับ

มาดู Code กันเลยครับ

  • UPDATE_CODE_QUALITY_NOTIFY.ps1 เป็นไฟล์หลักเลยครับ
#======================================================
# AUTHOR : CHATRI NGAMBENCHAWONG
#======================================================
. "D:\06Utility\01BuildScript\WMSL-APP\LINE_NOTIFY.ps1"
Set-ExecutionPolicy Unrestricted
#PARAMMERTER PASS FROM JENKINS PIPELINE
$NETNOTIFYAPI = $args[0]
#SONAR URL
$uri = "http://<IP>:<PORT>/api/issues/search?componentKeys=inv&resolved=false&sinceLeakPeriod=true&types=BUG"
$apikey = "<YOUR API KEY>"
$token = [System.Text.Encoding]::UTF8.GetBytes("$($apikey)" + ":")
$base64 = [System.Convert]::ToBase64String($token)
$basicAuth = [string]::Format("Authorization {0}", $base64)
$headers = @{ Authorization = $basicAuth }
$NewSonarBug = Invoke-RestMethod -Headers $headers -ContentType 'application/json' -Method GET -URI $uri
$GroupNewSonarIssues = $NewSonarBug.issues | Group-Object -Property component
$message = "กรุณาตรวจสอบ SonarQube Result ดังนี้`n"
$GroupNewSonarIssueEntryCount = 0
ForEach ($GroupNewSonarIssueEntry in $GroupNewSonarIssues)
{
$message = $message + "-" + $GroupNewSonarIssueEntry.Name.Split('/')[-1]
$message = $message + " : Line "
$SonarIssueInFileCount = 1;
ForEach ($SonarIssueInFileEntry in $GroupNewSonarIssueEntry.Group)
{
$message = $message + $SonarIssueInFileEntry.line
if ($SonarIssueInFileCount -lt $GroupNewSonarIssueEntry.Group.Count)
{
$message = $message + ", "
$SonarIssueInFileCount = $SonarIssueInFileCount + 1
}
}
$message = $message + " (Last Commit: -CENSOR- ) `n"
if ($SonarIssueInFileCount -lt 10)
{
$GroupNewSonarIssueEntryCount = $GroupNewSonarIssueEntryCount + 1
}
else
{
SendLine $NETNOTIFYAPI $message
$message = ""
$GroupNewSonarIssueEntryCount = 0
}
}
$message = $message + "ดูรายละเอียดเพิ่มได้ใน http://<IP>:<PORT>/project/issues?id=inv&resolved=false&sinceLeakPeriod=true&types=BUG "
SendLine $NETNOTIFYAPI $message
  • LINE_NOTIFY.ps1 เป็น Helper ที่ผมใช้สำหรับแจ้ง Line Notify ครับ
#======================================================
# AUTHOR : CHATRI NGAMBENCHAWONG
#======================================================
function SendLine($LINE_TOKEN, $MESSAGE)
{
#line notify
$uri = "https://notify-api.line.me/api/notify"
$token = "Bearer $LINE_TOKEN"
$header = @{Authorization=$token}
$body = @{message=$MESSAGE}
$res = Invoke-RestMethod -Uri $uri -Method Post -Headers $header -Body $body
echo $res
}
function SendLineWithSticker($LINE_TOKEN, $MESSAGE, $STICKERPACKAGEID, $STICKERID)
{
#line notify
$uri = "https://notify-api.line.me/api/notify"
$token = "Bearer $LINE_TOKEN"
$header = @{Authorization=$token}
$body = @{message=$MESSAGE
stickerPackageId=$STICKERPACKAGEID
stickerId = $STICKERID
}
$res = Invoke-RestMethod -Uri $uri -Method Post -Headers $header -Body $body
echo $res
}

ปิดท้ายด้วยตัวอย่างที่ทดสอบ

  • สำหรับการ Deploy ผมเอาไปผูกกับ Jenkins ครับ หรือจะเอาไปผูกกับ Windows Schdule ก็ได้นะครับ
  • ตัวอย่าง การ Run ครับ

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.