GitHubやJenkinsと連携した開発環境作成でのrsyncとの出会い
社会人1年目のエンジニアにおいて開発環境の構築にはかなり時間がかかるもの。
わけの分からないエラーと戦ったり、他の人の環境では動いても自分の環境では動かないなどそういう経験がある人も多いのではないでしょうか?
今回は、GitHubやJenkinsと連携した開発環境を構築する上で出会ったrsyncコマンドとの出会いについてお話したいと思います。
まず、rsyncコマンドとは、ファイルなどのバックアップや同期を行うために使用されるコマンドで、変更分を検出して差分のみを転送することができ、cpコマンドと違って効率的なバックアップを行うことができます。また、ネットワーク経由でもバックアップや同期が行えたり、sshなどのリモートシェル経由でも利用が可能であるためとても便利なコマンドだそうです!
このrsyncコマンドを知った瞬間、自分たちが構築したい環境を簡単に出来るではないか!と凄く感動しました!
まずは、使いたいと思った背景をご説明したいと思います。
目指すべく開発環境は、ソースコードをGitHubで管理し、継続的インテグレーションを導入するためにJenkinsを利用してサーバへ自動デプロイされる仕組みを構築することです。
上の図のようにローカル環境で実装し、ある機能が実装されるとcommitしてGitHubへpushします。
その後GitHubからJenkinsへデプロイされテストが実行されます。
テストが正しく通ればサーバへ反映されるという仕組みです。
しかし、ローカル環境だけではテストが出来ない場合もあるため、テストサーバへはFTPを使ってファイルをあげてサーバ上でもチェックが出来る環境を構築したいと考えていました。
しかし、テスト環境にFTPでファイルをあげた際にずっとそのファイルが残り続けるのは良くないため、ローカルからGitHubへpushされJenkinsが動いた時には、サーバにあるコードは全てGitHubにcommitされている最新版へ戻すような設定を行いたいと思っていました。
それを実現するためにjenkinsでGitHubからとってきたファイルをコピーする方法やそもそもテストサーバのファイルもgitで管理しちゃおうなど色々考えました。
1:ファイルをコピーして同期
jenkinsはテストを行う前にgitHubから最新版のデータをpullしてきます。その時には/var/lib/jenkins/以下にworkspaceというディレクトリが出来、そこにソースコードがpullされる仕組みになっています。そのファイルをサーバで設定されているドキュメントルート以下にコピーしようという考えです。
しかし、コピーをするだけだと
・不必要なファイルは消えずに永遠に残ってしまう
・毎回変更がないファイルもコピーされるので処理が重くなる
などの問題があったため断念....
2:テストサーバ側もgit管理してしまう
git stashコマンドを使おうという考えです。git stashは,変更を一時的に退避させるコマンドであり実行するとcommitされたところまで状態を戻すことが出来ます。
しかし,この方法も本来のgit stashの使い方に則していなったり(感覚的に)、なんか気持ち悪いため断念....
他にも色々考えましたが,なかなかいい方法が思いつかない時に、先輩から「rsyncコマンドを使えば」 とアドバイスを頂いたのがrsyncとの初めての出会いです。
rsyncコマンドでは、コピー元ディレクトリとコピー先ディレクトリでの差分だけをコピーし、またコピー元ディレクトリになくてコピー先ディレクトリにあるファイルを削除するといったことも出来るため,まさに自分たちがやりたいと思っていたことを実現できる!魔法のコマンドです(笑)
いやぁrsyncコマンド最強ですね!!
使い方はこんな感じ
rsync -avr --delete --stats pre/ next/
オプションの説明についてはこちらを参考にどうぞ:
はじめてrsyncを使う方が知っておきたい6つのルール
上記の例だとpreディレクトリ以下にあるファイルをnextディレクトリに同期させるコマンドになります。
–deleteオプションをつけることでnextディレクトリにはあってpreディレクトリにないファイルを削除することができます。
これをJenkinsに設定することによって目指すべく開発環境を構築することが出来ました!!
「rsync最強っす!!」
次回は、これらの開発環境を整えるための手順を書いていきたいと思います。