Skip to content

Instantly share code, notes, and snippets.

@k-kinzal
Last active May 13, 2021 03:29
Show Gist options
  • Save k-kinzal/18999c7dfaaafed416af95f1f59cbccc to your computer and use it in GitHub Desktop.
Save k-kinzal/18999c7dfaaafed416af95f1f59cbccc to your computer and use it in GitHub Desktop.
variant #Serverlessconf Tokyo 2018 Contributor Day

variantを触ってみよう

https://github.com/mumoshu/variant

  • 手順でよくわからない、もしくは上手く動かないという方がいれば随時声かけてください
  • もし、文章の方が説明しやすいという方がいれば@k_kinzalまでメンションかDMをお送りください

インストール

Mac

$ curl -L https://github.com/mumoshu/variant/releases/download/v0.10.0/variant-darwin-amd64.tar.gz | tar zx
$ cp ./variant /usr/local/bin/variant
$ variant --help

※ PATHが通ってれば/usr/local/binでなくても大丈夫です

Linux

$ curl -L https://github.com/mumoshu/variant/releases/download/v0.10.0/variant-linux-amd64.tar.gz| tar zx
$ cp ./variant /usr/local/bin/variant
$ variant --help

※ PATHが通ってれば/usr/local/binでなくても大丈夫です

Other OS

  1. https://gist.github.com/k-kinzal/18999c7dfaaafed416af95f1f59cbccc#file-dockerfile をダウンロード
  2. docker build -t variant [ダウンロードした先のディレクトリ] でビルド
  3. docker run variant --help で動作を確認

Get Started

まずは初めにタスクを定義するためのyamlを作成します。

var.definition.yaml

tasks:
  echo:
    description: echo test.
    script: |
      echo "Hallo World!!"

確認のためにvariantでタスクを実行してみましょう。 var.definition.yamlを置いたディレクトリで下記のコマンドを実行してください。

Mac/Linux

$ variant echo        
INFO[0000] Hallo World!!                                 stream=stdout
Hallo World!!

Other

$ docker run -v ${PWD}:/variant variant echo                  
time="2018-09-28T02:24:42Z" level=info msg="Hallo World!!" stream=stdout
Hallo World!!

Hellow World👏👏👏

タスクにパラメータを指定する

vatiantではパラメータとしてparameters/optionsの3種類があります

  • parameters: variant echo "Hi"のようにコマンドにパラメータを渡せます
  • options: variant --parametername "Hi")のようにパラメータ名を指定してパラメータを渡せます

parameters/optionsは一つのタスクにそれぞれ定義できますので、このパラメータはparametersで、このパラメータはoptionsでというような指定もできます。 好きなやり方で定義してみましょう。

script内でGolang templateを書くことができます。 指定したパラメータをvariantで提供している{{ get "parametername" }}もしくはGolang templateの変数形式の{{ .parametername }}で呼び出します。

var.definition.yaml

tasks:
  echo:
    description: echo test.
    options:
    - name: text
      description: Echoes specified text.
    script: |
      echo "{{ get "text" }}"

optionsの場合

$ variant echo --text Hi  
INFO[0000] Hi                                            stream=stdout
Hi

parametersの場合

$ variant echo Hi  
INFO[0000] Hi                                            stream=stdout
Hi

また、ここで指定したパラメータをyamlで定義することもできます。

config/environments/dev.yaml

text: Hi
$ variant echo                   
INFO[0000] Hi                                            caller=echo task=text
Hi
INFO[0000] Hi                                            stream=stdout
Hi

variant env switch [環境名]config/environments/[環境名].yamlを初期値として読み込むことができます。 デフォルトの環境名はdevになります。

タスクをdocker上で実行する

これまでのvariantの実行は全てローカルでの実行でした。 しかし、それではインストールが必要なコマンドをセットアップする必要があるので、ポータビリティを上げるためにタスクをdockerで実行するようにしましょう。

tasks:
  environment:
    description: show environment.
    runner:
      image: alpine:3.8
      command: /bin/sh
      args: [-c]
    script: |
      env

Mac/Linux

$ variant environment
INFO[0000] HOSTNAME=db79f9d96857                         stream=stdout
INFO[0000] SHLVL=1                                       stream=stdout
INFO[0000] HOME=/root                                    stream=stdout
INFO[0000] PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  stream=stdout
INFO[0000] PWD=/                                         stream=stdout
HOSTNAME=db79f9d96857
SHLVL=1
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

Other

$ docker run --privileged -v /var/run/docker.sock:/var/run/docker.sock -v ${PWD}:/variant variant environment
time="2018-09-28T03:51:34Z" level=info msg="HOSTNAME=6f20a95f6019" stream=stdout
time="2018-09-28T03:51:34Z" level=info msg="SHLVL=1" stream=stdout
time="2018-09-28T03:51:34Z" level=info msg="HOME=/root" stream=stdout
time="2018-09-28T03:51:34Z" level=info msg="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" stream=stdout
time="2018-09-28T03:51:34Z" level=info msg="PWD=/" stream=stdout
HOSTNAME=6f20a95f6019
SHLVL=1
HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

※ 実際に検証した訳ではないのでWindowsでDocker in Dockerで動作するかはわかりません

※ Windowsのdocker.sockの場所は知らないので-vは適時書き換えてください

質問タイム

ここまでで良くわからなかったり、variantについて気になることがあれば質問をどうぞ。

e.g. variantでこういうことはできますか?

variantにコントリビュートしてみよう

https://github.com/mumoshu/variant

A. variantを広めよう

OSSにコントリビュートというと難しく感じるかもしれませんが、そのOSSについて有益な情報を公開するというのも立派なOSSへのコントリビュートです。 例えば、今日の@k_kinzalのようにOSSを紹介して、利用者/コントリビューターが増えればissueやPRが増え、開発を活発化することができます。 BとCはちょっと難しい・・・と言う方はこういったやり方で貢献してみませんか?

ちなみにvariantは世界/日本で見ても情報はgithubのリポジトリにしかありません。 つまり、ここで一番目に公開すればvariantは「ワシが広めた」と言えるチャンスです!

ブログとか持ってないという方はQiitaMediumあたりが簡単に始めれるのでオススメです。

B. variantのドキュメントを書いてPRを出してみよう

※ 要githubアカウント、英語

variantはあまりドキュメントが充実していません。 今ある情報は

ぐらいです。 これ以外の機能を知りたい場合はテストを読むコードを読むしかありません。 そこで、ドキュメントを拡充してvariantにPRしてみませんか?

ドキュメントの書き方はmumoshuさんの関わられているhelmfileなどが参考になると思います。

C. variantを修正してPRを出してみよう

※ 要githubアカウント、Golang開発環境

Golang書けます!という方は実際にプログラムを修正して、PRしてみませんか?

プロジェクト初期化

$ git clone git@github.com:mumoshu/variant.git
$ cd variant
$ dep ensure

※ Golang開発できる状態の前提

ビルド

$ make cross-build

テスト実行

$ make smoke-tests
FROM docker:18.06.1
ARG VARIANT_VERSION=0.10.0
ADD https://github.com/mumoshu/variant/releases/download/v${VARIANT_VERSION}/variant-linux-amd64.tar.gz /tmp/variant-linux-amd64.tar.gz
RUN tar zxf /tmp/variant-linux-amd64.tar.gz -C /usr/local/bin \
&& chown root:root /usr/local/bin/variant \
&& rm -rf /tmp/variant-linux-amd64.tar.gz \
&& ls -la /usr/local/bin
VOLUME ["/variant"]
WORKDIR /variant
ENTRYPOINT ["/usr/local/bin/variant"]
CMD ["--help"]
#!/usr/bin/env variant
# SAMを使ったvariantの例
# example:
# variant serverless deploy --aws-access-key-key xxx --aws-secret-access-key xxx --aws-default-region ap-northeast-1 --s3-bucket xxx --stack-name variant-example
# variant serverless deploy --aws-profile xxx --s3-bucket xxx --stack-name variant-example
tasks:
serverless:
description: Serverless operation management.
tasks:
deploy:
description: search or generate encrypt key.
options:
- name: aws-access-key-id
description: AWS Access Key ID for awscli.
default: ""
- name: aws-secret-access-key
description: AWS Secret Access Key for awscli.
default: ""
- name: aws-profile
description: Use AWS Profile for awscli.
default: ""
- name: aws-default-region
description: Use default AWS Region for awscli.
default: ""
- name: s3-bucket
description: The name of the S3 bucket where this command uploads the artifacts that are referenced in your template.
required: true
- name: stack-name
description: The name of the AWS CloudFormation stack you're deploying to. If you specify an existing stack, the command updates the stack. If you specify a new stack, the command creates it.
required: true
autoenv: true
runner:
image: infrastructureascode/aws-cli
command: /bin/sh
args: [-c]
volumes:
- $HOME/.aws:/root/.aws
- ${PWD}:/project
script: |
aws cloudformation package --template-file template.yaml --output-template-file serverless-output.yaml --s3-bucket "{{ get "s3-bucket" }}"
aws cloudformation deploy --template-file serverless-output.yaml --stack-name "{{ get "stack-name" }}" --capabilities CAPABILITY_IAM
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment