No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 18 | 19 | 20 || Next»

docker で GitLab CI 用の Runner を用意する

GitLab CI 用の Runner を用意するのに docker 使うのが楽そうなので docker engine のインストールからやってみた.

とりあえず,https://docs.docker.com/engine/install/ubuntu/ に沿ってリポジトリを追加してパッケージをインストール:

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

そしてテスト:

sudo docker run hello-world

それっぽい出力が見えれば docker engine の準備は OK.

んで.あとは docker コマンドで適当にやれば良いと.とりあえず https://docs.gitlab.com/runner/install/docker.html に沿ってコンテナを動かしてく.

まずは GitLab Runner の設定ファイルを保存するディレクトリをホストに用意.これをコンテナ側の /etc/gitlab-runnner にマウントすることになる.

sudo mkdir -p /srv/gitlab-runner/config

そして Runner のコンテナを起動(Runner のコンテナ内からホスト側の docker を叩けるように,ホストの /var/run/docker.sock を同じ位置にマウントする):

sudo docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock  gitlab/gitlab-runner:latest

んで,この状況だと設定ファイルがなくて動かない(エラーを吐きまくってる)ので,設定ファイルの作成をする:

sudo docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

こっちは -d を付けてないのでターミナル上で色々と聞かれるので諸々打ち込む.coordinator URL とか token とかは GitLab の Admin Area の OVerview の Runners にある "Register an instance runner" の辺りで情報が取れる(そっちだとコマンドラインだけで済みそうな実行方法が書いてあるっぽい気もする).executer は docker にでもしとくのが楽な気がする(スケールさせず,.gitlab-ci.yml の image 設定で動かすコンテナを指定可能).

作成された設定ファイルを読み込むように,先に走らせてたコンテナ内の runner をリスタート(gitlab-runner という名前のコンテナで gitlab-runner というコマンドを実行というわかりにくさ):

sudo docker exec gitlab-runner gitlab-runner restart

さて,あとはデフォルトの設定ファイルの使いにくいところを修正.とりあえず job のたびにコンテナイメージを pull されるのもあれなので pull しないでローカルのを使えるように設定ファイル(/srv/gitlab-runner/config/config.toml)の [runners.docker] セクションにポリシーを追加:

  allowed_pull_policies = [ "always", "if-not-present", "never" ]

これで後は各プロジェクトの .gitlab-ci.yml のイメージ指定のとこで pull_policy に if-not-present とか書いとけばローカルにあるイメージを使ってもらえる.CI 用のカスタムのイメージを使いたいけど Docker Hub に登録するのもメンドイという場合にも,ホスト上で commit しといたカスタムイメージを指定して pull_policy を never にすりゃいける:

image:
  name: "ubuntu:22.04-custom"
  pull_policy: never

あとはついでに設定ファイルの並行実行数の指定も変更しとくとよい?:

concurrent = 4

さて,これで Runner の準備は OK かな.docker engine のインストールが微妙にメンドイ感じに見えてたけど特に引っかかるところもなかったので楽といえば楽.

閑話休題.

カスタムした docker イメージを作るのもメモっとく.Dockerfile をちゃんと用意するのが正しい気もするけれど,インタラクティブにやる方法のメモ.

とりあえず,ホストでベースのイメージを起動.--name で名前つけとくと楽?:

sudo docker run --name ubuntu_2204_modifying -it ubuntu:22.04 bash

そしてそのままコンテナ内で諸々の準備をする.apt でなにか突っ込むとか:

apt update
apt install -y g++ curl make
exit

コンテナのシェルを抜けたらコンテナが止まるので,その状態を commit してイメージにする:

sudo docker commit ubuntu_2204_modifying ubuntu:22.04-custom

これで準備完了.

閑話休題.

docker run と docker exec を間違えるのでメモ.run は新しいコンテナを作って(コマンドを)実行.そして exec は起動中の既存のコンテナ上でコマンドを実行.run = create + start + exec という感じ?

Ubuntu で Zoom に学会タイマーを流し込む

今まで学会タイマーを Zoom に流し込むのは Win + OBS でやってたのだけど,今日は Win マシンが足りなかったので Ubuntu で用意してみた.

とりま OBS Studio と仮想カメラ用のカーネルモジュールを入れる:

sudo apt-get install ffmpeg
sudo add-apt-repository ppa:obsproject/obs-studio
sudo apt update && sudo apt install obs-studio
sudo apt install v4l2loopback-dkms

次に PulseAudio で仮想オーディオ配線.テキトウに virtmic という名前の null sink を作ってみて,あとで Zoom に入力デバイスとして使えるようにその null sink の monitor を source に remap しとく(Zoom が monitor を入力として拾ってくれないので):

pacmd load-module module-null-sink sink_name=virtmic sink_properties=device.description="virtmic"
pactl load-module module-remap-source master=virtmic.monitor source_name=virtmic_monitor source_properties=device.description="virtmic_monitor"

そしてブラウザの音出力をこの null sink に入れたいので,ブラウザで音出した状態で pavucontrol を起動して出力デバイスを virtmic にする:

sudo apt install pavucontrol
pavucontrol &

音量調整も pavucontrol でやってしまうので良いっぽい.

あとは OBS Studio でウインドウキャプチャ(xcomposite)して仮想カメラで流して Zoom で拾う.Chrome だと chrome://settings/appearance で "Use system title bar and borders" をやっとかないとキャプチャできない罠にハマった(画面全体のキャプチャだとこれなしでも拾えたけど).

なお,タイマーアプリの音を自分のスピーカーにも流したいとかなら,combined sink を作ってブラウザを出力をそこに入れて分岐させる(alsa_output.pci-0000_04_00.1.hdmi-stereo のところは pacmd list-sinks で出てくるスピーカーの sink の name で):

pacmd load-module module-combine-sink sink_name=virtmic_combined slaves=virtmic,alsa_output.pci-0000_04_00.1.hdmi-stereo

閑話休題.

これでタイムキーパーが用意できたぜと思って使ってたら,Zoom 自体が落ちやがるというオチが待っていた…… 残念.仕事にならん.

同じネットワークにつなげてたメイン PC(Win)の Zoom も同時に落ちたし,DNS の解決も出来なくなってたので,たぶんネットワークがちょっと死んでたっぽい.でもその程度で落ちないで欲しい気もする.ハートビートが途切れたからミーティングが終了したという判定だったりしたのだろうか? でも自分がホストだったんだよね…… 謎.

iftop

top コマンドのネットワークインターフェース版的なもので,ネットワークの通信量を見られるコマンド.今まで使ったことなかったけど,時々欲しいなと思う類の便利ツールだと思う.sudo apt install iftop で入るので導入も楽.

pdf のページ数を確認するワンライナー

ls *.pdf | python3 -c 'import PyPDF2;import sys;[print("{} {}".format(PyPDF2.PdfFileReader(open(file.strip(), mode="rb")).getNumPages(),file.strip())) for file in sys.stdin.readlines()]'

しばしばお世話になる pdftools の使ってる PyPDF2 ライブラリを呼ぶ感じでテキトウに.とりあえず動けばいい.

追記:PdfFileReader が Obsolete ということで,PdfReader を使って書き換え:

ls *.pdf | python3 -c 'import PyPDF2;import sys;[print("{} {}".format(len(PyPDF2.PdfReader(open(file.strip(), mode="rb")).pages),file.strip())) for file in sys.stdin.readlines()]'

read コマンドを少しまともに使う

タブ区切りのフィールドを,タブ以外はそのままに読み込んで flds という配列に入れてもらう:

while IFS=$'\t' read -a flds; do echo ${flds[0]}; ...; done

IFS をちゃんと指定しておかないと空白まで消えちゃうので注意なのと,-a オプションで配列に入れてもらえるので便利なのと.ここらは今までちゃんと使えていなかったのでメモ.

固定幅の行番号を付けたかった

cat -n で行番号を付けられるけど,固定幅でゼロ埋めした番号がほしいときには悩ましい.どうしましょ? とりあえず awk で行番号と入力を printf すりゃどうとでもなるけれど……

ということで調べたら nl コマンド使って nl -nrz -w3 -ba とかで行けるっぽい.なるほど.

でもまあ,覚えるのめんどくさいから awk でいいかなという気もする.

«Prev || 1 | 2 | 3 |...| 18 | 19 | 20 || Next»
Search
Feeds

Page Top