「Achtung」、たたはプロゞェクトのビルドステヌタスを監芖する


プロゞェクトをビルドし、テストを実行しおコヌドの品質を確認するために、 Mail.ru CalendarプロゞェクトでJenkins CIを䜿甚したす。 アセンブリはgitリポゞトリにフックでプッシュした盎埌に開始されたす。もちろん、倱敗したアセンブリに関する情報をタむムリヌに受け取りたいず思いたす。 䞀方で、電子メヌル通知で十分であるように思われたすが、他方では、もっず目立っお楜しいものが欲しいです。

箄3、4幎前、私が別のプロゞェクトに取り組んでいたずき、同じ目的で、220ボルトのネットワヌクで動䜜するフラッシャヌが賌入され、それを制埡するために、悪名高いMasterKit瀟のMP709モゞュヌルUSBリレヌが賌入されたした。 ゜リュヌションは成功したせんでしたたず、このモゞュヌルのLinuxサポヌトがありたせんでしたデヌタ亀換プロトコルを逆にしお、Linux甚の独自の「ドラむバヌ」を䜜成する必芁がありたした。次に、非垞灯の堎所がコンピュヌタヌずコンセントからの配線によっお制限されおいたした。 いずれにせよ、デザむンは遠くの箱に捚おられ、翌で埅っおいたした。
最近、私の手は再びcombき、私は䜕か面癜いこずをしたかったが、圹に立たなかったので、フラッシャヌを思い出したした。 ゎミの山に飛び蟌んで、そこから釣り䞊げたしたArduino Nano-2個、リレヌモゞュヌル-1個、MX-05Vレシヌバヌ-1個、MX-FS-03Vトランスミッタヌ-1個。 残りのゎミをバルコニヌの隅に投げ蟌み、次の1時間を埅っお、デバむスの組み立おを始めたした。
叙情的なstè¿· 昔、私が若くお倚くの時間を過ごしおいたずき、私はいく぀かのAVRマむクロコントロヌラヌを䜿甚し、ボヌドを゚ッチングし、デバむスをはんだ付けし、アセンブリ蚀語でプログラムしたす...出口で。 プロセスからより倚くの喜びがあり、結果は同じです。

ハヌドりェア


回路は非垞にシンプルであるこずが刀明したした。なぜなら、私たちの時代には膚倧な数の異なる電子モゞュヌル、蚭蚈者、ブロックにより、はんだごおを手に入れたこずがなく、回路やプログラミングを勉匷しおいない人のために電子デバむスを組み立おるこずができたからです。送信機Arduino Nano + MX-FS-03V

レシヌバヌMX-05V + Arduino Nano +リレヌモゞュヌル

操䜜の原理はさらにシンプルです。ArduinoはコンピュヌタヌのUSBポヌトに接続し、シリアルむンタヌフェむスを介しおコマンドをリッスンしたす。 コマンドが有効な堎合、無線送信機を介しお送信されたす。 2番目のブロックでは、別のArduinoがレシヌバヌをリッスンし、コマンドを受信するず、リレヌをオンたたはオフにしたす。 それだけです フィヌドバック、チェックチェックサム、ロゞックはありたせん。
送信機プログラムは次のずおりです。
#include <VirtualWire.h>

int ledPin = 13 ; // LEDをピンで留める

char incoming_byte ; //着信メッセヌゞを保存するバッファ
char input_data [ 12 ] ; //メッセヌゞのサむズ
int input_size = 0 ; //カりンタヌ、カりンタヌのみ

void setup   {
// LEDピンを蚭定したす
pinMode  ledPin、OUTPUT  ;
digitalWrite  ledPin、LOW  ;

//シリアルを初期化したす9600 bps
シリアル 開始  9600  ;
シリアル println  "準備完了"  ;

// IOずISRを初期化したす
vw_set_ptt_inverted  true  ; // DR3100に必芁
vw_setup  1200  ; //ビット/秒
}

voidルヌプ  {
while  Serial。available   > 0  {
incoming_byte =シリアル。 読む   ; //着信バむトを読み取りたす

if  incoming_byte == 'n'  {
input_data [ input_size ++ ] = 0 ;
if  strncmp  input_data、 "Achtung ON" 、 10  == 0 || strncmp  input_data、 "Achtung ON" 、 11  == 0  {
digitalWrite  ledPin、HIGH  ;
vw_send   uint8_t *  input_data、input_size  ;
vw_wait_tx   ; //メッセヌゞ党䜓がなくなるたで埅぀
digitalWrite  ledPin、LOW  ;

シリアル println  "OK"  ;
} else {
シリアル println  "FAIL"  ;
}
while  input_size- > = 0  {
input_data [ input_size ] = 0 ;
}
input_size = 0 ; //カりンタをリセットしたす
} else {
if  input_size <= 11  {
input_data [ input_size ] = incoming_byte ;
}
input_size ++ ;
}
}
}

受信機プログラム
#include <VirtualWire.h>

int ledPin = 13 ; // LEDをピンで留める
int relayPin = 3 ; //リレヌが付いたピン

バむトinput_data [ VW_MAX_MESSAGE_LEN ] ; //着信メッセヌゞを保存するバッファ
バむトinput_size = VW_MAX_MESSAGE_LEN ; //メッセヌゞのサむズ

void setup   {
// LEDピンを蚭定したす
pinMode  ledPin、OUTPUT  ;
digitalWrite  ledPin、LOW  ;

//リレヌピンを蚭定したす
pinMode  relayPin、OUTPUT  ;
digitalWrite  relayPin、HIGH  ;

// IOずISRを初期化したす
vw_set_ptt_inverted  true  ; // DR3100に必芁
vw_setup  1200  ; //ビット/秒
vw_rx_start   ; //レシヌバヌを起動したす
}

voidルヌプ  {
//凊理するデヌタがあるかどうかを確認したす
if  vw_get_message  input_data、  input_size   {
digitalWrite  ledPin、HIGH  ;
if  strncmp   char *  input_data、 "Achtung ON" 、 10  == 0  {
digitalWrite  relayPin、LOW  ; // achtung リレヌをオンにする
} else if  strncmp   char *  input_data、 "Achtung OFF" 、 11  == 0  {
digitalWrite  relayPin、HIGH  ; //リレヌをオフにしたす
} else {
遅延 1000  ;
}
digitalWrite  ledPin、LOW  ;
}
}

ご芧のずおり、すべおが非垞に簡単です。 マむクロコントロヌラヌを接続し、Arduinoプログラムに組み蟌たれたブヌトロヌダヌを䜿甚しお、レシヌバヌずトランスミッタヌをそれぞれフラッシュし、トランスミッタヌに接続された「シリアルモニタヌ」を実行し、リレヌのオン/オフコマンドず無効なコマンドチェック甚を送信したす。

リレヌがオンずオフになり、すべおが機胜し、すべおが正垞です。
フラッシャヌを分解しお、レシヌバヌずリレヌの配眮堎所を確認したす。

内郚に倚くのスペヌスがあるこずがわかりたす。 デバむスの組み立おを開始したすが、最初に受信機の電力に察凊する必芁がありたす。
私はちょうどそれをやりたした。ノキアの携垯電話から䞍芁になった叀い電源を取り、それを分解しお、220ボルトの受信機に電力を䟛絊できる小さなボヌドを手に入れたした。 ケヌスからボヌドを取り倖すプロセスは非垞に困難であるこずに泚意せざるを埗たせんでした。 ケヌスは高品質のプラスチックで䜜られおいたす。 それにもかかわらず、私は成功したした

受信機ず電源でフラッシャヌを組み立おたす

すべおが機胜するこずを確認したす。ネットワヌク内のデバむスの電源を入れ、「シリアルモニタヌ」経由で「Achtung ON」コマンドをトランスミッタヌに送信したす。 リレヌがクリックされ、ラむトが点灯し、゚ンゞンが回転し、歓声が䞊がりたした 「Achtung OFF」コマンドを送信したす-すべおが停止したした。 点滅するラむトは機胜しおいたす。 ネゞず䞭囜のホットメルト接着剀でボヌドを取り付け、構造党䜓を元の圢に組み立おるだけです。
送信機を䜿甚しお、私は匏兞に立たず、すべおを䞀緒にはんだ付けするこずにしたした

将来的には、これらすべおを矎しいケヌスに詰め蟌む予定です。

゜フトりェア


コンピュヌタヌからトランスミッタヌにコマンドを送信するために、簡単なスクリプトを䜜成したす。
/ usr / bin / env python
「」「
「オン」たたは「オフ」コマンドを送信機に送信したす。
「」「
__future__ import print_function から
茞入 OS
むンポヌトシステム
茞入シリアル


__name__ == '__main__'の堎合 
if len  sys。argv   = 3 
print  "䜿甚法achtung / dev / ttyXX <ON | OFF>" 
sys 終了  1 

tty = sys argv [ 1 ]
osで ない 堎合 。 パス 存圚  tty  
印刷  「゚ラヌデバむス 's'は存圚したせん」  tty 
sys 終了  1 

コマンド= sys argv [ 2 ]
コマンドが  'ON' 、 'OFF' に ない 堎合 
print  "゚ラヌ䞍明なコマンド 's'"  command 
sys 終了  1 

送信機=シリアル。 シリアル  tty 、 9600 

送信機の堎合 。 readline   。 ストリップ    = 'achtungの準備' 
印刷  「゚ラヌデバむスが初期化されおいたせん」 
sys 終了  1 

送信機。 曞き蟌み  "Achtungsn" コマンド

結果=送信機。 readline   。 ストリップ  
結果なら  = 「OK」 
印刷  「゚ラヌデバむスの応答はOKではありたせん」 
sys 終了  1 

スクリプトを機胜させるには、䟝存関係 pyserialモゞュヌルをむンストヌルする必芁がありたす。
  pip install pyserial 
たず、オン/オフフラッシャヌをお楜しみください
  python achtung.py /dev/tty.usbserial-A900FYDU ON
     python achtung.py /dev/tty.usbserial-A900FYDUオフ 

Jenkins CIのアセンブリのステヌタスを取埗するには、 jenkinsapiモゞュヌルを䜿甚するのが最適です。この堎合、スクリプトは基本になりたす。 䟝存関係のむンストヌル
  pip install jenkinsapi 
スクリプト自䜓
/ usr / bin / env python
「」「
Jenkinsゞョブのステヌタスを確認し、ゞョブが正垞でない堎合はアラヌムを実行したす。
「」「
茞入 OS
むンポヌトシステム
茞入 時間

茞入シリアル
ゞェンキンサピから 。 ゞェンキンス むンポヌト ゞェンキンス
ゞェンキンサピから 。 䟋倖は JenkinsAPIExceptionをむンポヌトしたす


URL = 'http://jenkins.example.ru/'
USERNAME = 'jenkins'
パスワヌド= 「秘密」
JOBS = [ 'build' 、 'test' 、 'lint' ]
TTY = '/dev/tty.usbserial-A900FYDU'


def job_failed  connect、job_name  
「」「
ブヌル倀のゞョブステヌタスを返したすTrue-成功、False-倱敗。
「」「
job_name が接続されおいない 堎合 
真を 返す

last_build = connect [ job_name ] 。 get_last_build  

last_buildの堎合 。 is_running   
停を返す

build_status = last_build。 get_status  

build_status in  'FAIL' 、 'FAILED' 、 'FAILURE' 、 'ERROR' 、 'REGRESSION' の堎合 
真を 返す

停を返す


def send_to_transmitter デバむス、コマンド 
「」「
デバむスにコマンドを送信し、゚ラヌが発生するず終了したす。
「」「
デバむス。 曞き蟌み  "Achtungsn" コマンド

結果=デバむス。 readline   。 ストリップ  
結果なら  = 「OK」 
印刷  「゚ラヌデバむスの応答はOKではありたせん」 
sys 終了  1 


__name__ == '__main__'の堎合 
osで ない 堎合 。 パス 存圚  TTY  
印刷  「゚ラヌデバむス 's'が存圚したせん」  TTY 
sys 終了  1 

詊しおください 
connect = Jenkins  URL、ナヌザヌ名、パスワヌド

存圚する堎合  jobsのjob_nameのjob_failed  connect、job_name   
送信機=シリアル。 シリアル  TTY、 9600 

送信機の堎合 。 readline   。 ストリップ    = 'achtungの準備' 
印刷  「゚ラヌデバむスが初期化されおいたせん」 
sys 終了  1 

send_to_transmitter 送信機、 「ON」 
時間 。 寝る  5 
send_to_transmitter 送信機、 「オフ」 

JenkinsAPIException を陀く 
sys 終了  1 

起動されたスクリプトはJenkinsに接続し、指定されたタスクのステヌタスを受信し、そのうちの1぀が倱敗した堎合、5秒間点滅ラむトをオンにしたすこれにより、点滅が迷惑にならないようにしたすが、ビルドが倱敗したこずを明確にしたす。 このスクリプトは、平日埓業員の勀務時間の11:00から20:00たで、毎分クラりンで実行されたす。倜間たたは週末にフラッシャヌをオンにするこずは意味がありたせん。
もちろん、アセンブリの結果を泚ぐこずはできたせんでしたが、アセンブリが倱敗した堎合、圌自身がフラッシャヌの組み蟌みを開始するようにJenkinsを構成するこずができたしたが、圓瀟のセキュリティ芁件はこの可胜性を排陀しおいたすサヌバヌからネットワヌクぞのオフィスネットワヌクぞの接続は厳しく犁止されおいたす。

利益


すべおがセットアップされ、動䜜し、すべおの開発者ビルドをビルドする開発者を陀くが最も適切な瞬間に明るい点滅で喜んでいたす。
゜ヌス https : //github.com/dreadatour/jenkins-achtung

曎新 デバむス操䜜ビデオ

Source: https://habr.com/ru/post/J193606/


All Articles