Jenkins連動型地下CI「ビルドエラーデスゲーム」

# Jenkins連動型地下CI「ビルドエラーデスゲーム」システム設計仕様

:::note alert
これは明らかにユーモアを含む企画であり、特殊な訓練を受けていない人に電気ショックを与えるシステムを実装することは安全面・法的面・倫理面から**強く推奨されません**。
以下は、あくまでフィクションのコンセプト設計として提示します。
もしも開発してしまって事故が起きた場合、**著者は一切の責任を負いません。**
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4005781/b4a3c46e-6f3a-4422-a6be-3402a7b317bc.png)

## コンセプト概要

Jenkins CI/CDパイプラインと連動し、ビルド失敗時に「責任者」に対して警告音や光・**ピエゾ素子による擬似静電気アタック**による通知を行うシステム。
ついでにLED点滅や警告音などの代替手段を用いた安全なフィードバックシステムも設計します。

# システム構成

## 1. ソフトウェア部分

#### Jenkins設定:
```groovy:PipelineScript.groovy
pipeline {
    // 通常のパイプライン設定
    
    post {
        failure {
            // ビルド失敗時に実行
            sh 'curl -X POST http://arduino-notification-server/notify?commit=${GIT_COMMIT}&repo=${GIT_URL}'
        }
    }
}
```

#### Webhook受信サーバー:
WebFW flaskを使います。
**※悪用防止の為、あえて環境構築手順は省きます。(重要)**

```python:app.py
from flask import Flask, request
import requests
import json

app = Flask(__name__)

@app.route('/notify', methods=['POST'])
def notify_failure():
    commit_hash = request.args.get('commit')
    repo_url = request.args.get('repo')
    
    # Gitから該当コミットの作者情報を取得
    author = get_commit_author(repo_url, commit_hash)
    
    # 作者のデスク番号またはIDをマッピング
    desk_id = author_to_desk_mapping.get(author, "unknown")
    
    # Arduinoデバイスに通知
    requests.get(f"http://arduino-controller/alert?desk={desk_id}")
    
    return "Notification sent"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
```

## 2. ハードウェア部分

#### 必要な部品

- Arduino Uno/Nano
- トランジスタ（2N2222、2N3904など）
- ブザーからピエゾ素子を取り出したもの、または直接ピエゾ素子
- 10kΩ抵抗
- 1MΩ抵抗
- 0.1μFセラミックコンデンサ
- 接触用電極（アルミテープや金属板）
- ジャンパーワイヤー
- ブレッドボードまたは基板

#### 回路図

```
Arduino 5V ----+
                |
                R1 (10kΩ)
                |
Arduino D9 -----+----| トランジスタ Base
                     |
                     | Collector
                     |
                     +---- ピエゾ素子 ---- Arduino GND
                     |
                     | Emitter
                     |
                     +---- Arduino GND
                           
ピエゾ素子の出力端子 ---- R2 (1MΩ) ---- 接触電極
                      |
                      C1 (0.1μF)
                      |
Arduino GND ----------+
```

#### 実装手順

1. **ピエゾ素子の準備**：
   - 安価なブザーから取り出すか、電子部品店で購入します。
   - 2本のワイヤーを接続します。

2. **回路の組み立て**：
   - トランジスタのベース端子を10kΩ抵抗を介してArduinoのD9ピンに接続
   - トランジスタのコレクタをピエゾ素子の一方に接続
   - ピエゾ素子のもう一方をArduinoの5Vに接続
   - トランジスタのエミッタをArduino GNDに接続
   - ピエゾ素子の出力端子から1MΩ抵抗を介して接触電極に接続
   - コンデンサを並列に接続してGNDに戻す

#### 動作原理

この回路では、Arduinoがピエゾ素子を高周波で駆動します。**ピエゾ素子は圧電効果により電気的振動を機械的振動に変換しますが、この過程で高電圧(低電流)が発生します。⚡** その電圧を蓄積して接触電極に供給することで、**指で触れた時に小さな静電気ショックを感じることができます。**



:::note warn
#### 安全上の注意点
  - この回路は低電流設計ですが、それでも注意が必要です
  - **⚠電極部分は指先のみで近づけるようにしてください(超重要。)** <br/>**<font color="red">引用サイト等を参考に、適切な加減を必ず事前学習してください</font>**
  - 心臓疾患をお持ちの方や電子機器（ペースメーカー）を使用している方は使用しないでください
  - 精密電子機器の近くでは使用しないでください

> (参考):ミニ雷を作ってみよう：圧電素子で高圧電流実験
> [https://jiyuken.wbrain.net/thunderbolt/playwithspark.html](https://jiyuken.wbrain.net/thunderbolt/playwithspark.html)
:::

### Arduino制御部（各デスクに設置）:
```cpp:sketch_ShockCI.ino
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>

// Wi-Fi接続情報
const char* ssid = "地下エンジニアWi-Fi";
const char* password = "パスワード";

// デスクID
const String DESK_ID = "engineer1";

// 警告デバイスのピン
const int BUZZER_PIN = 5;
const int LED_PIN = 4;

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  
  pinMode(BUZZER_PIN, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
  pinMode(9, OUTPUT);

  // Wi-Fi接続
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  
  server.begin();
}

void loop() {
  WiFiClient client = server.available();
  
  if (client) {
    String request = client.readStringUntil('\r');
    
    if (request.indexOf("/alert?desk=" + DESK_ID) != -1) {
      // 警告シーケンス実行
      alertSequence();
      //御褒美
      reward();

      // レスポンス送信
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println("");
      client.println("Alert triggered");
    }
    
    client.stop();
  }
}

void reward(){
// 高周波でピエゾ素子を駆動（10kHz程度）
  for (int i = 0; i < 1000; i++) {
    digitalWrite(9, HIGH);
    delayMicroseconds(50);  // 50μsオン
    digitalWrite(9, LOW);
    delayMicroseconds(50);  // 50μsオフ
  }
  delay(2000);  // 2秒待機
}

void alertSequence() {
  // 警告LED点滅
  for (int i = 0; i < 10; i++) {
    digitalWrite(LED_PIN, HIGH);
    tone(BUZZER_PIN, 1000);
    delay(200);
    digitalWrite(LED_PIN, LOW);
    noTone(BUZZER_PIN);
    delay(200);
  }
}
```

## 安全かつユーモアのある代替案

以下の「罰ゲーム」代替案を検討してください：

1. **デスク上のLED警告システム**：該当エンジニアのデスクにRGB LEDを設置し、ビルド失敗時に点滅

2. **チーム内通知**：ビルド失敗時、チームのSlackチャンネルに自動投稿（例：「@username によるコミットがビルドに失敗しました！」）

3. **音声アナウンス**：小型スピーカーから「〇〇、アウト」と再生

## 注意事項

- このシステムは純粋なエンターテイメント目的で、訓練されていない人に不快感や恐怖を与えるべきではありません。
- チーム全体が同意した上で実施し(やめたほうが良いけど)、新しいメンバーには同じ業界の人である事を確認してから事前に説明してください。
- 公開すべきでない情報（コミットの詳細など）が表示されないよう注意してください。
- **何よりも、快適な職場環境と前向きなフィードバック文化を大切にしてください。**

以上の代替案は、実際の電気ショックなしでも、ビルド品質を向上させるための楽しい「ゲーム化」の仕組みとして機能します。

## 参考
ELEGOO Arduino用UNO R3スターターキット レベルアップ チュートリアル付 mega2560 r3 nanoと互換 [並行輸入品]

https://amzn.to/44dqYeQ