背景: CI server在特殊網段,規劃觸發CI的成員,無法連到該網段。原本規劃使用email,但是大部分免費的email,已經很難僅用帳密來設定讀取信件。因此規劃使用slack來觸發。
基本原理:CI server讀取slack特定channel的訊息,確定是新指令後,便觸發CI。
shellscrpit:
取得最新slack留言來自 https://github.com/wintersunsunsun/get-slack-message# 讀取檔案目錄 dir=$(dirname "$0") echo "dir: $dir" latestTSPath="$dir/latestTS.txt" jarPath="$dir/get-slack-message-1.0.jar" lastlatestTS=$(cat $latestTSPath | cut -d ',' -f1) java -jar $jarPath ${Channel ID} ${BOT_TOKEN} > $latestTSPath latestTS=$(cat $latestTSPath | cut -d ',' -f1) arg1=$(cat $latestTSPath | cut -d ',' -f1) APP=$(cat $latestTSPath | cut -d ',' -f2) arg3=$(cat $latestTSPath | cut -d ',' -f3) Hash=$(cat $latestTSPath | cut -d ',' -f4) buildType=$(echo $arg3 | cut -d '_' -f1) logFile="$dir/distribute.log" echo "$(date '+%Y-%m-%d %H:%M:%S') lastest $arg1 $APP $arg3" >> $logFile if [[ "$lastlatestTS" != "$latestTS" ]] then echo "$(date '+%Y-%m-%d %H:%M:%S') start build $arg3" >> $logFile curl -X POST http://jenkinserver:8080/job/job_name/buildWithParameters --user geb:jenkinTokn --data-urlencode buildType=$buildType --data-urlencode hash=$Hash --data-urlencode branch=$arg3 echo "$(date '+%Y-%m-%d %H:%M:%S') end call Jenkins" >> $logFile fi
兩個參數
${Channel ID} ${BOT_TOKEN}
1. 需建立應用 產出BOT_TOKEN
2. Channel ID 在頻道詳情下方
3. 在頻道詳情的集成tab要把1 建立的應用加進去
4. slack api setting->OAuth & Permissions->Scopes 新增 app_mentions:read, channels:history, channels:read, files:write
4. slack api setting->OAuth & Permissions->Scopes 新增 app_mentions:read, channels:history, channels:read, files:write
shellscprit說明
1. 讀取最近slack留言
2. 比對是否有更新
3. 呼叫jenkins,開啟job 帶入相關參數
使用launchctl 的方式,在mac定期執行 shellscrpit
建立com.distribute.plist放到~/Library/LaunchAgents/
加載任務<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0"><dict><key>Label</key><string>com.distribute</string><key>ProgramArguments</key><array><string>/Users/distribute.sh</string></array><!-- 指定運行的时间 --><key>StartCalendarInterval</key><dict><key>Minute</key><integer>1</integer><key>Hour</key><integer>0</integer></dict><!-- 時間間隔 --><key>StartInterval</key><integer>300</integer><key>StandardOutPath</key><!-- standard Output --><string>/Users/distribute_stdout</string><!-- error log --><key>StandardErrorPath</key><string>/Users/distribute_error.txt</string></dict></plist>
launchctl load -w com.distribute.plist
卸載任務
launchctl unload -w com.distribute
.plist
開始任務
launchctl start -w com.distribute
.plist
留言