コンテナベースの開発環境構築

Dockerで各プロジェクトの開発環境を管理してみる。
- ホストPCのVSC上で編集&デバグ
- プロジェクトはGitで管理
- Python仮想環境はコンテナ上に構築
- Gitへのコミットでコンテナを自動生成
- コンテナ生成後にテストを自動実行
- ドキュメントをコードから自動生成(これは別タスクかな)

MicroPythonのインストール。

Dockerコンテナリポジトリ
- Docker Hub
- Amazon Elastic Container Registry (AWS ECR)
- Azure Container Registry
- Google Container Registry

プロジェクトはGitHubで管理し GitHub Actions で MicrotPython の自動テストを実行したいので、GitHub Packages を利用する。
コンテナ生成プロジェクトは public で公開するので無料で開発と実行できる。

GitHub Actions を登録 .github/workflows/docker-image.yml
Dockerfileを作成して実行する。
DOCKER_NAME は リポジトリ変数、DOCKER_PASSWORD はリポジトリシークレットに定義
step間の変数は $GITHUB_ENV に登録することでやりとり

ARM64, ADM64 の multi platform 対応には QEMU と buildx が必要。
そのままGitHub Actions で実行したらvolume 不足でレラーになった。
QEMU の設定が不足していたのが原因と思われる。

Mac上でmicropythonのコンテナを作成すると、/ports/unix での make test で
...
2 tests failed: float_parse float_parse_doubleprec
make: *** [Makefile:267: test_full] Error 1
のエラーになってしまう。
テスト結果 tests/results/*
を参照すると浮動小数点演算で若干の差がでてしまう模様。
以下を参照するとFPUのハードウェア挙動による差がでているのか?

$GITHUB_REPOSITORY_OWNER は ${{ github.repository_owner }} と記載するのが正解。
$GITHUB_REPOSITORY は owner/repository の値に展開される。
QEMUによる arm64 の git clone が時間がかかり過ぎる。
→ 事前にビルド用のコンテナ内に clone して各 platform にコピーしてみる
micropython プロジェクトを git の submodule にして clone 時に recursive で取り込む。
デバイスの容量不足で停止してしまった。
git clone だと容量が足りるのに COPYだとだめなのはなぜだろう??
System.IO.IOException: No space left on device : '/home/runner/runners/2.309.0/_diag/Worker_20230913-095304-utc.log'
...
ベースにしている Runner の容量がオーバーしたのが原因。
下記を参考に容量を削減することで実行できるようになった。

Dockerfile の記述注意(自分的にハマった点の備忘録)
- ディレクトリCOPY
わかっている人には当たり前だけど、COPY でのディレクトリコピーは以下に注意
# 意図通りのコピー
COPY hoge/ dst/hoge
# NGになる例
COPY hoge/ dst/
- RUNの可視性向けにヒアドキュメント使う?
ヒアドキュメントは bash の機能で、公式の推奨記述 にはRUNの記述例として載っていないのであまり使いたくないけど、たしかにメンテナンスはし易い。
Dockerfile の RUN は sh なので、以下のように bash で実行するように置き換える。
RUN bash <<EOS
echo "AAAA"
source tool/ci.sh
call_func
EOS

GitHub Packages への登録で 403 エラーになってしまう問題にハマった。
アクセス権の設定箇所が漏れていた
- オーナー(組織または個人)の権限
- アクションの権限
- パッケージに対するリポジトリの権限
最後のが漏れていて数日悩んでしまった。
公式のドキュメントは以下にあった。

上記をクリアしたら今度はイメージの pull で docker: manifest unknown.
のエラーに。
どうもCacheが悪さをしていた模様。
原因はまだ調査中。

Pull Request ができない原因は以下の記事で解消...
できず。というのも組織リポジトリなのでリポ所有者名とPR所有者名が異なるため。
APPROVE_OWNER というリポ変数を作成して対応。
さらに権限を追加。

バッチの表示
ワークフローの状態は GitHub の標準を利用できる。
固定バッチなら img.shields.io で以下の URL パターンで設定できる.
- SUBJECT : タイトル
- STATUS : ステータス
- COLOR : 色(名前 or コード)
https://img.shields.io/badge/<SUBJECT>-<STATUS>-<COLOR>.svg

VSCの開発環境でMS提供のイメージを使うとIISが入っているが必要なのか?
Azure連携がメリットのようだが、当面不要なのでまずはDockerの公式コンテナなどを利用して環境を構築することにする。