2021年5月31日月曜日

Linux版 UnityHub の headless に対応した Docker image

Linux 版 Unity 使いたいので UnityHub CLI でインストールしようと思ったらめんどくさかったので備忘録。

Feedback - Headless Mode Isn't Really Headless - Unity Forum

なにが面倒だったというと、 headless モードが headless モードじゃなくて docker とか VM とかでディスプレイない環境だと起動ができないのです。

こんな感じのエラーで起動できません。

(unityhub-bin:919): Gtk-WARNING **: 08:08:17.580: cannot open display: 

で、xvfb で回避できるのですが、すでに回避策を講じた Docker image を同僚に教えてもらいました。このイメージを使ったら Unity のインストールとかの自動化も簡単にできそうです。
https://hub.docker.com/u/unityci

Dockerfile はこれ
https://github.com/game-ci/docker/blob/main/hub/Dockerfile

中身を読むとわかりますが、AppImage をばらして xvfb-run してます。
ちょっと気になるのは、ばらした AppImage が / に展開されることくらいですかねぇ。
Docker なら、まぁいいかもしれませんがどこかのインスタンスに入れるなら嫌だなぁと思ったので、自分なりに書き直してみました。

書き直し
イメージ

できあがったイメージと Dockerfile はこちらです。
https://hub.docker.com/r/srzzumix/unityhub
https://github.com/srz-zumix/docker-unityhub

書き直してわかったポイント

PR のコメントとして残してあります。

  • unityci/hub image は APPDIR が未定義なため / で実行されていた
  • zenity がないと unityhub-bin 起動後に進まなかった
  • ~/.config/Unity Hub/eulaAccepted ファイルを作成して EULA 確認をスキップ
  • unityhub.desktop ファイルにバージョンが書いてある
  • Mac 版だと -- --headless help のようにオプションを指定するが Linux 版で -- つけると先に進まない

以上、回避策など取らずに使えるようになってくれると嬉しいですね。では。

2021年5月27日木曜日

[Debian] pyenv install で Missing the OpenSSL lib? で失敗する場合の対応と 3.0~3.10 全部入り Dockerfile 書いた

 「Missing the OpenSSL lib?」で検索するといろいろ対策方法が出てきますが、大体ここに書いてあるので自分の環境に合わせて方法を見れば良いと思います。
https://github.com/pyenv/pyenv/issues/950

本記事では「Debian」環境で対処した方法と、pyenv install で 3 系を全部入れてみた Dockerfile を紹介します。

対処方法

libssl-dev をアンインストールして libssl1.0-dev をインストールする。以上。
apt-get remove -y libssl-dev && apt-get install -y libssl1.0-dev

OpenSSL 1.1 に対応してないかららしいですね。
ちなみに 3.10 系は libssl1.0-dev だと逆にダメでした。

全部入り Dockerfile
# development env

ARG VERSION=3.7-stretch
FROM python:$VERSION
ARG VERSION

LABEL maintainer "srz_zumix <https://github.com/srz-zumix>"

SHELL ["/bin/bash", "-o", "pipefail", "-c"]
RUN apt-get update -q -y && \
    apt-get install -y --no-install-recommends \
        make \
        build-essential \
        libssl-dev \
        zlib1g-dev \
        libbz2-dev \
        libreadline-dev \
        libsqlite3-dev \
        wget \
        curl \
        llvm \
        libncurses5-dev \
        xz-utils \
        tk-dev \
        libxml2-dev \
        libxmlsec1-dev \
        libffi-dev \
        liblzma-dev \
        && \
    apt-get remove -y libssl-dev && \
    apt-get update -q -y && \
    apt-get install -y --no-install-recommends libssl1.0-dev && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

ENV PATH="/root/.pyenv/bin:${PATH}"
RUN curl https://pyenv.run | bash && \
    echo "eval $(pyenv init -)" >> ~/.bashrc && \
    echo "eval $(pyenv virtualenv-init -)" >> ~/.bashrc
RUN	pyenv install -s "$(pyenv install -l | grep -e '\s3\.9[^0-9].*' | tail -1 | xargs echo -n)"
RUN	pyenv install -s "$(pyenv install -l | grep -e '\s3\.8[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.7[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.6[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.5[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.4[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.3[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.2[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.1[^0-9].*' | tail -1 | xargs echo -n)"
RUN pyenv install -s "$(pyenv install -l | grep -e '\s3\.0[^0-9].*' | tail -1 | xargs echo -n)"

RUN apt-get remove -y libssl1.0-dev && \
    apt-get update -q -y && \
    apt-get install -y --no-install-recommends libssl-dev && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*
RUN pyenv install -s "$(pyenv install -l | grep -v 'dev' | grep -e '\s3\.10[^0-9].*' | tail -1 | xargs echo -n)"  

以上。

2021年5月13日木曜日

[技術書典] Re:VIEW Starter で印刷・電子書籍版で config.yml を使い分ける

Re:VIEW Starter (もしくは Re:VIEW)を使ってると電子書籍版と印刷版で設定変えたいことがあります。

たとえば
  ## リンクのURLを脚注に埋め込む(PDFでのみ)。
  linkurl_footnote: false   # trueならリンクのURLを脚注に埋め込む(お勧め)
リンクの URL が自動的に footnote になるのでとても便利なのですが、電子書籍版はリンクで飛べるので false にしてました。
やり方
電子書籍版用の YAML ファイルを用意する
Re:VIEW では config.yml 、Re:VIEW Starter では加えて config-stater.yml がありますが、それぞれ電子書籍用の YAML を用意します。
このとき YAML はコピペではなく、電子書籍版で設定した項目だけ書けば OK です。

例:

ポイントは inherit で優先したい設定の YAML を後ろに書くことです。
また、contentdir はルートの YAML にないと rake でエラーになるので注意してください。

電子書籍版用の yml ファイルを指定してビルドする
Re:VIEW では「config」環境変数に設定した YAML ファイルを読み込んでくれるので、ビルドする際に config=config-e.yml のように指定すれば OK です。
  config=config-e.yml rake preproc pdf
  docker run --rm -e "config=config-e.yml" -v "$(pwd)":/work -w /work kauplan/review2.5 rake preproc all
まとめ
  • YAML を分ける
  • inherit を利用して共通の設定を読み込む
  • config 環境変数に YAML ファイルをセット
これで設定切り替えが簡単にできるようになりました。
宣伝
拙著発売中です。よろしくお願いします。


2021年5月6日木曜日

DockerHub / GitHub Actions での docker build が No space left on device だったので CircleCI でビルドした話

無料になったIntel compilerをCentOS8にインストールしてみる - Qiita
Intel compilerが2021年になってから実質的に無料になってしまったというのを知り、勢いで作ったのが↓のリポジトリ
https://github.com/srz-zumix/docker-icx
(現在は名前変えてます。https://github.com/srz-zumix/docker-oneapi-hpckit
公式がサポートしてない Ubuntu 16.04 で oneAPI のセットアップをしてます。
(intel-basekit と intel-hpckit。パッケージリストはこちらを参照)

DockerHub Automated Build

で、いつもどおり DockerHub の Automated Build でビルドしたんですが、「No space left on device」でビルドできませんでした。


デカイからなぁ・・(上が公式、下が自前)

GitHub Actions でビルド

space を増やすのもめんどくさそうなので、別の CI サービスを使おうと考え、GitHub Actions でビルド、DockerHub に push するようにしてみました。
(とりあえず build までで https://github.com/srz-zumix/docker-icx/blob/main/.github/workflows/dockerhub.yml

「No space left on device」!!
ググると prune しろとか出てきたので試すも変わらず。うーん。

CircleCI ・・・その前に

じゃあ、しょうがないし他のサービスにするか。
というわけで次点で CircleCI !というふうに決めたわけじゃないです。
拙著「あつまれ CI サービス タダではじめる継続的インテグレーション生活」に記載されている各CIサービスの実行環境の空きディスク容量を参考にして小さいサービスを避けて決めました。




これは本から一部抜粋しましたが、GitHub Actions の Linux エージェントは 20GB ほどしか空きがないのでダメなのもなんとなく納得。
CircleCI の Linux machine:true は 90GB ありそうだったので大丈夫やろ、という気持ちで決めました。
CircleCI でビルド

というわけで、CircleCI でビルドしました。
目論見通り成功です!


最後に

作ったイメージはこちらにあります。
https://hub.docker.com/r/srzzumix/oneapi-hpckit
とはいえ、公式のイメージがあるので特に理由(Ubuntu 16.04 じゃなきゃだめとか)がなければそちらを使うのがいいと思います。(↑のは1レイヤーにまとめすぎて pull が遅い…)
https://hub.docker.com/r/intel/oneapi-hpckit

また intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic パッケージだけをインストールしたイメージも作ったのでこちらに置いてあります。
https://hub.docker.com/r/srzzumix/oneapi-cxx
hpc-kit は結構イメージサイズがデカイので、 C++ Compiler だけ欲しい人がそのパッケージだけインストールしたイメージを作ると良さそうです。
私はこちらを Intel C++ Compiler でのビルド・テストに利用したいと思ってます。

今回は以上。ではでは。