gitlab + envoy入門

Share on:

これはシリーズ化する予定なので続きは←リンクからどうぞ。

envoyとはタスクランナーです、といってもいきなりタスクランナーとかいわれてもわからんと思うんですが、主には製品のデプロイで使われるものと思われます。とはいえ結局何のことやらわからんかもしれないので、いろいろやってみましょう

ローカルの開発サーバで使う事を想定する

まずは手元から直接envoyを叩いて、適当なデプロイ用のサーバに一式転送するという事を考えてみましょう。

envoyのインストール

1% composer global require laravel/envoy 

composerはがんばっていれてみてください。

1% ~/.config/composer/vendor/bin/envoy      
2Laravel Envoy 2.4.0

とまあ、こうなります。

1export PATH=$PATH:$HOME/.config/composer/vendor/bin

みたいにしておくのもありでしょう。bin-dirを変更するのもまた手ですけどもとにかく実行できるようにします。

gltbalになんかprojectでも作る

ここではgitlabに適当なプロジェクトを作るものとします。ただし、いきなり連携してenvoyを仕掛けたりはしません。とりあえずはgitレポシトリを使うというだけの事でokです。

ここではenvoy-testとしました(README.md付きで、README.mdは別になくてもよい)

1% cd envoy-test
2% ls -a 
3./  ../  .git/  README.md

Envoy.blade.phpを作ってみる

envoyは直下のEnvoy.blade.phpを評価します。というわけで、これを作成してみます

Envoy.blade.php

1@servers(['web' => ['127.0.0.1']])
2
3@task('foo', ['on' => 'web'])
4    ls -la
5@endtask

この書式を見て明かな通り、これはリモートで実行する事を前提としているわけですが、127.0.0.1を指定するとローカルに強制されます。とりあえず実行してみます

1% envoy run foo          
2[127.0.0.1]: total 20
3[127.0.0.1]: drwxr-xr-x  3 user docker 4096 Nov 22 22:36 .
4[127.0.0.1]: drwxr-xr-x 13 user docker 4096 Nov 22 22:36 ..
5[127.0.0.1]: drwxr-xr-x  8 user docker 4096 Nov 22 22:34 .git
6[127.0.0.1]: -rw-r--r--  1 user docker   86 Nov 22 22:34 Envoy.blade.php
7[127.0.0.1]: -rw-r--r--  1 user docker   14 Nov 22 22:31 README.md

なるほど、では1つサーバを用意しそのIPアドレスを指定してみます。

1@servers(['web' => ['user@xxx.xxx.xxx.xxx']])
2
3@task('foo', ['on' => 'web'])
4    ls -la
5@endtask

このようにするとxxx.xxx.xxx.xxxsshしにいって、ls -laの結果を返してきます。何にせよこれが基本的な挙動です。

SSH鍵が必要な場合はこのケースは当然AGENTなどを使って鍵転送する必要があります。この辺の知識が足りない場合はSSHを小一時間勉強すると得られると思われます(要するにここでは割愛)。

何が便利だというのか

ls -laするだけなら

1% ssh user@xxx.xxx.xxx.xxx ls -la  

するのと全く変わらないのですが、中でphpの変数とかが使えます。いずれにせよ、ちょっとここからは本格的にセットアップしていくのできちんと1つデプロイサーバーを用意するものとしましょう。

ここでは3.112.22.34とかいうdebian busterのサーバをAWSで1つ用意しました。まあdockerとかでも何でもいいんですがとにかくまっさらのサーバを用意しましょう。

もちろん、EIPを取得しDNSに割り当てておくのがまっとうな使い方となります

とりあえずsshできる事を確認しときます

1admin@3.112.22.34  

最低限gitは欲しい所です

1admin@ip-172-31-43-39:~$ type git
2-bash: type: git: not found
3admin@ip-172-31-43-39:~$ sudo apt update; sudo apt install git

あと、deployターゲットとして**/home/admin/deploy**を指定します。adminはたまたまAWSがこうなっているだけで、この辺は適当でok

1$ mkdir deploy

Envoy.blade.phpを以下のようにしてテストしときます。

1@servers(['web' => ['admin@3.112.22.34']])
2
3@task('foo', ['on' => 'web'])
4    cd deploy
5    ls -la
6@endtask
1% envoy run foo      
2[admin@3.112.22.34]: total 8
3[admin@3.112.22.34]: drwxr-xr-x 2 admin admin 4096 Nov 22 14:02 .
4[admin@3.112.22.34]: drwxr-xr-x 4 admin admin 4096 Nov 22 14:02 ..

これで準備okっす。

Envoy.blade.phpの中でcomposerを使う

envoyの中ではphpが使えるという事で、Carbonを使ってみる事とします。

 1% composer require nesbot/carbon    
 2Using version ^2.41 for nesbot/carbon
 3./composer.json has been created
 4Loading composer repositories with package information
 5Updating dependencies (including require-dev)
 6Package operations: 5 installs, 0 updates, 0 removals
 7  - Installing symfony/translation-contracts (v2.3.0): Loading from cache
 8  - Installing symfony/polyfill-php80 (v1.20.0): Loading from cache
 9  - Installing symfony/polyfill-mbstring (v1.20.0): Loading from cache
10  - Installing symfony/translation (v5.1.8): Loading from cache
11  - Installing nesbot/carbon (2.41.5): Loading from cache
12symfony/translation suggests installing symfony/config
13symfony/translation suggests installing symfony/yaml
14symfony/translation suggests installing psr/log-implementation (To use logging capability in translator)
15Writing lock file
16Generating autoload files
175 packages you are using are looking for funding.

Envoy.blade.phpを書き換えます。

 1@include('vendor/autoload.php')
 2@servers(['web' => ['admin@3.112.22.34']])
 3
 4@setup
 5  $now = Carbon\Carbon::now();
 6@endsetup
 7
 8@task('foo', ['on' => 'web'])
 9    cd deploy
10    echo {{ $now->format('Ymdhis') }}
11@endtask

完全にlaravelのblade記法になっているんですが、@setupの所はピュアphpで書けます。それ以外はブラケットで囲ったりが必要です、が、いずれにせよ、これを実行するとこうなるはずです。

1% envoy run foo  
2[admin@3.112.22.34]: 20201122111223

php使いだと、これだけで結構便利いいなって感じじゃないでしょうか。シェルスクリプトにphpを混ぜ放題になります。

デプロイサーバーでcloneテスト

とりあえずcloneできる事を確認します。-Aオプションで鍵転送している事を注目してください。

1% ssh -A admin@3.112.22.34 
2admin@ip-172-31-43-39:~$ git clone git@gitlab.com:catatsumuri/envoy-test.git
3Cloning into 'envoy-test'...
4The authenticity of host 'gitlab.com (172.65.251.78)' can't be established.
5ECDSA key fingerprint is SHA256:HbW3g8zUjNSksFbqTiUWPWg2Bq1x8xdGUrliXFzSnUw.
6Are you sure you want to continue connecting (yes/no)?

host keyに関して聞かれると対話シェルが失敗してjobがfailします。この時の対処法としては

  1. host keyを無視する
  2. 初回はサーバでログインする

とかあるんですが、まあ無視しておくようにするのが無難でしょう。

1admin@ip-172-31-43-39:~$ GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHo
2stKeyChecking=no" git clone git@gitlab.com:catatsumuri/envoy-test.git
3Cloning into 'envoy-test'...
4Warning: Permanently added 'gitlab.com,172.65.251.78' (ECDSA) to the list of known hosts.
5remote: Enumerating objects: 3, done.
6remote: Counting objects: 100% (3/3), done.
7remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
8Receiving objects: 100% (3/3), done.

たかだかこれだけなのにめちゃ大変っすね!

とりあえず消しときます

1admin@ip-172-31-43-39:~$ rm -rf envoy-test/

これをEnvoyでやってみる

とりあえずYmdhisみたいな形式のディレクトリ形式でcloneしたいとします。

いい加減fooとかいうコマンドもあれなのでdeployとかに変更しています。

 1@include('vendor/autoload.php')
 2@servers(['web' => ['admin@3.112.22.34'. ' -A']])
 3
 4@setup
 5  $ENV = 'GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
 6"';
 7  $now = Carbon\Carbon::now();
 8  $repository = 'git@gitlab.com:catatsumuri/envoy-test.git';
 9@endsetup
10
11@task('deploy', ['on' => 'web'])
12    cd deploy
13    export {{ $ENV }};
14    git clone {{ $repository }} {{ $now->format('Ymdhis') }}
15@endtask

これでenvoyを実行すると…

1% envoy run deploy  
2[admin@3.112.22.34 -A]:  Cloning into '20201123125316'...

となり、deployサーバを確認すると

1admin@ip-172-31-43-39:~$ ls -l deploy/
2total 4
3drwxr-xr-x 3 admin admin 4096 Nov 22 15:53 20201123125316

となるわけです。

ここまでで

  • Envoyの基本的な書式が理解できた
  • Envoyを使ったgit cloneができるようになった

くらいでしょうか。長くなってきたので次回はちょっと実践的な事をします。gitlabに絡めてコミットされた時にdeployが動くようにします。