###### tags: `ubuntu22.04` `arm64` `buildbot`
# ARM64 環境向け Buildbot Docker コンテナ実行環境整備
## 事前準備
- 以下の手順で ARM64 向けの buildbot の Docker イメージを作成しておく、サンプルのコンテナを動作させておく。
- https://hackmd.io/@yuzuafro/arm64-buildbot-docker-image
## ホスト環境に buildbot をインストールする
`master.cfg` のチェックなどに使用するため、ホスト環境にも `buildbot` をインストールする。以下のドキュメントの内容を実行する。
- http://docs.buildbot.net/current/tutorial/firstrun.html
```bash
$ apt install -y python3.10-venv
$ cd buildbot-docker-example-config/simple
$ python3 -m venv sandbox
$ source sandbox/bin/activate
(sandbox) $ apt-get install build-essential python3-dev libssl-dev libffi-dev
(sandbox) $ pip install --upgrade pip
(sandbox) $ pip install 'buildbot[bundle]'
(sandbox) $ buildbot --version
Buildbot version: 3.7.0
Twisted version: 22.10.0
(sandbox) $ buildbot checkconfig config/master.cfg
Config file is good!
```
使う時は、Python の仮想環境で実行する。
## buildbot コンテナ実行サンプルをローカル実行可能にする
### BUILDBOT_CONFIG_URL を無効にする
公式ドキュメントのサンプル「[First Buildbot run with Docker](http://docs.buildbot.net/current/tutorial/docker.html)」の環境が動作できるようになっているが、このままだと `BUILDBOT_CONFIG_URL` に `master.tar.gz` の変更トリガでしか動作できないので、ローカルでの設定を実行できるようにする。
`buildbot-docker-example-config/simple/docker-compose.yml` を編集する。
- `BUILDBOT_CONFIG_URL` をコメントアウトする。
- `buildbot` コンテナの設定に `volumes` を追加する(`buildbot-docker-example-config/simple/config`以下がコンテナの`/buildbot`になる)。
```bash
#- BUILDBOT_CONFIG_URL=https://github.com/buildbot/buildbot-docker-example-config/archive/master.tar.gz
volumes:
- $PWD/config:/buildbot
```
config ディレクトリを作成する。
- `buildbot-docker-example-config/simple/config` ディレクトリを作成し、`buildbot-docker-example-config/master.cfg` をコピーする。
```bash
$ cd buildbot-docker-example-config/simple
$ mkdir config
$ cp ../master.cfg config/
```
### Title の変更
動作確認用に `config/master.cfg` の `title` を編集する。
```python
# c['title'] = "Pyflakes"
c['title'] = "Test"
```
コンテナを起動する。
```bash
$ cd buildbot-docker-example-config/simple
$ docker compose up
```
タイトルが Pyflakes から Test に変更される。
http://localhost:8010/#/waterfall
### Worker の変更
worker の名前を変更する。
- `simple/config/master.cfg` の `example-worker` の部分を `test-worker` に変更する。
```python
# c['workers'] = [worker.Worker("example-worker", 'pass')]
c['workers'] = [worker.Worker("test-worker", 'pass')]
#c['builders'].append(
# util.BuilderConfig(name="runtests",
# workernames=["example-worker"],
# factory=factory))
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["test-worker"],
factory=factory))
```
- `simple/docker-compose.yml` の `worker` の `WORKERNAME` を `test-worker` に変更する。
```yaml
worker:
# WORKERNAME: example-worker
WORKERNAME: test-worker
```
コンテナを起動する。
```bash
$ cd buildbot-docker-example-config/simple
$ docker compose up
```
worker の名前が example-worker から test-worker に変更される。
http://localhost:8010/#/builders/1
### BUILDBOT_WEB_URL の変更
`BUILDBOT_WEB_URL` を `http://localhost:8010` にしていると、仮想環境外のブラウザから IP アドレス指定でアクセスした際に、閲覧はできるが実行ができない。
仮想環境の IP アドレスは固定なので `BUILDBOT_WEB_URL` も固定のアドレスで設定する。
- `simple/docker-compose.yml` の `BUILDBOT_WEB_URL` を編集する。
```yaml
#- BUILDBOT_WEB_URL=http://localhost:8010/
- BUILDBOT_WEB_URL=http://192.168.64.4:8010/
```
### Builder の変更
Worker `test-worker` に Builder `test-builder` を追加する。
- `simple/config/master.cfg` の `SCHEDULERS` セクションに `test-builder` を追加する。
```python
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["runtests"]))
# ↓↓↓ 追加
c['schedulers'].append(schedulers.ForceScheduler(
name="test-builder-force",
builderNames=["test-builder"]))
```
- `simple/config/master.cfg` の `BUILDERS` セクションの `factory` を編集する。`repourl` と `ShellCommand` の内容を編集する。
```python
factory = util.BuildFactory()
# check out the source
factory.addStep(steps.Git(repourl='https://github.com/yuzuafro/pico-moisture.git', mode='incremental'))
# run the tests (note that this will require that 'trial' is installed)
factory.addStep(steps.ShellCommand(command=["echo", "test"]))
#factory.addStep(steps.ShellCommand(command=["trial", "pyflakes"]))
```
- `simple/config/master.cfg` の `BUILDERS` セクションに `test-builder` を追加する。
```python
c['builders'].append(
util.BuilderConfig(name="runtests",
workernames=["test-worker"],
factory=factory))
# ↓↓↓ 追加
c['builders'].append(
util.BuilderConfig(name="test-builder",
workernames=["test-worker"],
factory=factory))
```
`buildbot checkconfig` で `simple/config/master.cfg` の記述をチェックする。
```bash
$ cd buildbot-docker-example-config/simple
$ buildbot checkconfig config/master.cfg
Config file is good!
```
コンテナを起動する。
```bash
$ cd buildbot-docker-example-config/simple
$ docker compose up
```
test-worker に test-builder が作成されて、`test-builder-force` で Force 実行できる。
http://192.168.64.4:8010/#/builders
## コンテナ実行中の master の再構成
`buildbot-master` のコンテナ内に入って、`buildbot reconfig` コマンドを実行できる。`/buildbot_venv/bin` 以下にコマンドがある。
```bash
$ docker exec -it $(docker ps --filter name=buildbot -q) bash
(コンテナ内)$ /buildbot_venv/bin/buildbot reconfig /buildbot
sending SIGHUP to process 7
Never saw reconfiguration finish.
```
数秒待つと再構成できる。