プログラマブル深海魚

目立たないけど華やかに

WindowsでCircleCIのローカル環境を動かす

CIツールの学習としてCircleCIを動かしてみたのですが、Windows上でCircleCIのローカル環境を動かす際になかなかうまくいかず紆余曲折があったため記録を残します。

目次

用意したCircleCIの設定ファイル

今回はCircleCIを動かしてみるのが目的だったため、Docker上でPythonを使って"Hello, world!"を表示するだけのビルドを用意しました。(ビルドしてないけど)

version: 2.1
jobs:
  build:
    docker:
      - image: cimg/python:3.10.5
    steps:
      - run:
          name: The First Step
          command: |
            python -c "print('Hello World!')"

Windows用のローカルCLI環境を入れてみる

↓でWindows用のローカルCLI環境の案内があるため、とりあえず入れてみました。
https://circleci.com/docs/ja/local-cli

動かしてみると早速↓のエラーが発生。

PS D:\Users\ancov\OneDrive\CircleCiSample> circleci config validate
Config file at .circleci/config.yml is valid.
PS D:\Users\ancov\OneDrive\CircleCiSample> circleci local execute
Error: Error creating temporary config file: open /tmp\3197476852_circleci_config.yml: The system cannot find the path specified.

どうやらドライブ直下にtmpフォルダが無いとエラーになるようなので、tmpフォルダを手動で作成して再度動かしてみると、またもやエラー。

PS D:\Users\ancov\OneDrive\CircleCiSample> circleci local execute
Fetching latest build environment...
Docker image digest: sha256:72624b09a668f0684c0151a61231d8458defe7d2dd46430f6db33db5f63c0f88
Error: failed to execute docker: not supported by windows

CircleCIのIssueなんかを読むと、Windowsではビルドの実行に対応していないみたい?
https://github.com/CircleCI-Public/circleci-cli/issues/152
仕方がないので、WSLを使ってCircleCIのローカルCLIを動かしてみることにしました。

WSL上でローカルCLI環境を動かしてみる

Linuxの場合、公式ではSnapを利用してインストールする方法が案内されていますが、WSLの場合はSnapを使うのに小細工が必要でした。
↓を参考に、WSLにローカルCLI環境をインストールしました。
https://qiita.com/matarillo/items/f036a9561a4839275e5f

ancov@DESKTOP-17P3D24:~$ sudo apt-get update
ancov@DESKTOP-17P3D24:~$ sudo apt-get install -yqq daemonize dbus-user-session fontconfig
ancov@DESKTOP-17P3D24:~$ sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
ancov@DESKTOP-17P3D24:~$ exec sudo nsenter -t $(pidof systemd) -a su - $LOGNAME
ancov@DESKTOP-17P3D24:~$ sudo apt install snapd
ancov@DESKTOP-17P3D24:~$ sudo snap refresh
ancov@DESKTOP-17P3D24:~$ sudo snap install docker circleci
ancov@DESKTOP-17P3D24:~$ sudo snap connect circleci:docker docker

ただ、これで実行してもエラーが発生しました。

ancov@DESKTOP-17P3D24:/mnt/d/Users/ancov/OneDrive/CircleCiSample$ circleci config validate
Config file at .circleci/config.yml is valid.
ancov@DESKTOP-17P3D24:/mnt/d/Users/ancov/OneDrive/CircleCiSample$ sudo circleci local execute
Fetching latest build environment...
Docker image digest: sha256:62f727286472ed21ad35c59d71ae72b373f566557b69951e2d3471b85c2ba587
Error: failed to start event processor: failed to compute task config: failed to read config file: read /tmp/local_build_config.yml: is a directory

↓を見る限りだと、マウントドライブで利用はできないみたい?
https://github.com/CircleCI-Public/circleci-cli/issues/212

WSLの中に設定ファイルを作成してもいいのですが、実はDocker Desktop for WindowsのDockerをWSL上で動かす機能があったので、それを利用してみます。

WSLからWindowsのDockerを使って動かす

SnapでインストールするとLinux上のDockerが使われてしまいそうなので、CircleCIのローカルCLI環境を手動でインストールしました。
(あまり真面目に調べてないので、Snapでインストールしてもできるかも)

ancov@DESKTOP-17P3D24:~$ sudo sh -c "curl -fLSs https://circle.ci/cli | bash"
[sudo] password for ancov:
Starting installation.
Installing CircleCI CLI v0.1.20500
Installing to /usr/local/bin
/usr/local/bin/circleci

WindowsのDockerは、デフォルトのWSLディストリビューションに対してのみ使用できるらしいので、デフォルトを変更します。
Docker Desktopの設定で"Enable WSL 2 Windows Features"にチェックが入ってなければ、これにチェックを入れる必要もあるみたいです。

PS D:\Users\ancov> wsl -l -v
  NAME                   STATE           VERSION
* docker-desktop-data    Running         2
  Ubuntu                 Running         2
  docker-desktop         Running         2
PS D:\Users\ancov> wsl --set-default Ubuntu

これで無事に動きました。

ancov@DESKTOP-17P3D24:/mnt/d/Users/ancov/OneDrive/CircleCiSample$ circleci config validate
Config file at .circleci/config.yml is valid.
ancov@DESKTOP-17P3D24:/mnt/d/Users/ancov/OneDrive/CircleCiSample$ sudo circleci local execute
Fetching latest build environment...
Docker image digest: sha256:9d8489ec41d4835fbc1ae1a4b42d23bb9dd68838c803f7f3779d2ce43b7e050b
====>> Spin up environment
......
The redacted variables listed above will be masked in run step output.====>> The First Step
  #!/bin/bash -eo pipefail
python -c "print('Hello World!')"
Hello World!
Success!

参考文献

CircleCI のローカル CLI のインストール - CircleCI
https://circleci.com/docs/ja/local-cli

設定ファイルの概要 - CircleCI
https://circleci.com/docs/ja/config-intro

いまさらだけどCircleCIに入門したので分かりやすくまとめてみた - Qiita
https://qiita.com/gold-kou/items/4c7e62434af455e977c2

Error: Error creating temporary config file · Issue #411 · CircleCI-Public/circleci-cli · GitHub
https://github.com/CircleCI-Public/circleci-cli/issues/411

Unable to run circleci local execute from windows machine · Issue #152 · CircleCI-Public/circleci-cli · GitHub
https://github.com/CircleCI-Public/circleci-cli/issues/152

WSL2(Ubuntu 20.04)上でSnapdを動かす
https://zenn.dev/dozo/articles/63c3e066f3c6ed

WSL2でSystemdを使うハック - Qiita
https://qiita.com/matarillo/items/f036a9561a4839275e5f

local execute - fails to read config file · Issue #212 · CircleCI-Public/circleci-cli · GitHub
https://github.com/CircleCI-Public/circleci-cli/issues/212

Windows10+WSL2(Ubuntu)+DockerでCircleCIのローカル実行ができる環境を作る - Qiita https://qiita.com/ysd_marrrr/items/a9370c4c88b5da094194

WSL:WindowsLinuxでファイルを交換する
https://zenn.dev/ohno/articles/13af6f4e1588a5

Windows Subsystem for Linux に関するドキュメント | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/wsl/