GitLab CIの概要

CIの使用を開始する方法に関するGitLabブログの記事の翻訳を公開しています。 Gitlabの投稿の他の翻訳は、 Softmartのブログで見つけることができます




継続的インテグレーション(CI)の概念とその目的について何も知らないことを少し想像してみてください。 または、あなたはすべてを忘れました。 いずれにせよ、基本から始めましょう。


コードベース全体が2つのテキストファイルで構成されるプロジェクトに取り組んでいると想像してください。 さらに、これらのファイルを連結する場合、結果が常に「Hello world」というフレーズになることが非常に重要です。 この条件が満たされない場合、チーム全体が月給を失います。 はい、すべてがとても深刻です。


こんにちは



ある責任ある開発者が、各コードを顧客に送信する前に実行する必要がある小さなスクリプトを作成しました。 スクリプトは重要です:


cat file1.txt file2.txt | grep -q "Hello world" 

問題は、チームに10人の開発者がいますが、ヒューマンファクターがまだキャンセルされていないことです。


1週間前、1人の新参者がコードを送信する前にスクリプトを実行するのを忘れていたため、3人の顧客が壊れたアセンブリを受け取りました。 将来的にはこれを避けたいので、あなたはこの問題に終止符を打つことにします。 幸いなことに、あなたのコードはすでにGitLab上にあり、 組み込みCIシステムを覚えています 。 さらに、カンファレンスでは、CIがテストに使用されると聞きました...


CIで最初のテストを実行します


ドキュメントの検索と読み取りに数分費やした後、必要なことは.gitlab-ci.yml 2行のコードを追加するだけであることが.gitlab-ci.yml


 test: script: cat file1.txt file2.txt | grep -q 'Hello world' 

追加、コミット-そして歓声! ビルド成功!
ビルド成功


2番目のファイル「world」を「Africa」に変更し、何が起こるかを確認します。
ビルドに失敗しました


ビルドは期待どおりに失敗しました。


それで、自動化されたテストができました。 GitLab CIは、新しいコードをリポジトリにプッシュするたびにテストスクリプトを実行します。


アセンブリ結果をロードする機能


次のビジネス要件は、顧客に送信する前にコードをアーカイブすることです。 なぜそれも自動化しないのですか?


実行する必要があるのは、CIの別のタスクを定義することだけです。 それを「パッケージ」と呼びます:


 test: script: cat file1.txt file2.txt | grep -q 'Hello world' package: script: cat file1.txt file2.txt | gzip > package.gz 

その結果、2番目のタブが表示されます。
2つのタブ-2つのジョブから生成


ただし、新しいファイルはアセンブリアーティファクトであり、ダウンロードできるようにすることを明確にするのを忘れていました。 これは、 artifactsセクションを追加することで簡単に修正できます。


 test: script: cat file1.txt file2.txt | grep -q 'Hello world' package: script: cat file1.txt file2.txt | gzip > packaged.gz artifacts: paths: - packaged.gz 

確認しています...すべてが整っています:
ダウンロードボタンを確認する


いいね! ただし、1つの問題が残っていました。タスクは並行して実行されるため、テストが失敗した場合にアプリケーションをアーカイブする必要はありません。


一貫したタスク実行


「パッケージ」タスクは、テストが正常に合格した場合にのみ完了する必要があります。 ステージを導入して、タスクの順序を定義します。


 stages: - test - package test: stage: test script: cat file1.txt file2.txt | grep -q 'Hello world' package: stage: package script: cat file1.txt file2.txt | gzip > packaged.gz artifacts: paths: - packaged.gz 

動作するはずです。


また、コンパイル(この場合はファイル連結)に時間がかかることを忘れないでください。したがって、2回実行しないでください。 コンパイルのために別の段階を導入します:


 stages: - compile - test - package compile: stage: compile script: cat file1.txt file2.txt > compiled.txt artifacts: paths: - compiled.txt test: stage: test script: cat compiled.txt | grep -q 'Hello world' package: stage: package script: cat compiled.txt | gzip > packaged.gz artifacts: paths: - packaged.gz 

結果のアーティファクトを見てみましょう。


不要なアーティファクト


「コンパイル」ファイルのダウンロードは役に立たないので、一時的なアーティファクトの寿命を20分に制限します。


 compile: stage: compile script: cat file1.txt file2.txt > compiled.txt artifacts: paths: - compiled.txt expire_in: 20 minutes 

構成の最終的な機能は印象的です:



どのDockerイメージが最適ですか


進歩は明らかです。 しかし、私たちの努力にもかかわらず、アセンブリはまだ遅いです。 ログを見てください:


Ruby 2.1はログです


何、ごめん? Ruby 2.1?


なぜここにRubyがあるのですか? そして、そのGitLab.comはDockerイメージを使用してアセンブリ実行、デフォルトではruby:2.1イメージを使用します 。 もちろん、このイメージには必要のない多くのパッケージが含まれています。 Googleに支援を求めたところ、 alpine画像があり、ほとんど裸のLinux画像であることがわかりました。


この画像を使用するには、 image: alpine.gitlab-ci.ymlます。
これにより、アセンブリ時間はほぼ3分短縮されます。


ビルド速度が向上しました


一般的に、 非常に 多くの 異なる 画像が無料で利用できるため、スタック用に簡単に選択できます。 主なことは、追加機能を含まない画像の方が適していることを覚えておくことです。このアプローチでは、ダウンロード時間が最小限に抑えられます。


複雑なシナリオで作業する


ここで、アプリケーションを.gzアーカイブではなく.isoイメージとして配信することを希望する新しい顧客がいることを想像してください。 ビルドプロセス全体がCIを介して実装されるため、必要なことは別のタスクを追加することだけです。 ISOイメージは、 mkisofsコマンドを使用して作成されます。 その結果、構成ファイルは次のようになります。


 image: alpine stages: - compile - test - package # ...  "compile"  "test"       pack-gz: stage: package script: cat compiled.txt | gzip > packaged.gz artifacts: paths: - packaged.gz pack-iso: stage: package script: - mkisofs -o ./packaged.iso ./compiled.txt artifacts: paths: - packaged.iso 

タスク名は同じである必要はないことに注意してください。 さらに、この場合、1段階でのタスクの並列実行は不可能です。 したがって、同じタスク名とステージ名を偶然として扱います。


一方、アセンブリは失敗しました:
mkisofsがないためビルドに失敗しました


問題は、 mkisofsコマンドがalpineイメージの一部ではないため、個別にインストールする必要があることです。


追加ソフトウェアのインストール


Alpine Linux Webサイトでは、 mkisofsxorrisoおよびcdrkitパッケージの一部であるとxorriso cdrkitます。 パッケージをインストールするには、次のコマンドを実行する必要があります。


 echo "ipv6" >> /etc/modules #    apk update #    apk add xorriso #   

これらはすべて有効なCIコマンドでもあります。 scriptセクションのコマンドの完全なリストは次のようになりscript


 script: - echo "ipv6" >> /etc/modules - apk update - apk add xorriso - mkisofs -o ./packaged.iso ./compiled.txt 

一方、 scriptセクションの前、つまりbefore_scriptセクションでパッケージをインストールするコマンドを実行する方が意味的にはより正確です。 このセクションを構成ファイルの上位レベルに配置すると、すべてのタスクの前にコマンドが実行されます。 ただし、この場合、特定のタスクの前にbefore_scriptを実行するだけで十分です。


.gitlab-ci.yml最終バージョン:


 image: alpine stages: - compile - test - package compile: stage: compile script: cat file1.txt file2.txt > compiled.txt artifacts: paths: - compiled.txt expire_in: 20 minutes test: stage: test script: cat compiled.txt | grep -q 'Hello world' pack-gz: stage: package script: cat compiled.txt | gzip > packaged.gz artifacts: paths: - packaged.gz pack-iso: stage: package before_script: - echo "ipv6" >> /etc/modules - apk update - apk add xorriso script: - mkisofs -o ./packaged.iso ./compiled.txt artifacts: paths: - packaged.iso 

しかし、コンベアを作成しました! 3つの連続したステージがあり、 packageステージのpack-gzおよびpack-isoタスクが並行して実行されます。


パイプラインの図


まとめると


この記事ではGitLab CIのすべての機能をカバーしているわけではありませんが、ここではこれについて詳しく見ていきましょう。 この短編をお楽しみください。 ここに示されている例は、意図的に些細なものです。これは、なじみのない技術に気を取られることなく、CI操作の原理を明確に示すために行われました。 学んだことをまとめましょう。


  1. 特定の作業をGitLab CIに転送するには、1つ以上のタスク.gitlab-ci.ymlで定義する必要があります。
  2. タスクには名前を割り当てる必要があります。後で混乱しないように、意味のある名前にすることをお勧めします。
  3. 各タスクには、 キーワードで定義されたGitLab CIのルールと指示のセットが含まれています。
  4. タスクは順番に、並行して実行できます。または、パイプラインを作成して独自の実行順序を設定できます。
  5. タスク間でファイルを転送し、インターフェースを介して後続のダウンロード用にビルドアーティファクトとして保存することができます。

この記事の最後のセクションでは、この例で使用される用語とキーワードのより形式化されたリスト、およびGitLab CI機能の詳細な説明へのリンクを提供します。


キーワードの説明とドキュメントリンク


キーワード/用語説明
.gitlab-ci.ymlすべてのプロジェクトアセンブリ定義を含む構成ファイル
台本実行可能なシェルスクリプトを定義します
before_scriptすべてのタスクの前に実行するコマンドを定義します
画像使用するDockerイメージを定義します。
舞台パイプラインのステージを定義します(デフォルトでtest
アーティファクトビルドアーティファクトのリストを定義します
アーティファクト:expire_in一定時間後にロードされたアーティファクトを削除するために使用されます。
パイプラインコンベア-段階的に実行されるアセンブリのセット

GitLab CIを使用する他の例にも注意してください。



sgnl_05により翻訳



Source: https://habr.com/ru/post/J309380/


All Articles