2022年9月12日月曜日

state_machines gemから状態遷移図を実際に作成する方法

state_machines gemから状態遷移図を実際に作成する方法

概要

前回 state_machines gem を使ってオブジェクトの状態を管理する方法を紹介しました
今回は実際に作成した状態遷移のコードから状態遷移図を出力する方法を紹介します

環境

  • macOS 11.6.8
  • graphviz 5.0.0
  • Ruby 3.1.2p20
    • state_machines 0.5.0

graphviz環境の構築

こちらを参考にgraphvizをインストールします

state_machines-graphvizのインストール

  • vim Gemfile
gem "state_machines-graphviz"
  • bundle install

状態遷移図の出力

  • bundle exec rake -f ./vendor/ruby/3.1.0/gems/state_machines-graphviz-0.0.2/lib/state_machines/tasks/state_machines.rake state_machines:draw FILE=$(pwd)/app.rb CLASS=Instance

ちょっと長いですが bundle install したので rake ファイルのパスをオプションで指定しているためです

グローバルな環境にインストールしたのであれば Rakefile 内で require があれば自動でタスクを読み込んでくれるはずです

動作確認

カレントディレクトに doc/state_machines というディレクトリがあるのでその配下に png で状態遷移図あります

  • open doc/state_machines/Instance_state.png

最後に

コードで状態遷移図を管理したい場合だけでも便利かもしれません

参考サイト

2022年9月9日金曜日

Ruby state machine 超入門

Ruby state machine 超入門

概要

Ruby の state_machines gem を使ってオブジェクトの状態遷移を行ってみました
動きを確認できる簡単なサンプルコードを紹介します

環境

  • macOS 11.6.8
  • Ruby 3.1.2p20
    • state_machines 0.5.0

インストール

  • vim Gemfile
gem "state_machines"
  • bundle install

サンプルコード

require 'state_machines'

class Instance
  # 初期状態を定義します
  # 今回は初期状態は wait とします
  # イベントによる遷移先の定義はブロック内で行います
  # 今回は wait -> creating -> running というシンプルな状態遷移を考えます
  state_machine :state, initial: :wait do
    # run がコールされたら creating 状態にします (インスタンスの作成)
    event :run do
      transition wait: :creating
    end
    # complete がコールされたら running 状態にします (インスタンスの作成完了)
    event :completed do
      transition creating: :running
    end
    # cancel がコールされたら wait 状態にします (インスタンスの作成キャンセル)
    event :cancel do
      transition creating: :wait
    end
    # delete がコールされた wait 状態にします (インスタンスの削除)
    event :delete do
      transition running: :wait
    end
  end
end

# 動作確認
ins = Instance.new
puts ins.state  # => wait
ins.run
puts ins.creating? # => true
ins.completed
puts ins.running? # => true
ins.delete
puts ins.wait? # => true
ins.run
ins.cancel
puts ins.wait? # => true

少し解説

コード内のコメントを追うのが一番いいかなと思うので少しだけ補足します

event メソッドで状態が遷移するイベントを定義します
そのイベントが発生したら transition で状態の遷移先を定義します
transition は「今の状態」「次の状態」という2つの引数で定義します

もし今の状態からの遷移先がない場合は現在の状態に留まります (例えば wait 状態で cancel イベントが発生しても wait のまま)

最後に

次回はこの Ruby ファイルから状態遷移図を作成する方法を紹介します

参考サイト

2022年9月8日木曜日

imgを使ってdockerイメージを作成してみた

imgを使ってdockerイメージを作成してみた

概要

前回imgをUbuntuにインストールしてみました
今回は実際にイメージを作成して作成したイメージを使う方法まで紹介します

環境

  • Ubuntu18.04
  • img 0.5.11

Dockerfile

テスト用の簡単なDockerfileを作成します

  • vim Dockerfile
FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

イメージを作成する

build コマンドを使います
作成したDockerfileがあるパスで実行します

  • img build -t test .

これでイメージが作成できます

イメージを確認する

作成したイメージを確認しましょう
イメージの一覧は ls コマンドを使います

  • img ls
NAME                            SIZE            CREATED AT      UPDATED AT      DIGEST
docker.io/library/test:latest   29.02MiB        7 minutes ago   7 minutes ago   sha256:a66eafcdf1dfb4b5072062cf483046630ab70200bdbdd564dc61176747bd8c82

docker images では表示されないことも確認しましょう

イメージをエクスポートする

作成したイメージを docker で使えるようにエクスポートしみましょう
save コマンドを使います

  • img save test -o image.tar

オプションで -o を指定することでエクスポートするファイル名を指定できます
docker で使用する場合はこの tar ファイルを使って docker 側にインポートする感じになります

またデフォルトは docker 形式でエクスポートされます
他の形式 (ociなど)を指定したい場合は--formatオプションを使って指定しましょう

dockerにイメージをインポートする

先ほど作成した image.tar を docker 側にインポートしてみましょう
docker load を使うと外部の圧縮ファイルなどからイメージをインポートすることができます

  • docker load -i ./image.tar
7f5cbd8cc787: Loading layer [==================================================>]  30.43MB/30.43MB
Loaded image: test:latest

動作確認

docker run してイメージがインポートできているか確認しましょう

  • docker run --rm test

これで hello と表示されれば OK です

最後に

img で docker ビルドを作成する方法を紹介しました
docker が使えない環境ではこのように img を使ってイメージを作成してから docker 側にインポートする感じになります

docker のインストールが不要なので dind を使えない環境でもイメージを作成することができます

その他

イメージを削除する場合は rm を使います

  • img rm test

ビルドに使用した他のイメージは du コマンドで確認できます

  • img du
WARN[0000] using host network as the default
ID                              RECLAIMABLE     SIZE            DESCRIPTION
lqwt4dvz2iz7yo3jmn72tlbvr*      true            4KiB            local source for context
oe3gzrgb1xaev7d7r9fn5uk1m*      true            4.056KiB        local source for dockerfile
ovuxl5f604pycqhbqie0rswdl       true            105.9MiB        pulled from docker.io/library/ubuntu@sha256:20fa2d...
Reclaimable:    105.9MiB
Total:          105.9MiB

これらを削除したい場合は prune コマンドを使います

  • img prune

2022年9月7日水曜日

imgをUbuntuにインストールする方法

imgをUbuntuにインストールする方法

概要

imgはDockerイメージを作成することができるツールです
デーモンレスなのでdindなど使えない場合でもイメージを作成することができます
今回は Ubuntu18.04 にソースインストールする方法を紹介します

環境

  • Ubuntu 18.04
  • golang 1.16
  • img 0.5.11

golang のインストールと設定

バイナリインストールでもパッケージでもインストールでも大丈夫です
GOPATH と GOPATH/bin 配下を環境変数に追加します

export GOPATH=/root/go
export PATH="$GOPATH/bin:$PATH"

go-bindata のインストール

go-bindata コマンドも必要になるのでインストールします

  • go get -u github.com/jteeuwen/go-bindata/...

必要なパッケージのインストール

その他コンパイルに必要になるパッケージをインストールします

  • apt -y install uidmap libseccomp-dev

img のインストール

ソースコードを持ってきてコンパイルします

  • mkdir -p $GOPATH/src/github.com/genuinetools
  • git clone https://github.com/genuinetools/img $GOPATH/src/github.com/genuinetools/img
  • cd $GOPATH/src/github.com/genuinetools/img
  • make
  • sudo make install

動作確認

  • img version
img version
img:
 version     : v0.5.11
 git hash    : 16d3b6ca-dirty
 go version  : go1.16.3
 go compiler : gc
 platform    : linux/amd64
runc:
 version     : 1.0.0-rc10+dev
 commit      : 56aca5aa50d07548d5db8fd33e9dc562f70f3208
 spec        : 1.0.2

最後に

無事 Ubuntu にインストールできたので次回は img コマンドを使ってイメージの作成を行ってみようと思います

参考サイト

2022年9月6日火曜日

kaniko超入門

kaniko超入門

概要

kaniko は Docker イメージを作成することができるツールです
dind を使うことなくイメージを作成できることができるので GitlabCI などでよく使われます
今回は GitlabCi で使って見ました

環境

  • macOS 11.6.8
  • kaniko 1.9.0

ContainerRegistry をオンにする

今回は Gitlab の ContainerRegistry に push するのでプロジェクトの ContainerRegistry をオンにしましょう
オンになっていないと CI でエラーになります

Dockerfile

プロジェクトの直下に Dockerfile を配置します
この Dockerfile を元にイメージを作成します

FROM ubuntu
ENTRYPOINT ["/bin/bash", "-c", "echo hello"]

.gitlab-ci.yml

これもプロジェクト直下に作成します
kaniko/executor というイメージを使って先程作成した Dockerfile を元にイメージを作成し push まで行います

認証情報を配置してあとは executor コマンドで Dockerfile とイメージの push 先を指定するだけで使えます

build:
  stage: build
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR/Dockerfile --destination $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG

動作確認

push したイメージを container registry から pull して実行してみましょう
「hello」と表示されれば OK です

最後に

ローカルで単体で使用するのは難しいかもです
基本的には k8s や docker 上で使います

参考サイト

https://github.com/GoogleContainerTools/kaniko/blob/main/docs/tutorial.md

2022年9月5日月曜日

Ubuntu18.04でPS1を変更してプロンプトをカラーにする方法

Ubuntu18.04でPS1を変更してプロンプトをカラーにする方法

概要

実はデフォルトの .bashrc でカスタマイズできるのでそれを使った方法を紹介します

環境

  • Ubuntu18.04

force_color_prompt を有効にする

.bashrc に force_color_prompt という設定項目があります
デフォルトだとコメントアウトされているのでコメントインしましょう

  • vim .bashrc
force_color_prompt=yes

再ログインしてみる

この状態だけでもプロンプトがカラーになります

カラーをカスタマイズする

.bashrc に以下のような条件文があるのでここでPS1を変更しましょう

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

例えば以下のようにするとユーザ名とホスト名の部分の色を変更することができます

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]@\[\033[01;33m\]\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

上記の場合ユーザ名が緑色でホスト名が黄色になります

カラーコード

このあたりが参考になるのでこれを見ながら好きな色を指定しましょう

トラブルシューティング: うまく .bashrc が読み込まれない場合は

.bash_profile がホームディレクトリにあるとそれを優先して読み込むので .bashrc は読み込まれません
.bash_profile の内容を .bashrc に転機し .bash_profile を削除することで対応しましょう

2022年9月2日金曜日

gitlab-runnerをnon interactiveで登録する方法

gitlab-runnerをnon interactiveで登録する方法

概要

過去に dockerでgitlab-runnerを起動する方法を紹介しました
その際にCLIで対話形式でrunnerを登録する方法を試しました
今回は非対話形式でrunnerを登録する方法を紹介します

環境

  • Ubuntu18.04
  • gitlab-runner 15.3.0

gitlab-runnerの起動

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

runnerの登録

ここがポイントです
--non-interactive オプションを使います

docker run --rm -v /etc/gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "https://your.gitlab.com/" \
  --registration-token "xxxxxxxxxxxxx" \
  --description "docker-runner" \
  --maintenance-note "non interactive test runner" \
  --tag-list "docker,aws" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected"

runnerの再起動

  • docker restart gitlab-runner

動作確認

参考サイト