5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitLabAdvent Calendar 2021

Day 16

Gitlab CI on RaspberryPi4

Last updated at Posted at 2021-12-15

概要

Gitlab-Runner を RaspberryPi4 で動作させ RaspberryPi4 上で GitlabCI を走らせてみます
RaspberryPi4 上で動作させることで gpio を使ってジョブやパイブラインの結果をインタラクティブにしてみます
今回は実行結果に応じて光らせる LED の種類を変更してみます

環境

  • RaspberryPi4 8GRAM
    • Linux raspberrypi 5.10.17-v8+ #1414 SMP PREEMPT Fri Apr 30 13:23:25 BST 2021 aarch64 GNU/Linux
  • フルカラーLED (RGBフルカラーLED 5mm OSTA5131A カソードコモン)

Gitlab-Runnerのインストールと登録

Gitlab の URL とトークンを入力して登録を完了します
gitlab-runner ユーザが gpio を制御できるようにグループに追加します

  • sudo usermod -aG gpio gitlab-runner

フルカラーLEDのシールド

ユニバーサル基板にハンダします
必要なピン数分だけピンヘッダを準備していますが余裕があればシールドみたいにすべてのピンヘッダをつけても OK です
使用しているのは 11,12,13,14(GND) になります
抵抗はすべて220オームを使用しています

gitlab_runner_on_gitlab1.png

gitlab_runner_on_gitlab2.png

取り付けた感じは以下のようなになります

gitlab_runner_on_gitlab3.png

フルカラーLEDを点滅させるスクリプト

PWM を使います
カラーコードをデューティー比に変換し ChangeDutyCycle で各色の明るさを調整することで色の調整をしています

  • vim /home/pi/work/python/blink.py
# -*- coding: utf-8 -*-
"""フルカラーのLEDを制御するモジュール."""
import RPi.GPIO as GPIO
import time
import logging
import sys

from logging import getLogger


class Blink():
    """フルカラーのLEDを赤or緑点滅するクラス."""

    # 各ピン定義
    RED = 11
    GREEN = 13
    BLUE = 12

    def __init__(self, color=GREEN):
        """ピンを初期化します."""
        logging.basicConfig(level=logging.INFO)
        self.logger = getLogger(__name__)
        # RGB のカラーコードの設定
        if color == self.RED:
            self.color = 0xFF0000
        elif color == self.GREEN:
            self.color = 0x00FF00
        pin_def = {
            self.RED: 2000,  # red
            self.GREEN: 2000,  # green
            self.BLUE: 5000,  # blue
        }
        GPIO.setmode(GPIO.BOARD)
        # 制御するピンを管理するdict
        self.pins = {
            self.RED: None,
            self.GREEN: None,
            self.BLUE: None,
        }
        # ピンの初期化
        for pin_num, freq in pin_def.items():
            GPIO.setup(pin_num, GPIO.OUT)
            pin = GPIO.PWM(pin_num, freq)
            pin.start(0)
            self.pins[pin_num] = pin
        self.logger.info('Started pwm pins for a full color led.')

    def calc_duty(self, x, in_min, in_max, out_min, out_max):
        """デューティー比を計算します."""
        return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

    def blinkColor(self, col):
        """各ピンに色を設定し指定の色を光らせます."""
        # 左ビットシフト
        red = (col & 0x110000) >> 16
        green = (col & 0x001100) >> 8
        blue = (col & 0x000011) >> 0
        # デューティー比に変換 (0-100)
        red = self.calc_duty(red, 0, 255, 0, 100)
        green = self.calc_duty(green, 0, 255, 0, 100)
        blue = self.calc_duty(blue, 0, 255, 0, 100)
        # ピンにデューティー比を設定
        self.pins[self.RED].ChangeDutyCycle(red)
        self.pins[self.GREEN].ChangeDutyCycle(green)
        self.pins[self.BLUE].ChangeDutyCycle(blue)

    def blink(self):
        """フルカラーLEDを点滅させます."""
        try:
            self.logger.info('Started blinking a full color led.')
            self.blinkColor(self.color)
            time.sleep(5)
        except KeyboardInterrupt:
            pass
        finally:
            self.cleanup()

    def cleanup(self):
        """クリーンアップ処理を実行します."""
        for pin in self.pins.values():
            pin.stop()
        GPIO.cleanup()
        self.logger.info('The pin cleanup process was completed.')


if __name__ == "__main__":
    arg_color = sys.argv[1]
    if arg_color == "green":
        color = Blink.GREEN
    elif arg_color == "red":
        color = Blink.RED
    else:
        sys.exit(1)
    test = Blink(color)
    test.blink()

RaspberryPi 上で python /home/pi/work/python/blink.py red と実行して赤色が点灯するのを確認しましょう

.gitlab-ci.ymlの作成

必ず成功するような CI になっています
成功した場合には緑を点灯し失敗した場合には赤を点灯させるようになっています
動作確認で失敗時の挙動も確認します

  • vim .gitlab-ci.yml
stages:
  - stage1
  - blink_red
  - blink_green

.echo1_script: &echo1_script
  - "export MSG=hello"
  - "echo ${MSG} >> msg.txt"
  - "export MSG=HELLO"

send_alert:
  stage: blink_red
  script:
    - "python /home/pi/work/python/blink.py red"
  when: on_failure

echo1:
  stage: stage1
  script:
    - *echo1_script
  artifacts:
    paths:
      - msg.txt

send_success:
  stage: blink_green
  script:
    - "python /home/pi/work/python/blink.py green"

動作確認

CI が成功した場合は緑色が点灯し CI が失敗した場合は赤色が点灯するのが確認できます

最後に

RaspberryPi4 の gpio だと 20mA くらいの出力電流が限界なので LED あたりだと簡単に制御できます
MOSFET やトランジスタを使えば出力電流を上げて 5V 駆動の DC モータやサーボモータあたりであれば制御できると思います

ただその場合は簡単な保護回路 (逆起電力など) も必要になるのでご注意ください

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?