yewton
2022 年 11 月 23 日
GNU Make
.PHONY
https://taskfile.dev/
Task is a task runner / build tool that aims to be simpler and easier to use than, for example, GNU Make.
dotenv という設定があり、指定したファイルから環境変数を設定することが可能
dotenv
https://github.com/yewton/my-smia/blob/main/.env.local から抜粋した例:
PGDATABASE=ostock_dev PGHOST=localhost PGPORT=5432 PGUSER=postgres
これを以下のように設定することで、設定する環境変数群を切り替えられる:
vars: ENV: '{{default "local" .ENV}}' dotenv: [ '.env.{{.ENV}}' ]
普通に実行した場合はローカル用の環境変数が設定される:
task generate:config-files
以下のように実行すると AWS 用に切り替わる:
ENV=aws task generate:config-files
https://github.com/yewton/my-smia では、ローカル用の .env ファイルはべた書きして、 AWS 用は Terraform の local_file リソースで生成している。
.env
local_file
resource "local_file" "env" { content = <<-EOT # ... DB_HOST = "${module.db.db_instance_address}" REDIS_HOST = "${aws_elasticache_cluster.redis.cache_nodes[0].address}" # ... PGHOST = "${module.db.db_instance_address}" PGPORT = "${local.db_port}" PGUSER = "${local.db_user}" EOT filename = "${local.root_dir}/.env.aws" file_permission = "0600" }
先程の例でも登場したが Go Template が使える為、条件分岐や整形処理などが柔軟に行える。
Task 独自の仕組みではない為、新たに覚える事が少ない点も嬉しい。
cmds: - |- {{if eq .ENV "aws"}} aws eks update-kubeconfig --name ostock-dev-cluster --alias ostock-dev-cluster {{else}} kubectl config use-context docker-desktop {{end}} - kubectl config set-context --current --namespace={{.NAMESPACE}}
https://github.com/yewton/my-smia/blob/main/k8s/Taskfile.yml
vars: IMAGE: '{{with .REGISTRY_HOST}}{{.}}/{{end}}ostock/{{.APP}}:chapter12' VALUES_FILE: '{{.APP}}-values.yml'
https://github.com/yewton/my-smia/blob/main/k8s/app/Taskfile.yml
.REGISTRY_HOST
IMAGE: ostock/app:chapter12
IMAGE: host.name/ostock/app:chapter12
➜ tree -P 'Taskfile.yml' --prune . ├── Taskfile.yml ├── apps │ └── Taskfile.yml ├── docker │ └── Taskfile.yml └── k8s ├── Taskfile.yml ├── app │ └── Taskfile.yml └── external └── Taskfile.yml
こんな感じにファイルを配置して…
includes: k8s: taskfile: ./k8s dir: ./k8s docker: taskfile: ./docker dir: ./docker apps: taskfile: ./apps dir: ./apps
こんな風に定義すると…
task *, task k8s:*, task docker:*, task apps:* のようにタスクを実行出来るようになる
task *
task k8s:*
task docker:*
task apps:*
⇒ タスクの名前空間とファイルを自然な方法で分割管理出来る
apply: internal: true cmds: - ytt -f config.yml -f schema.yml --data-value name={{.NAME}} --data-value externalName={{.EXTNAME}} | kubectl apply -f - deps: - task: :setup
こんな感じのタスクを定義しておいて
database: - task: apply vars: { NAME: database, EXTNAME: '{{.DB_HOST}}' }
こんな風に利用出来る
deps で依存タスクを定義出来る。ここで指定されたタスクは並列に実行される。 ( 先頭の : は include 元のタスクを指定する際に書く )
deps
:
include
setup: internal: true run: once deps: - task: namespace
依存先でもこんな感じで、更に依存先タスクを定義出来たりもする。
先程の例でも登場した run: once の指定は、一度だけ実行することを示す。
run: once
このような「まず最初に一度だけ実行してけおけばよい」的なよくあるケースに簡単に対応出来る。
namespace: desc: 名前空間を作成します deps: - task: use-context cmds: - kubectl create namespace {{.NAMESPACE}} status: - kubectl get namespace {{.NAMESPACE}}
status で指定したコマンドの終了ステータスが全て 0 の場合、実行不要と判断され以下のような出力がされる:
status
0
task: Task "k8s:namespace" is up to date
make でよくやるやつ。ただ make とは違い、指定ファイルのハッシュ値で判断 する(変更時刻で判断するように設定も可能)。
generate:config-files: desc: 各種設定ファイルを生成します vars: ENCRYPTED_DB_PASSWORD: sh: spring encrypt '{{.DB_PASSWORD}}' --key '{{.ENCRYPT_KEY}}' ENCRYPTED_JWT_SIGNING_KEY: sh: spring encrypt '{{.JWT_SIGNING_KEY}}' --key '{{.ENCRYPT_KEY}}' cmds: # 中略 sources: - '.env.{{.ENV}}' generates: - '{{.SECRET_FILE}}' - '{{.CONFIG_REPO}}/*.yml'
JSON Schema Store に公式のスキーマ定義がある為、対応している IDE やエディタであれば、入力補完やミスの指摘をしてくれる。
https://github.com/SchemaStore/schemastore/blob/master/src/schemas/json/taskfile.json
IntelliJ IDEA なら Ultimate 版でこの機能が使える。
https://www.jetbrains.com/help/idea/json.html#ws_json_using_schemas
silent
internal
task -l
task: Task "docker:ecr:push" is internal
{{.CLI_ARGS}}
task apps:build-image -- config-server
次期バージョン v4 のスコープには入っていそう… ただし、リリース時期は不明
https://github.com/go-task/task/issues/703
YAML テンプレーティングツール ytt も便利だったので その内紹介したい
https://carvel.dev/ytt/docs/latest/
使用例は https://github.com/yewton/my-smia/tree/main/k8s 辺りにあります