2022年9月30日金曜日

gitlab-runnerのhealth-checkコマンドを実行する方法

gitlab-runnerのhealth-checkコマンドを実行する方法

docker コマンドを使う場合は以下のようにします
ポイントは環境変数で HOST と PORT を指定する必要がある点です

コマンド

  • docker run --rm -e GITLAB_TCP_ADDR=gitlab.com -e GITLAB_TCP_PORT=443 gitlab/gitlab-runner:latest health-check

残念な点

コマンド内部でタイムアウトの設定などがなく無限にリトライする実装になっているので接続できない場合のタイムアウトはクライアント側でコントロールする必要があります

参考サイト

2022年9月29日木曜日

macOSでpngを結合する方法

macOSでpngを結合する方法

概要

macOS でコマンドを使って png を結合する方法を紹介します

環境

  • macOS 11.6.8
  • ImageMagic 7.1.0

インストール

  • brew install imagemagick

結合

  • convert +append a.png b.png c.png

この場合 c.png が最終的にできあがります

縦方向に結合

  • convert -append a.png b.png c.png

プラスをマイナスにします

参考サイト

2022年9月28日水曜日

emacsでvue-modeを使ったときに設定メモ

emacsでvue-modeを使ったときに設定メモ

概要

AdamNiederer/vue-modeを使うことで vue ファイルを編集するときにいい感じハイライトなどをしてくれます

ただ少しつまづく点があったのでそこも紹介します

環境

  • emacs 27.1
  • mmm-mode 20200908.2236
  • vue-mode 20190415.231
  • typescript-mode 20220815.1954

インストール

package-list-packagesから以下をインストールしました

  • mmm-mode
  • vue-mode
  • typescript-mode

script タグの setup に対応していない

これ https://github.com/AdamNiederer/vue-mode/pull/120/files が取り込まれていないため setup 構文がある場合に script タグをハイライトしてくれません

直接 vue-mode.el を編集して対応させて上げるのがいいかなと思います
140行目あたりに setup の設定を追記しましょう

  • vim /root/.emacs.d/elpa/vue-mode-20190415.231/vue-mode.el
(defconst vue--front-tag-lang-regex
  (concat "<%s"                               ; The tag name
          "\\(?:"                             ; Zero of more of...
          "\\(?:\\s-+\\w+=[\"'].*?[\"']\\)"   ; Any optional key-value pairs like type="foo/bar"
          "\\|\\(?:\\s-+scoped\\)"            ; The optional "scoped" attribute
          "\\|\\(?:\\s-+module\\)"            ; The optional "module" attribute
          "\\|\\(?:\\s-+setup\\)"             ; The optional "setup" attribute
          "\\)*"
          "\\(?:\\s-+lang=[\"']%s[\"']\\)"    ; The language specifier (required)
          "\\(?:"                             ; Zero of more of...
          "\\(?:\\s-+\\w+=[\"'].*?[\"']\\)"   ; Any optional key-value pairs like type="foo/bar"
          "\\|\\(?:\\s-+scoped\\)"            ; The optional "scoped" attribute
          "\\|\\(?:\\s-+module\\)"            ; The optional "module" attribute
          "\\|\\(?:\\s-+setup\\)"             ; The optional "setup" attribute
          "\\)*"
          " *>\n")                            ; The end of the tag
  "A regular expression for the starting tags of template areas with languages.
To be formatted with the tag name, and the language.")

(defconst vue--front-tag-regex
  (concat "<%s"                        ; The tag name
          "\\(?:"                      ; Zero of more of...
          "\\(?:\\s-+" vue--not-lang-key "[\"'][^\"']*?[\"']\\)" ; Any optional key-value pairs like type="foo/bar".
          ;; ^ Disallow "lang" in k/v pairs to avoid matching regions with non-default languages
          "\\|\\(?:\\s-+scoped\\)"      ; The optional "scoped" attribute
          "\\|\\(?:\\s-+module\\)"      ; The optional "module" attribute
          "\\|\\(?:\\s-+setup\\)"             ; The optional "setup" attribute
          "\\)*"
          "\\s-*>\n")

編集できたら el -> elc をバイトコンパイルします

  • cd /root/.emacs.d/elpa/vue-mode-20190415.231
  • rm vue-mode.elc

emacs で /root/.emacs.d/elpa/vue-mode-20190415.231/vue-mode.el を開いて byte-compile-file を実行すれば OK です

mmm-mode のカラー設定

emacs -nw で起動している場合にカーソルのある行が真っ黒になってしまうので mmm-mode の face をオフにします
ちゃんと face 用の変数が定義されているのでそれを 0 にするだけです

  • vim .emacs.d/site-lisp/init.el
; for mmm-mode
(require 'mmm-mode)
(setq mmm-global-mode 'maybe)
(setq mmm-submode-decoration-level 0)
; (set-face-background 'mmm-default-submode-face "#000000")

最後に

今回紹介した vue-mode はあまりメンテされていないようなので vue に構文などが追加された場合に追従できなくなる可能性がありそうです

2022年9月27日火曜日

FastAPI超入門

FastAPI超入門

概要

Python の Webフレームワークである FastAPI を試してみました

環境

  • macOS 11.6.8
  • Python 3.10.2
  • FastAPI 0.83.0

インストール

  • pipenv install 'fastapi[all]'

とりあえず動かすコード

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def root():
    return {"message": "Hello World"}

実行

  • pipenv run uvicorn app:app --reload

uvicorn という Webサーバで起動します

動作確認

  • curl localhost:8000

で JSON が返ってきます

更に localhost:8000/docs にアクセスすると SwaggerUI が表示されます
localhost:8000/redoc にアクセスすると ReDoc 形式のドキュメントが表示されます

OpenAPI の json を取得する

localhost:8000/openapi.json にアクセスすると取得できます
保存したい場合は

  • wget 'localhost:8000/openapi.json'

で取得できます

POST を追加する

from pydantic import BaseModel
from pydantic import BaseSettings

from fastapi import FastAPI

app = FastAPI()


class Settings(BaseSettings):
    message: str = ""


settings = Settings()


class Item(BaseModel):
    message: str


@app.get("/")
async def get_msg():
    return {"message": settings.message}


@app.post("/")
def set_msg(item: Item):
    settings.message = item.message
    return {"message": item.message}

大きく変わっていますが POST を受けたい場合は @app.post デコレータを付与して定義します

動作確認として受け取ったデータが設定できているか確認したかったので BaseSettings という FastAPI 内で使える変数を定義しています

また POST の場合ボディとしてリクエストを受け取るには BaseModel というクラスを使います
これを引数として指定することでリクエストボディとして受け取ることができます

動作確認

curl -X 'POST' \         
  'http://localhost:8000/' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "message": "hello"
}'
curl -XGET localhost:8000

で POST した message がセットされていることを確認しましょう

最後に

とりあえず GET, POST を試してみました
基本的には JSON API を作成するためのフレームワークになっていてドキュメントなども自動で生成してくれるようです

参考サイト

2022年9月26日月曜日

Faradayでクライアント証明書を設定する方法

Faradayでクライアント証明書を設定する方法

概要

RubyのFaradayでクライアント証明書を使用するサンプルコードを紹介します

環境

  • Ubuntu 18.04
  • Ruby 3.1.2
  • faraday 2.5.2

サンプルコード

class Client
  def initialize
    url = 'https://api.sample.com/users'
    cert_path = '/path/to/client.crt'
    key_path = '/path/to/client.key'
    ssl = {
      client_cert: OpenSSL::X509::Certificate.new(File.read(cert_path)),
      client_key: OpenSSL::PKey.read(File.read(key_path)),
      verify: true
    }
    @connection = Faraday::Connection.new url, ssl: ssl
  end

  def users
    res = @connection.get do |req|
      req.url '/users'
    end
    res.body
  end
end


cli = Client()
puts cli.users

2022年9月22日木曜日

Rubyでgraphvizを使ってみる

Rubyでgraphvizを使ってみる

概要

試してみました
サンプルコードを紹介します

環境

  • macOS 11.6.8
  • Ruby 3.1.2p20
  • graphviz 5.0.0

graphvizのインストール

  • brew install graphviz

ruby-graphvizのインストール

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

サンプルコード

require 'ruby-graphviz'

g = GraphViz.new(:G, :type => :digraph)

hello = g.add_nodes("Hello")
world = g.add_nodes("World")

g.add_edges(hello, world)

g.output(:png => "hello_world.png")

動作確認

  • bundle exec ruby app.rb

参考サイト

2022年9月21日水曜日

emacsをdockerで起動する方法

emacsをdockerで起動する方法

概要

複数のバージョンを使い分けたい場合やわざわざローカルインストールするのが面倒な場合に便利です

環境

  • Ubuntu18.04
  • docker 20.10.7
  • emacs 28.1

プレーンで起動

  • docker run -it --rm silex/emacs:28.1

これでターミナル上で emacs が開きます

ローカルの .emacs ファイルをマウントする

/root にマウントしてあげましょう
もしホスト側も root ユーザの場合は以下のようになります

  • docker run -it --rm -v /root:/root silex/emacs:28.1

最後に

tmux バッファ上だと操作が少し変な感じになりそうです
ハマる場合は素直にマシンにインストールして使うのが良さそうですがパっと使いたいときには便利かもしれません

2022年9月16日金曜日

GitlabAPIを使ってユーザのアクティビティを取得する方法

GitlabAPIを使ってユーザのアクティビティを取得する方法

概要

user_events API を使います
Ruby を使ったサンプルコードを紹介します

環境

  • Ubuntu18.04
  • Ruby 3.0.0
  • gitlab 4.19.0

サンプルコード

require 'gitlab'
require 'date'

g = Gitlab.configure do |config|
  config.endpoint       = 'http://local.gitlab/api/v4'
  config.private_token  = 'xxx'
end

user_id = 1
now = DateTime.now
after = (now - 8).strftime("%Y-%m-%d")
events = Gitlab.user_events(user_id, { after: after, per_page: 100 })
summary = {}
events.each do |e|
  # pp e.to_h
  title = e['target_title']
  project_id = e['project_id']
  unless title.nil?
    summary[title] = project_id
  end
end

pp summary

summary.each do |title, project_id|
  is_next = false
  issues = Gitlab.issues(project_id, { per_page: 40 })
  issues.each do |issue|
    # pp issue.to_h
    if issue['title'] == title
      puts "* #{title} #{issue['web_url']}"
      is_next = true
      break
    end
  end
  next if is_next
  merge_requests = Gitlab.merge_requests(project_id, { per_page: 40 })
  merge_requests.each do |merge_request|
    # pp merge_request.to_h
    if merge_request['title'] == title
      puts "* #{title} #{merge_request['web_url']}"
      is_next = true
      break
    end
  end
  next if is_next
  wikis = Gitlab.wikis(project_id, { per_page: 40 })
  wikis.each do |wiki|
    # pp wiki.to_h
    if wiki['title'] == title
      puts "* #{title} #{wiki['slug']}"
      is_next = true
      break
    end
  end
  next if is_next
end

ちょっと解説

user_events を使って指定のユーザのイベントを取得します
期間は1週間分取得しています
直接 issue や merge request の URL を取得できないのでとりあえずプロジェクトIDとタイトルの一覧を取得します

その後一覧から issue と merge request と wiki の URL を生成します

もっといい方法がありそうですがとりあえず動けばで作ったのでこんな感じになっています

2022年9月15日木曜日

Rubyでコレクションを管理するクラスはEnumerableをincludeすると簡単

Rubyでコレクションを管理するクラスはEnumerableをincludeすると簡単

概要

RubyでArrayやHashを管理するクラスを定義する場合にはEnumerableモジュールをincludeしたクラスを作ると each などの見慣れたメソッドを独自のコレクションクラスで簡単に使うことができるようになります

他の情報を見るとEnumerableは使わないほうが良いという記事もあるのでご利用は自己責任でお願いします

環境

  • Ruby 3.1.2

サンプルコード

ポイントは each メソッドをオーバライドする点です

  • vim app.rb
class Users
  include Enumerable

  def initialize(users)
    @users = users
  end

  def each
    @users.each do |user|
      yield(user) if block_given?
    end
  end

  def names
    @users.map{|user|user.name}
  end
end

class User
  attr_reader :name, :age

  def initialize(name:, age:)
    @name = name
    @age = age
  end
end

users = Users.new(
  [
    User.new(name: "hawk", age: 10),
    User.new(name: "snowlog", age: 20),
    User.new(name: "taro", age: 30),
  ]
)
p users.names

動作確認

  • ruby app.rb
["hawk", "snowlog", "taro"]

2022年9月14日水曜日

Capistranoで動的にroleを設定する方法

Capistranoで動的にroleを設定する方法

概要

config/deploy/production.rb などにホストやロールの情報を記載します
インスタンスの情報が毎回変わる場合などは書き換えるのが面倒なのでどこかしらからホスト情報を取得して動的にロールを設定したくなります

今回はそのポイントを紹介します

環境

  • Ubuntu18.04
  • Ruby 3.1.2
  • capistrano 3.17.1

結論: role に動的に取得した配列を指定する

通常ロールは role メソッドを使って指定します
その際に Array で IP アドレスを複数していします
結論から言うとこの前段で何かしらの方法で取得した IP アドレスの情報を配列の変数にして設定すれば OK です

role :local_mac, %w{192.168.100.1}, my_property: :hello

require './lib/fetch.rb'

f = Fetch.new
targets = f.ip_addresses

role :local_mac, targets, my_property: :hello

fetch.rb は例です
この中で例えば外部サーバに問い合わせてホストの情報を取得したりファイルから読み込んでホストの情報を取得したりすれば OK です

タスク側で動的にホストを取得しないほうがいい

タスク内で対象のIPアドレス一覧を取得してそれらに対してループして exec することもできますがそれだと cap console などが使えないのであまりオススメしません

タスク側でも role メソッドをコールできるのでそうすることもできるのですが role は config/deploy 配下のファイルで実施したほうが良いです

2022年9月13日火曜日

Rubyでojを使えばJSONとオブジェクトの相互変換が簡単にできる

Rubyでojを使えばJSONとオブジェクトの相互変換が簡単にできる

概要

過去にBlueprinterを使ってシリアライズ方法を紹介しました

その際はオブジェクトをJSONにシリアライズする方法だけを紹介しました
今回は JSON -> オブジェクトのデシリアライズも可能な oj を使ってみます

環境

  • macOS 11.6.8
  • Ruby 3.1.2
  • oj 3.13.21

サンプルコード

  • vim app.rb
require 'oj'

class User
   attr_reader :name, :age

   def initialize(name, age)
     @name = name
     @age = age
   end

end

user = User.new('hawk', 10)

user_json = Oj.dump(user)
p user_json

user_obj = Oj.load('{"^o":"User","name":"snowlog","age":20}')
p user_obj.name
p user_obj.age

compat_user_obj = Oj.load('{"^o":"User","name":"taro","age":30}', mode: :compat)
p compat_user_obj

ちょっと解説

JSON にシリアライズする場合は単純に dump すれば OK です
ポイントは JSON 文字列からオブジェクトに変換する場合で先頭のフィールドで "^o":"User" という属性が必要です
これを指定しないと Hash に変換します

もし load 時にクラスに定義していないフィールドがあってもそのフィールドは無視してデシリアライズしてくれます

もしキャレットから始まるフィールドがある場合には object_mode というオプションが指定できるのでそれを使用します

最後の compat オプションはよく見るオプションで値がコロンから始まる場合に自動的に Symbol に変換してくれるのを防いでくれます

最後に

Oj は JSON パーサとして速度も速いのでデシリアライズするような処理をやりたい場合には Oj を積極的に使っても良いかなと思います

参考サイト

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

動作確認

参考サイト