gitlab + envoy入門
これはシリーズ化する予定なので続きは←リンクからどうぞ。
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.xxx
にsshしにいって、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します。この時の対処法としては
- host keyを無視する
- 初回はサーバでログインする
とかあるんですが、まあ無視しておくようにするのが無難でしょう。
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が動くようにします。