CI:5分で継続的に統合



記事を最後まで読んだ後、ボックス内のビーバーがKDPVとして選択される理由を推測できます。



すべての健康、仲間のhabrozhitel。 最近では、仕事に非常に間接的に関連する1つの非常に小さなプロジェクトで「継続的インテグレーション」サービス(以降CI)を作成および構成する必要に直面しました。 時間がなくなっていたので、私は新しいものを試すことにしました(以前はTravisとJenkinsだけを使用していました)。 主な選択基準は、「統合サーバーでのシステムの展開の単純さと速度」でした。



カットの下には、Bashで2晩に書かれたCIの短いストーリーとその結果のツールがあります。



アイデア



検索が不十分だったのか、自転車の神を犠牲にしたかったのかもしれませんが、サーバーに「投げられる」CIサービスを見つけず、Github構成にいくつかのwebhookを入れて、DevOpsを忘れました。 したがって、私はもう検索に時間を浪費しないことを決定し(そして、私は約1-2時間を費やしました)、そしてBashで簡単な何かを書くことにしました。



これは 、Bashで最も単純なCIトリガーを作成し、別の(構成)スクリプトから構成された機能のチェーン(パイプライン、パイプ)を通過させるというアイデアでした



このソリューションの利点は明らかです。





私はこの決定の欠点について考えています、あなた自身はすでに推測しました。 ほんの少しだけあげます。





実装



CIトリガー自体は基本的なものです。



Ciトリガー
config=`pwd`/ci.config #    log=`pwd`/ci.log #  - #   # ... #   - function ci_bootstrap { return 0 } function ci_update { return 0 } function ci_analyse { return 0 } function ci_build { return 0 } function ci_unit_test { return 0 } function ci_deploy { return 0 } function ci_test { return 0 } function ci_archive { return 0 } function ci_report { return 0 } function ci_error { return 0 } #      . $config &&\ ( \ ci_bootstrap &&\ ci_update &&\ ci_analyse &&\ ci_build &&\ ci_unit_test &&\ ci_deploy &&\ ci_test &&\ ci_archive &&\ ci_report || ci_error ) 1>>$log 2>&1
      
      







コマンドライン引数の解析のロジックを省略した完全なスクリプトコードは引用しませんでした。これは簡単で、タスクに関連していないためです(記事の最後に、略語なしでソースコードを表示できるプロジェクトリポジトリへのリンクがあります)。



ご覧のとおり、すべては、CIトリガーの起動時に統合を実行するためにパイプラインと呼ばれる9つの統合関数を宣言することになります。 パイプラインの両方の出力ストリームは1つのログファイルにまとめられ、統合の結果に関するレポートとして機能します



統合パイプラインを実行する前に、CI-tirgger( . $config



Config)に代わって構成スクリプトが呼び出され、すべての機能をオーバーライドできます。 これがソリューションの全体的な「魔法」です。 構成スクリプトはBashで作成されているため、ロジックを機能にグループ化するだけで、任意のロジックを使用して統合を実行できます。



構成例
 #     cd my-project #     function ci_bootstrap { mysql -uadmin -pmy_pass -e "DROP DATABASE db; CREATE DATABASE db" } #     function ci_update { if test -d .git; then return git pull else return git clone https://github.com/vendor/project ./ fi } #  function ci_build { return npm install && npm run build } #    function ci_unit_test { return npm run unit_test } #   function ci_deploy { return mysql -uadmin -pmy_pass db < migration/schema.sql &&\ mysql -uadmin -pmy_pass db < migration/data.sql } #     function ci_report { return mail -s "CI report" my@mail.com < $log } #    function ci_error { echo "== Error ==" return mail -s "CI report" my@mail.com < $log }
      
      







これで、要件に従ってCIトリガー呼び出しロジックを構成するだけで済みます。



定期的な電話



これを行うには、たとえば次のようにCronを設定します。



crontab
 0 0 * * * /home/user/ci/trigger
      
      







通話を変更



このソリューションでは、統合サーバーのポートにアクセスするときにCIトリガー呼び出しで統合サーバーのポートをリッスンするメカニズムを実装する必要があります。 このためにnetcatと次の簡単なBashスクリプトを使用することをお勧めします。



リスニングポート
 while true; do { echo -ne "HTTP/1.0 200 OK\r\n\r\n"; } | nc -v -l -p 8000 && /home/user/ci/trigger done
      
      







次に、たとえばCurlを使用して、プッシュコミットごとにこのポートへのHTTPリクエストを実行するために使用するバージョン管理システムを設定する必要があります。



.git / hooks /コミット後
 curl -X POST http://ci-server.com:8000
      
      







リンクとそのすべて



当然、このソリューションは理想とはほど遠いもので、大規模なプロジェクトで使用するには「手作業」が必要になりますが、CIサービスの迅速な立ち上げには最適です(そう思う!)。






All Articles