[{"data":1,"prerenderedAt":703},["ShallowReactive",2],{"/ja-jp/blog/basics-of-gitlab-ci-updated/":3,"navigation-ja-jp":36,"banner-ja-jp":452,"footer-ja-jp":465,"Itzik Gan Baruch":675,"next-steps-ja-jp":688},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":26,"_id":29,"_type":30,"title":31,"_source":32,"_file":33,"_stem":34,"_extension":35},"/ja-jp/blog/basics-of-gitlab-ci-updated","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"CI 入門：ジョブを順序どおりに、並列に、または順不同で実行する方法","継続的インテグレーション (CI) 入門：CI は初めてですか？GitLab CI の使い方を学び、最初のCIパイプラインをGitLabでビルドしてみましょう。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662061/Blog/Hero%20Images/cicdcover.png","https://about.gitlab.com/blog/basics-of-gitlab-ci-updated","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"CI 入門：ジョブを順序どおりに、並列に、または順不同で実行する方法\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Itzik Gan Baruch\"}],\n        \"datePublished\": \"2020-12-10\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22,"updatedDate":25},[18],"Itzik Gan Baruch","2020-12-10","[継続的インテグレーション (CI) (英語版)](https://about.gitlab.com/topics/ci-cd/) のことを何一つ知らず、ソフトウェア開発ライフサイクルに [どうして CI が必要なのか (英語版)](https://about.gitlab.com/blog/how-to-keep-up-with-ci-cd-best-practices/) 分からない、と仮定しましょう。\n\nいま、あるプロジェクトで作業をしていて、そこには2つのテキストファイルから成るコードがあるものとします。さらに、これらの2つのファイルには「Hello world」というフレーズが含まれている必要がある、という点に注意してください。\n\nこのフレーズが含まれていなければ、開発チームがその月のお給料を受け取れないことになるかもしれないくらい、重要なポイントです。\n\nそこで、責任感のあるソフトウェアデベロッパーが、顧客にコードを納品する前に実行する、短いスクリプトを書きました。\n\n以下のような非常に洗練されたコードです。\n\n```bash\ncat file1.txt file2.txt | grep -q \"Hello world\"\n```\n\nここでの懸念事項はチームには10名のデベロッパーがいて、人的要因がコードの品質に大きな影響を及ぼす可能性があるという点です。\n\n1週間前、新しくチームに入ったメンバーがこのスクリプトを実行し忘れ、3件のクライアントに機能しないビルドが納品されるという事態が発生しました。この事態の解決にあたり、幸いにもコードは既にGitLab にあり、[ビルトインの CI](https://about.gitlab.com/ja-jp/solutions/continuous-integration/) があることが分かりました。さらに、あるカンファレンスで、テスト実行にCIを使うのが一般的ということを耳にしていました。\n\n## CI 内で最初のテストを実行する\n\nドキュメントによると、CI の実行に必要なのは `.gitlab-ci.yml` ファイル内に 以下の2 行のコードを追加することだけでした。\n\n```yaml\ntest:\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n```\n\nコミットして...無事にビルドが成功しました。\n\n![CI内でビルドに成功](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/build_succeeded.png)\n\nでは、2 つ目のファイルの「world」という文言を「Africa」に置き換え、何が起こるか確認してみましょう。\n\n![CI内でビルドに失敗](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/build_failed.png)\n\nビルドは予想どおり失敗します。\nここで、自動化テストが完成しました。GitLab CI は、DevOps 環境内でソースコードのリポジトリに新しいコードをプッシュするたびにこのテストスクリプトを実行します。\n\n__注:__ 上記例では、file1.txt と file2.txt がGitLabランナーを実行するホストに存在すると仮定しています。\n\nこの例を実際に GitLabで実行するには、以下のようにファイルを作成するコードを実行した後、テストスクリプトを実行する必要があります。\n\n```yaml\ntest:\nbefore_script:\n      - echo \"Hello \" > | tr -d \"\\n\" | > file1.txt\n      - echo \"world\" > file2.txt\nscript: cat file1.txt file2.txt | grep -q 'Hello world'\n```\n\nなお、分かりやすくするために、この 2 つのファイルは既にホストに存在していると仮定し、以降の例では作成しないものとします。\n\n## CIビルド結果をダウンロード可能にする\n\n次にすることは、顧客に納品するコードをパッケージ化することです。ソフトウェア開発プロセスのこの部分も自動化してしまいましょう。\n\nまず、CI に別のジョブを定義する必要があります。このジョブは「package」という名前にしましょう。\n\n```yaml\ntest:\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n\npackage:\n  script: cat file1.txt file2.txt | gzip > package.gz\n```\n\nよって、今ここにはタブが 2 つあります。\n\n![2つのタブ ― 2つのジョブから生成](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/two_tabs.png)\n\nしかし、新たに作成されるファイルがダウンロードできるようにビルドの「アーティファクト」であることを指定し忘れてしまいました。。修正するには、`artifacts` セクションを追加します。\n\n```yaml\ntest:\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n\npackage:\n  script: cat file1.txt file2.txt | gzip > packaged.gz\n  artifacts:\n    paths:\n    - packaged.gz\n```\n\n修正した結果を確認すると、アーティファクトが作成されダウンロードできるようになっています。\n\n![ダウンロードボタンのチェック](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/artifacts.png)\n\nしかし、ここで修正が必要な新たな問題があります。2 つのジョブは現在は並列実行されていますが、テストに失敗した場合、アプリケーションをパッケージ化しないように変更をする必要があります。\n\n## ジョブを順次実行する\n\nそこで「package」ジョブは、テストが成功した場合のみ実行するものとします。`stages` を指定し、ジョブの実行順序を定義しましょう。\n\n```yaml\nstages:\n  - test\n  - package\n\ntest:\n  stage: test\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n\npackage:\n  stage: package\n  script: cat file1.txt file2.txt | gzip > packaged.gz\n  artifacts:\n    paths:\n    - packaged.gz\n```\n\n上記のようになりました。\n\nちなみに、コンパイル (我々のケースでは2つのファイルを連結することを意味します) には時間がかかるため、2 回も実行したくはありません。コンパイルは別のステップとして定義しましょう。\n\n```yaml\nstages:\n  - compile\n  - test\n  - package\n\ncompile:\n  stage: compile\n  script: cat file1.txt file2.txt > compiled.txt\n  artifacts:\n    paths:\n    - compiled.txt\n\ntest:\n  stage: test\n  script: cat compiled.txt | grep -q 'Hello world'\n\npackage:\n  stage: package\n  script: cat compiled.txt | gzip > packaged.gz\n  artifacts:\n    paths:\n    - packaged.gz\n```\n\nそれでは、アーティファクトを見てみましょう。\n\n![不必要なアーティファクト](https://about.gitlab.com/images/blogimages/the-basics-of-gitlab-ci/clean-artifacts.png)\n\nこの「コンパイル」ファイルを常にダウンロード可能にする必要はないようです。一時的なアーティファクトとして「20 分」で保存期間切れとなるよう、`expire_in` を設定します。\n\n```yaml\ncompile:\n  stage: compile\n  script: cat file1.txt file2.txt > compiled.txt\n  artifacts:\n    paths:\n    - compiled.txt\n    expire_in: 20 minutes\n```\n\n構成ファイルは見たところ問題なさそうです。\n\n- アプリケーションをコンパイル、テスト、パッケージ化するために、3 つの連続したステージを作成しました。\n\n- コンパイル済みアプリを次のステージに渡すと、コンパイルを 2回実行する必要がなくなります(それにより実行が高速化されます)。\n\n- パッケージ化されたアプリケーションは、今後も使用できるようビルドアーティファクトとして保管します。\n\n## どのDockerイメージを使用するのか学ぶ\n\nここまでは順調です。しかし、CIビルドにはまだ時間がかかります。ログを見てみましょう。\n\n![ruby3.1](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/ruby-31.png)\n\nここに注目してください。Ruby 3.1とあります。\n\nなぜ Ruby が必要なのかといえば、GitLab.com が [ビルド実行 (英語版)](https://about.gitlab.com/blog/shared-runners/) に Docker イメージを使用しており、[デフォルトで (英語版)](https://docs.gitlab.com/ee/user/gitlab_com/#shared-runners)  [`ruby:3.1`](https://hub.docker.com/_/ruby/) イメージを使用するからです。間違いなく、このイメージには必要のないパッケージが多数含まれています。Google で検索して調べたところ、[`alpine`](https://hub.docker.com/_/alpine/) というイメージがあり、ほとんど空の Linux イメージであることが分かりました。\n\nそれでは、`.gitlab-ci.yml` に  `image: alpine` を追加して、このイメージを使用したいと明示的に指定しましょう。\n\nうまくいきました。パイプラインの実行が3 分ほど短縮できたようです。\n\n![ビルド速度を短縮](https://about.gitlab.com/images/blogimages/the-basics-of-gitlab-ci/speed.png)\n\nパブリックイメージはたくさんあるようです。\n- [mysql](https://hub.docker.com/_/mysql/)\n- [Python](https://hub.docker.com/_/python/)\n- [Java](https://hub.docker.com/_/java/)\n- [php](https://hub.docker.com/_/php/)\n\nそれにより、我々の技術スタックに適したものを選ぶことができます。不必要なソフトウェアが含まれていないイメージを指定することで、ダウンロード時間が最短で済みます。\n\n## 複雑なシナリオに対応する\n\nさて、ここで新しいクライアントが、アプリを `.gz` ではなく、`.iso` イメージとしてパッケージ化してほしい、と希望しているとします。CI がすべての作業を行なってくれるため、コードにはジョブを 1 つ追加するだけです。ISO イメージはmkisofsコマンドを使用して作成できます。構成ファイルは次のようになります。\n\n```yaml\nimage: alpine\n\nstages:\n  - compile\n  - test\n  - package\n\n# ... \"compile\" and \"test\" jobs are skipped here for the sake of compactness\n\npack-gz:\n  stage: package\n  script: cat compiled.txt | gzip > packaged.gz\n  artifacts:\n    paths:\n    - packaged.gz\n\npack-iso:\n  stage: package\n  script:\n  - mkisofs -o ./packaged.iso ./compiled.txt\n  artifacts:\n    paths:\n    - packaged.iso\n```\n\nジョブ名は同じにする必要はありません。ジョブ名が同じだと、ソフトウェア開発プロセスの同じステージでジョブを並列実行できません。そのため、ジョブやステージの名前が同じになるのは、偶然のことだと考えてください。\n\nさて、ビルドは失敗しました。\n\n![mkisofs が欠落しているために失敗したビルド](https://about.gitlab.com/images/blogimages/the-basics-of-gitlab-ci/mkisofs.png)\n\n`mkisofs` が `alpine` イメージに含まれていないことが原因です。まずはこのパッケージをインストールする必要があります。\n\n## 欠落しているソフトウェアやパッケージの対応\n\n[Alpine Linux Web サイト (英語版)](https://pkgs.alpinelinux.org/contents?file=mkisofs&path=&name=&branch=edge&repo=&arch=) によると、`mkisofs` は `xorriso`パッケージと `cdrkit` パッケージの一部です。次のコマンドを実行することでパッケージをインストールできます。\n\n```bash\necho \"ipv6\" >> /etc/modules  # enable networking\napk update                   # update packages list\napk add xorriso              # install package\n```\n\nCI ではこれらは他のコマンドと何ら変わりません。`script` セクションで実行する必要があるコマンドの全リストは、このようになります。\n\n```yml\nscript:\n- echo \"ipv6\" >> /etc/modules\n- apk update\n- apk add xorriso\n- mkisofs -o ./packaged.iso ./compiled.txt\n```\n\n構文的に正しくするため、パッケージのインストールに関連したコマンドは `before_script` 内に置きましょう。`before_script` を構成の最上位レベルで使うと、そのコマンドがすべてのジョブの前に実行されることに留意してください。今回は特定のジョブの前で実行させます。\n\n## DAG（有向非巡回グラフ）：より高速で柔軟なパイプラインのために\n\nステージを定義して、テストに合格した場合にのみパッケージジョブを実行するようにしました。後のステージに定義されているジョブに対し、いくつかのジョブのステージ順序を並び替えて先に実行させたい場合はどうすればいいでしょうか。場合によっては、従来のステージ順序がパイプライン全体の実行時間を遅くしてしまう可能性があります。\n\nテストステージに、実行に時間のかかる負荷の高いテストがいくつか含まれており、それらのテストが必ずしもパッケージジョブに関連していないとします。この場合、テストの完了を待たずにパッケージジョブを開始できれば、より効率的になります。それにはDAG (有向非巡回グラフ) が役立ちます。特定のジョブのステージ順序を変えるためには、ジョブの依存関係 (通常のステージの順序をスキップするもの) を定義します。\n\nGitLab には、ジョブ間の依存関係を作成する特殊キーワード `needs` があります。これを使うことで、依存しているジョブが完了するとすぐにジョブを前倒しで実行できるようになります。\n\n次の例では、テストジョブが完了するとすぐにパックジョブが実行を開始します。そのため、将来誰かがテストをテストステージに追加した場合に、新しいテストジョブの完了を待たずにパッケージジョブが実行を開始します。\n\n```yaml\npack-gz:\n  stage: package\n  script: cat compiled.txt | gzip > packaged.gz\n  needs: [\"test\"]\n  artifacts:\n    paths:\n    - packaged.gz\n\npack-iso:\n  stage: package\n  before_script:\n  - echo \"ipv6\" >> /etc/modules\n  - apk update\n  - apk add xorriso\n  script:\n  - mkisofs -o ./packaged.iso ./compiled.txt\n  needs: [\"test\"]\n  artifacts:\n    paths:\n    - packaged.iso\n```\n\n`.gitlab-ci.yml` の最終バージョン:\n\n```yaml\nimage: alpine\n\nstages:\n  - compile\n  - test\n  - package\n\ncompile:\n  stage: compile\n  before_script:\n      - echo \"Hello  \" | tr -d \"\\n\" > file1.txt\n      - echo \"world\" > file2.txt\n  script: cat file1.txt file2.txt > compiled.txt\n  artifacts:\n    paths:\n    - compiled.txt\n    expire_in: 20 minutes\n\ntest:\n  stage: test\n  script: cat compiled.txt | grep -q 'Hello world'\n\npack-gz:\n  stage: package\n  script: cat compiled.txt | gzip > packaged.gz\n  needs: [\"test\"]\n  artifacts:\n    paths:\n    - packaged.gz\n\npack-iso:\n  stage: package\n  before_script:\n  - echo \"ipv6\" >> /etc/modules\n  - apk update\n  - apk add xorriso\n  script:\n  - mkisofs -o ./packaged.iso ./compiled.txt\n  needs: [\"test\"]\n  artifacts:\n    paths:\n    - packaged.iso\n```\n\nパイプラインが作成できました！ステージは 3 つの連続したステージで、ジョブ `pack-gz` と `pack-iso` が、`package` ステージ内で並列実行されています。\n\n![パイプラインのイラスト](https://about.gitlab.com/images/blogimages/the-basics-of-gitlab-ci/pipeline.png)\n\n## 高度なパイプラインの構築\n\nここからは、高度なパイプラインを構築する方法を説明します。\n\n### CIパイプラインに自動テストを実装 \n\n[DevOps](https://about.gitlab.com/ja-jp/) において、ソフトウェア開発戦略の重要なルールは、素晴らしいユーザーエクスペリエンスを備えた優れたアプリを作成する、というものです。ここでは、CI パイプラインにいくつかのテストを追加し、プロセス全体の早い段階でバグを検出、修正しましょう。この方法なら、問題が大きくなる前や新しいプロジェクトに移る前に問題を修正できます。\n\nGitLabにはさまざまな [テスト](https://docs.gitlab.com/ee/ci/testing/) 用にすぐ使えるテンプレートがあり、これらを使用することで作業が簡単になります。必要な手順は、CI の構成にテンプレートを追加するだけです。\n\nこの例では、[アクセシビリティテスト (英語版)](https://docs.gitlab.com/ee/ci/testing/accessibility_testing.html) を追加します。\n\n```yaml\nstages:\n  - accessibility\n\nvariables:\n  a11y_urls: \"https://about.gitlab.com https://www.example.com\"\n\ninclude:\n  - template: \"Verify/Accessibility.gitlab-ci.yml\"\n```\n\n`a11y_urls` 変数をカスタム化し、Web ページの URL を挿入して、[Pa11y](https://pa11y.org/) と [コード品質](https://docs.gitlab.com/ee/ci/testing/code_quality.html) のテストを行います。\n\n```yaml\n   include:\n   - template: Jobs/Code-Quality.gitlab-ci.yml\n```\n\nGitLab を使うと、マージリクエストのウィジェットエリア内でテストレポートを簡単に確認できます。コードレビュー、パイプラインステータス、テスト結果を一か所にまとめることで、あらゆることがよりスムーズに効率よくできるようになります。\n\n![アクセシビリティレポート](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_10.56.41.png)\n\u003Ccenter>\u003Ci>アクセシビリティ・マージリクエスト・ウィジェット\u003C/i>\u003C/center>\u003Cp>\u003C/p>\n\n![MR 内のコード品質ウィジェット](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_11.00.25.png)\n\u003Ccenter>\u003Ci>コード品質マージリクエストウィジェット\u003C/i>\u003C/center>\n\n### マトリックスビルド\n\n場合によっては、異なる構成、OS バージョン、プログラミング言語バージョンなどでアプリをテストする必要があります。そのような場合には、[parallel:matrix (英語版)](https://docs.gitlab.com/ee/ci/yaml/#parallelmatrix) ビルドを使って、1 つのジョブ構成でさまざまな組み合わせでアプリケーションを並列にテストします。このブログでは、マトリックスキーワードを使用して、異なるバージョンの Python でコードのテストを行います。\n\n```yaml\npython-req:\n  image: python:$VERSION\n  stage: lint\n  script:\n    - pip install -r requirements_dev.txt\n    - chmod +x ./build_cpp.sh\n    - ./build_cpp.sh\n  parallel:\n    matrix:\n      - VERSION: ['3.8', '3.9', '3.10', '3.11']   # https://hub.docker.com/_/python\n```\n\nパイプライン実行中、このジョブは 4 通りの方法で並列実行されます。それぞれ以下のように異なる Python イメージを使用します。\n\n![実行中のマトリックスジョブ](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_11.12.48.png)\n\n### ユニットテスト  \n\n#### ユニットテストとは\n\nユニットテストとは、ソフトウェアの個々のコンポーネントや機能が期待通りに機能するかを確認する、対象を絞った単体テストです。ユニットテストは、ソフトウェア開発プロセスの早い段階でバグを検出して修正し、コードのそれぞれの部分が、独立した状態でも正しく機能することを確認するために必須です。\n\n例: 計算機アプリを開発しているとします。加算関数のユニットテストでは、2 + 2 が 4 になるかどうかを確認します。このテストに合格すれば、加算関数が正しく機能していることが確認されます。\n\n#### ユニットテストのベストプラクティス\n\nテストに失敗すると、パイプラインは失敗し、ユーザーに通知が送られます。デベロッパーはジョブのログ (通常何千行もある) を確認し、どこでテストに失敗したのかを特定し、修正します。このチェックには時間がかかり、効率がよくありません。\n\nそこで、[ユニットテストレポート (英語版)](https://docs.gitlab.com/ee/ci/testing/unit_test_reports.html) を使うようにジョブを構成することができます。GitLab はマージリクエストとパイプラインの詳細ページ上にレポートを表示することができるため、ログ全体を確認しなくてもエラーをより簡単に素早く特定できます。\n\n##### JUnitテストレポート\n\n以下はJUnit テストレポートの例です。\n\n![パイプラインの JUnit テストレポート v13 10](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674097/Blog/Content%20Images/pipelines_junit_test_report_v13_10.png){: .shadow.center}\n\n### 統合テストおよびエンドツーエンドテスト戦略\n通常の開発ルーチンに加え、統合テストとエンドツーエンドテスト専用に指定したパイプラインをセットアップすることが非常に重要です。これらのテストでは、[マイクロサービス (英語版)](https://about.gitlab.com/topics/microservices/)、UI テスト、それ他のコンポーネントを含んだ、コードの異なる部位の連携がスムーズかどうかをチェックします。\n\nこれらのテストは [毎晩 (英語版)](https://docs.gitlab.com/ee/ci/pipelines/schedules.html) 実行されます。[テスト結果を自動的に指定のスラックチャンネルに送るよう (英語版)](https://docs.gitlab.com/ee/user/project/integrations/gitlab_slack_application.html#notification-events) に設定することもできます。そうすることで、デベロッパーが翌日出社したときに迅速に問題を確認できます。こうした機能はすべて、問題を早期に特定して修正することを優先すべく設計されています。\n\n### テスト環境 \n\nテストの中には、アプリをしっかりテストするために、テスト環境を構築しなければならない場合があります。GitLab CI/CD を使用するとテスト環境のデプロイが自動化でき、時間を大幅に節約できます。本ブログは主に CI に着目したものとなっているため、詳細には触れません。アプリのデプロイとリリースについては、[GitLab ドキュメントのこのセクション (英語版)](https://docs.gitlab.com/ee/topics/release_your_application.html) を参照してください。\n\n## CI パイプラインへのセキュリティスキャンの実装\n\nCI パイプラインにセキュリティスキャンを実装する方法は次のとおりです。\n\n### SASTおよびDASTインテグレーション\n\nコードの安全性を守ることは非常に重要であり、最新の変更に脆弱性がある場合は、その内容を直ちに把握したいと考えます。したがって、パイプラインにセキュリティスキャンを追加するのが最適な対応といえるでしょう。セキュリティスキャンは、コミットごとにコードをチェックし、リスクがあれば警告してくれます。CI パイプラインに静的アプリケーションセキュリティテスト ([SAST (英語版)](https://docs.gitlab.com/ee/user/application_security/sast/)) や動的アプリケーションセキュリティテスト ([DAST (英語版)](https://docs.gitlab.com/ee/user/application_security/dast/)) などの各種スキャンを追加する方法を説明する以下のナビゲーションをご確認ください。\n\nナビゲーションを開始するには、以下の画像を**クリック**してください。 \n\n[![スキャンの製品ツアー](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-14_at_13.44.42.png)](https://gitlab.navattic.com/gitlab-scans)\n\nさらに、AI を活用すれば、脆弱性をさらに深く掘り下げ、修正方法の提案が得られます。詳しくは以下のナビゲーションをご確認ください。\n\nナビゲーションを開始するには、以下の画像をクリックしてください。\n\n[![製品ツアーでの脆弱性の説明](https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-14_at_13.50.24.png)](https://tech-marketing.gitlab.io/static-demos/pt-explain-vulnerability.html)\n\n## GitLab CI使い方まとめ\n\nまだまだお伝えしたいことはありますが、ここで一度終わりにしましょう。説明に使用した例はすべて意図的に単純なものにしました。これは、慣れない技術スタックの説明が続くことで内容が頭に入らないといった状況を避け、GitLab CIのコンセプトを理解してもらうためです。では、ここまで学んできたことを次にまとめます。\n\n1. GitLab CI に作業をまかせるには、`.gitlab-ci.yml` 内で 1 つ以上の[ジョブ (英語版)](https://docs.gitlab.com/ee/ci/jobs/)を定義する必要があります。\n2. ジョブには名前を付ける必要がありますが、その際は適切な名前を付けるようにしてください。\n3. それぞれのジョブには、指定のキーワードで定義された、 GitLab CI 用の一連のルールと指示が含まれます。\n4. ジョブは、順序どおりに、並列に、または [DAG (英語版)](https://docs.gitlab.com/ee/ci/directed_acyclic_graph/index.html) を使って順不同で実行できます。\n5. ジョブ間ではファイルを渡してビルドアーティファクトに保存し、インターフェイスからダウンロードできるようにすることも可能です。\n6. CI パイプラインに [テストとセキュリティスキャン (英語版)](https://docs.gitlab.com/ee/development/integrations/secure.html) を追加して、開発中のアプリの品質とセキュリティを確保します。\n\n本記事で使用した用語およびキーワードの説明と、関連するドキュメントのリンクを下表にまとめました。\n\n### キーワードの説明とドキュメント\n\n{: #keywords}\n\n| キーワード/用語       | 説明 |\n|---------------|--------------------|\n| [.gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/) | プロジェクトのビルド方法の定義をすべて含むファイル |\n| [script](https://docs.gitlab.com/ee/ci/yaml/#script)        | 実行するシェルスクリプトを定義する |\n| [before_script](https://docs.gitlab.com/ee/ci/yaml/#before_script) | (全) ジョブの前に実行するコマンドを定義するために使用する |\n| [image](https://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-image) | 使用するDocker イメージを定義する |\n| [stages](https://docs.gitlab.com/ee/ci/yaml/#stages)         | パイプラインのステージを定義する (デフォルトは test) |\n| [artifacts](https://docs.gitlab.com/ee/ci/yaml/#artifacts)     | ビルドアーティファクトのリストを定義する |\n| [artifacts:expire_in](https://docs.gitlab.com/ee/ci/yaml/#artifactsexpire_in) | 指定時間後にアップロードしたアーティファクトを削除するために使用する |\n| [needs](https://docs.gitlab.com/ee/ci/yaml/#needs) | ジョブ間の依存関係を定義するときに使用し、ジョブを特定の順序で実行することを可能にする |\n| [pipelines](https://about.gitlab.com/topics/ci-cd/cicd-pipeline/) | いくつかのステージ (バッチ) で実行されるビルドのグループを指す |\n\n※ドキュメントはすべて英語版です。\n\n## CI/CDについてさらに詳しく\n\n- [GitLab’s guide to CI/CD for beginners (GitLab のビギナーのための CI/CD ガイド (英語版))](https://about.gitlab.com/blog/beginner-guide-ci-cd/)\n- [Get faster and more flexible pipelines with a Directed Acyclic Graph (有向非巡回グラフ（DAG）を使用して、より高速で柔軟なパイプラインを実現する(英語版))](https://about.gitlab.com/blog/directed-acyclic-graph/)\n- [Decrease build time with custom Docker image (カスタム化した Docker イメージでビルド時間を短縮する (英語版))](http://beenje.github.io/blog/posts/gitlab-ci-and-conda/)\n- [Introducing the GitLab CI/CD Catalog Beta (GitLab CI/CD カタログベータ版の紹介 (英語版))](https://about.gitlab.com/blog/introducing-the-gitlab-ci-cd-catalog-beta/)\n\n## よくある質問 (FAQ)\n\n### CIジョブを順次実行するか、または並列実行するか、どのように選択すればいいですか？\n\nCI ジョブを順次実行するか、並列実行するかを選択する際は、ジョブの依存関係、リソースの利用可能性、実行時間、潜在的な干渉、テストスイートの構造、コスト面を考慮します。たとえば、デプロイジョブが始まるまでに終わらせなければならないビルドジョブがあったとします。その場合、これらのジョブを順次実行して、正しい実行順序を確かめます。一方、ユニットテストや統合テストなどのタスクは独立しており、それぞれの完了には依存しないため、並列実行できます。\n\n### GitLab CIの DAG（有向非巡回グラフ）とは何ですか？また、DAG はパイプラインの柔軟性をどのように向上させますか？\n\nGitLab CI の有向非巡回グラフ (DAG) は、パイプラインステージの順序を並び替えます。DAG はジョブ間の依存関係を設定するため、前のステージにあるジョブが終わり次第、その後のステージのジョブが開始されます。これによりパイプライン全体の実行時間が短縮され、効率が向上し、一部のジョブは通常の順序より早く完了します。\n\n### GitLab の CI ジョブに最適なDockerイメージを選ぶ際に重要視しなければならないことは何ですか？\n\nGitLab はジョブの実行の際に Docker イメージを使用します。デフォルトのイメージは ruby:3.1 です。ジョブの要件によって、最適なイメージを選ぶことがとても大切です。ジョブはまず指定された Docker イメージをダウンロードしますが、イメージに必要ではない追加パッケージが含まれていると、ダウンロードや実行に余分な時間がかかります。そのため、実行時に不必要な遅延が発生しないように、選択したイメージにはジョブに必要なパッケージだけが含まれていることを確認することが重要です。\n\n## 次のステップ\n\nソフトウェア開発プラクティスで後れを取らないためにも、次のステップとしてCI/CDコンポーネントの標準化と再利用方法を理解することをお勧めします。[GitLab CI/CD カタログ (英語版)](https://docs.gitlab.com/ee/architecture/blueprints/ci_pipeline_components/) もご確認ください。\n\n継続的インテグレーションとデリバリー入門は、[こちら](https://about.gitlab.com/ja-jp/solutions/continuous-integration/)をご覧ください。\n\n*監修：川瀬 洋平 [@ykawase](https://gitlab.com/ykawase)\u003Cbr>\n（GitLab合同会社 カスタマーサクセス本部 シニアカスタマーサクセスマネージャー）*","engineering",[23,24],"CI","tutorial","2025-02-20",{"slug":27,"featured":6,"template":28},"basics-of-gitlab-ci-updated","BlogPost","content:ja-jp:blog:basics-of-gitlab-ci-updated.yml","yaml","Basics Of Gitlab Ci Updated","content","ja-jp/blog/basics-of-gitlab-ci-updated.yml","ja-jp/blog/basics-of-gitlab-ci-updated","yml",{"_path":37,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":39,"_id":448,"_type":30,"title":449,"_source":32,"_file":450,"_stem":451,"_extension":35},"/shared/ja-jp/main-navigation","ja-jp",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":392,"minimal":426,"duo":439},{"config":41},{"href":42,"dataGaName":43,"dataGaLocation":44},"/ja-jp/","gitlab logo","header",{"text":46,"config":47},"無料トライアルを開始",{"href":48,"dataGaName":49,"dataGaLocation":44},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":51,"config":52},"お問い合わせ",{"href":53,"dataGaName":54,"dataGaLocation":44},"/ja-jp/sales/","sales",{"text":56,"config":57},"サインイン",{"href":58,"dataGaName":59,"dataGaLocation":44},"https://gitlab.com/users/sign_in/","sign in",[61,105,204,209,314,374],{"text":62,"config":63,"cards":65,"footer":88},"プラットフォーム",{"dataNavLevelOne":64},"platform",[66,72,80],{"title":62,"description":67,"link":68},"最も包括的かつAIで強化されたDevSecOpsプラットフォーム",{"text":69,"config":70},"プラットフォームを詳しく見る",{"href":71,"dataGaName":64,"dataGaLocation":44},"/ja-jp/platform/",{"title":73,"description":74,"link":75},"GitLab Duo（AI）","開発のすべてのステージでAIを活用し、ソフトウェアをより迅速にビルド",{"text":76,"config":77},"GitLab Duoのご紹介",{"href":78,"dataGaName":79,"dataGaLocation":44},"/ja-jp/gitlab-duo/","gitlab duo ai",{"title":81,"description":82,"link":83},"GitLabが選ばれる理由","GitLabが大企業に選ばれる理由10選",{"text":84,"config":85},"詳細はこちら",{"href":86,"dataGaName":87,"dataGaLocation":44},"/ja-jp/why-gitlab/","why gitlab",{"title":89,"items":90},"利用を開始：",[91,96,101],{"text":92,"config":93},"プラットフォームエンジニアリング",{"href":94,"dataGaName":95,"dataGaLocation":44},"/ja-jp/solutions/platform-engineering/","platform engineering",{"text":97,"config":98},"開発者の経験",{"href":99,"dataGaName":100,"dataGaLocation":44},"/ja-jp/developer-experience/","Developer experience",{"text":102,"config":103},"MLOps",{"href":104,"dataGaName":102,"dataGaLocation":44},"/ja-jp/topics/devops/the-role-of-ai-in-devops/",{"text":106,"left":107,"config":108,"link":110,"lists":114,"footer":186},"製品",true,{"dataNavLevelOne":109},"solutions",{"text":111,"config":112},"すべてのソリューションを表示",{"href":113,"dataGaName":109,"dataGaLocation":44},"/ja-jp/solutions/",[115,141,164],{"title":116,"description":117,"link":118,"items":123},"自動化","CI/CDと自動化でデプロイを加速",{"config":119},{"icon":120,"href":121,"dataGaName":122,"dataGaLocation":44},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[124,128,132,137],{"text":125,"config":126},"CI/CD",{"href":127,"dataGaLocation":44,"dataGaName":125},"/ja-jp/solutions/continuous-integration/",{"text":129,"config":130},"AIアシストによる開発",{"href":78,"dataGaLocation":44,"dataGaName":131},"AI assisted development",{"text":133,"config":134},"ソースコード管理",{"href":135,"dataGaLocation":44,"dataGaName":136},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":138,"config":139},"自動化されたソフトウェアデリバリー",{"href":121,"dataGaLocation":44,"dataGaName":140},"Automated software delivery",{"title":142,"description":143,"link":144,"items":149},"セキュリティ","セキュリティを損なうことなくコードをより迅速に完成",{"config":145},{"href":146,"dataGaName":147,"dataGaLocation":44,"icon":148},"/ja-jp/solutions/security-compliance/","security and compliance","ShieldCheckLight",[150,154,159],{"text":151,"config":152},"セキュリティとコンプライアンス",{"href":146,"dataGaLocation":44,"dataGaName":153},"Security & Compliance",{"text":155,"config":156},"ソフトウェアサプライチェーンの安全性",{"href":157,"dataGaLocation":44,"dataGaName":158},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":160,"config":161},"コンプライアンスとガバナンス",{"href":162,"dataGaLocation":44,"dataGaName":163},"/ja-jp/solutions/continuous-software-compliance/","Compliance and governance",{"title":165,"link":166,"items":171},"測定",{"config":167},{"icon":168,"href":169,"dataGaName":170,"dataGaLocation":44},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[172,176,181],{"text":173,"config":174},"可視性と測定",{"href":169,"dataGaLocation":44,"dataGaName":175},"Visibility and Measurement",{"text":177,"config":178},"バリューストリーム管理",{"href":179,"dataGaLocation":44,"dataGaName":180},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":182,"config":183},"分析とインサイト",{"href":184,"dataGaLocation":44,"dataGaName":185},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":187,"items":188},"GitLabが活躍する場所",[189,194,199],{"text":190,"config":191},"Enterprise",{"href":192,"dataGaLocation":44,"dataGaName":193},"/ja-jp/enterprise/","enterprise",{"text":195,"config":196},"スモールビジネス",{"href":197,"dataGaLocation":44,"dataGaName":198},"/ja-jp/small-business/","small business",{"text":200,"config":201},"公共機関",{"href":202,"dataGaLocation":44,"dataGaName":203},"/ja-jp/solutions/public-sector/","public sector",{"text":205,"config":206},"価格",{"href":207,"dataGaName":208,"dataGaLocation":44,"dataNavLevelOne":208},"/ja-jp/pricing/","pricing",{"text":210,"config":211,"link":213,"lists":217,"feature":301},"関連リソース",{"dataNavLevelOne":212},"resources",{"text":214,"config":215},"すべてのリソースを表示",{"href":216,"dataGaName":212,"dataGaLocation":44},"/ja-jp/resources/",[218,251,273],{"title":219,"items":220},"はじめに",[221,226,231,236,241,246],{"text":222,"config":223},"インストール",{"href":224,"dataGaName":225,"dataGaLocation":44},"/ja-jp/install/","install",{"text":227,"config":228},"クイックスタートガイド",{"href":229,"dataGaName":230,"dataGaLocation":44},"/ja-jp/get-started/","quick setup checklists",{"text":232,"config":233},"学ぶ",{"href":234,"dataGaLocation":44,"dataGaName":235},"https://university.gitlab.com/","learn",{"text":237,"config":238},"製品ドキュメント",{"href":239,"dataGaName":240,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":242,"config":243},"ベストプラクティスビデオ",{"href":244,"dataGaName":245,"dataGaLocation":44},"/ja-jp/getting-started-videos/","best practice videos",{"text":247,"config":248},"インテグレーション",{"href":249,"dataGaName":250,"dataGaLocation":44},"/ja-jp/integrations/","integrations",{"title":252,"items":253},"検索する",[254,259,263,268],{"text":255,"config":256},"お客様成功事例",{"href":257,"dataGaName":258,"dataGaLocation":44},"/ja-jp/customers/","customer success stories",{"text":260,"config":261},"ブログ",{"href":262,"dataGaName":5,"dataGaLocation":44},"/ja-jp/blog/",{"text":264,"config":265},"リモート",{"href":266,"dataGaName":267,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":269,"config":270},"TeamOps",{"href":271,"dataGaName":272,"dataGaLocation":44},"/ja-jp/teamops/","teamops",{"title":274,"items":275},"つなげる",[276,281,286,291,296],{"text":277,"config":278},"GitLabサービス",{"href":279,"dataGaName":280,"dataGaLocation":44},"/ja-jp/services/","services",{"text":282,"config":283},"コミュニティ",{"href":284,"dataGaName":285,"dataGaLocation":44},"/community/","community",{"text":287,"config":288},"フォーラム",{"href":289,"dataGaName":290,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":292,"config":293},"イベント",{"href":294,"dataGaName":295,"dataGaLocation":44},"/events/","events",{"text":297,"config":298},"パートナー",{"href":299,"dataGaName":300,"dataGaLocation":44},"/ja-jp/partners/","partners",{"backgroundColor":302,"textColor":303,"text":304,"image":305,"link":309},"#2f2a6b","#fff","ソフトウェア開発の未来への洞察",{"altText":306,"config":307},"ソースプロモカード",{"src":308},"/images/navigation/the-source-promo-card.svg",{"text":310,"config":311},"最新情報を読む",{"href":312,"dataGaName":313,"dataGaLocation":44},"/ja-jp/the-source/","the source",{"text":315,"config":316,"lists":318},"Company",{"dataNavLevelOne":317},"company",[319],{"items":320},[321,326,332,334,339,344,349,354,359,364,369],{"text":322,"config":323},"GitLabについて",{"href":324,"dataGaName":325,"dataGaLocation":44},"/ja-jp/company/","about",{"text":327,"config":328,"footerGa":331},"採用情報",{"href":329,"dataGaName":330,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":330},{"text":292,"config":333},{"href":294,"dataGaName":295,"dataGaLocation":44},{"text":335,"config":336},"経営陣",{"href":337,"dataGaName":338,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":340,"config":341},"チーム",{"href":342,"dataGaName":343,"dataGaLocation":44},"/company/team/","team",{"text":345,"config":346},"ハンドブック",{"href":347,"dataGaName":348,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":350,"config":351},"投資家向け情報",{"href":352,"dataGaName":353,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":355,"config":356},"トラストセンター",{"href":357,"dataGaName":358,"dataGaLocation":44},"/ja-jp/security/","trust center",{"text":360,"config":361},"AI Transparency Center",{"href":362,"dataGaName":363,"dataGaLocation":44},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":365,"config":366},"ニュースレター",{"href":367,"dataGaName":368,"dataGaLocation":44},"/company/contact/","newsletter",{"text":370,"config":371},"プレス",{"href":372,"dataGaName":373,"dataGaLocation":44},"/press/","press",{"text":51,"config":375,"lists":376},{"dataNavLevelOne":317},[377],{"items":378},[379,382,387],{"text":51,"config":380},{"href":53,"dataGaName":381,"dataGaLocation":44},"talk to sales",{"text":383,"config":384},"サポートを受ける",{"href":385,"dataGaName":386,"dataGaLocation":44},"/support/","get help",{"text":388,"config":389},"カスタマーポータル",{"href":390,"dataGaName":391,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":393,"login":394,"suggestions":401},"閉じる",{"text":395,"link":396},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":397,"config":398},"GitLab.com",{"href":58,"dataGaName":399,"dataGaLocation":400},"search login","search",{"text":402,"default":403},"提案",[404,407,412,414,418,422],{"text":73,"config":405},{"href":78,"dataGaName":406,"dataGaLocation":400},"GitLab Duo (AI)",{"text":408,"config":409},"コード提案（AI）",{"href":410,"dataGaName":411,"dataGaLocation":400},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":125,"config":413},{"href":127,"dataGaName":125,"dataGaLocation":400},{"text":415,"config":416},"GitLab on AWS",{"href":417,"dataGaName":415,"dataGaLocation":400},"/ja-jp/partners/technology-partners/aws/",{"text":419,"config":420},"GitLab on Google Cloud",{"href":421,"dataGaName":419,"dataGaLocation":400},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":423,"config":424},"GitLabを選ぶ理由",{"href":86,"dataGaName":425,"dataGaLocation":400},"Why GitLab?",{"freeTrial":427,"mobileIcon":431,"desktopIcon":436},{"text":46,"config":428},{"href":429,"dataGaName":49,"dataGaLocation":430},"https://gitlab.com/-/trials/new/","nav",{"altText":432,"config":433},"GitLabアイコン",{"src":434,"dataGaName":435,"dataGaLocation":430},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":432,"config":437},{"src":438,"dataGaName":435,"dataGaLocation":430},"/images/brand/gitlab-logo-type.svg",{"freeTrial":440,"mobileIcon":444,"desktopIcon":446},{"text":441,"config":442},"GitLab Duoの詳細について",{"href":78,"dataGaName":443,"dataGaLocation":430},"gitlab duo",{"altText":432,"config":445},{"src":434,"dataGaName":435,"dataGaLocation":430},{"altText":432,"config":447},{"src":438,"dataGaName":435,"dataGaLocation":430},"content:shared:ja-jp:main-navigation.yml","Main Navigation","shared/ja-jp/main-navigation.yml","shared/ja-jp/main-navigation",{"_path":453,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"title":454,"button":455,"config":460,"_id":462,"_type":30,"_source":32,"_file":463,"_stem":464,"_extension":35},"/shared/ja-jp/banner","GitLab Duo Agent Platformがパブリックベータ版で利用可能に！",{"text":456,"config":457},"詳しく見る",{"href":458,"dataGaName":459,"dataGaLocation":44},"/gitlab-duo/agent-platform/","duo banner",{"layout":461},"release","content:shared:ja-jp:banner.yml","shared/ja-jp/banner.yml","shared/ja-jp/banner",{"_path":466,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":467,"_id":671,"_type":30,"title":672,"_source":32,"_file":673,"_stem":674,"_extension":35},"/shared/ja-jp/main-footer",{"text":468,"source":469,"edit":475,"contribute":480,"config":485,"items":490,"minimal":663},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":470,"config":471},"ページのソースを表示",{"href":472,"dataGaName":473,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":476,"config":477},"このページを編集",{"href":478,"dataGaName":479,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":481,"config":482},"ご協力をお願いします",{"href":483,"dataGaName":484,"dataGaLocation":474},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":486,"facebook":487,"youtube":488,"linkedin":489},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[491,514,568,601,635],{"title":62,"links":492,"subMenu":497},[493],{"text":494,"config":495},"DevSecOpsプラットフォーム",{"href":71,"dataGaName":496,"dataGaLocation":474},"devsecops platform",[498],{"title":205,"links":499},[500,504,509],{"text":501,"config":502},"プランの表示",{"href":207,"dataGaName":503,"dataGaLocation":474},"view plans",{"text":505,"config":506},"Premiumを選ぶ理由",{"href":507,"dataGaName":508,"dataGaLocation":474},"/ja-jp/pricing/premium/","why premium",{"text":510,"config":511},"Ultimateを選ぶ理由",{"href":512,"dataGaName":513,"dataGaLocation":474},"/ja-jp/pricing/ultimate/","why ultimate",{"title":515,"links":516},"ソリューション",[517,522,525,527,532,537,541,544,547,552,554,556,558,563],{"text":518,"config":519},"デジタルトランスフォーメーション",{"href":520,"dataGaName":521,"dataGaLocation":474},"/ja-jp/topics/digital-transformation/","digital transformation",{"text":151,"config":523},{"href":146,"dataGaName":524,"dataGaLocation":474},"security & compliance",{"text":138,"config":526},{"href":121,"dataGaName":122,"dataGaLocation":474},{"text":528,"config":529},"アジャイル開発",{"href":530,"dataGaName":531,"dataGaLocation":474},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":533,"config":534},"クラウドトランスフォーメーション",{"href":535,"dataGaName":536,"dataGaLocation":474},"/ja-jp/topics/cloud-native/","cloud transformation",{"text":538,"config":539},"SCM",{"href":135,"dataGaName":540,"dataGaLocation":474},"source code management",{"text":125,"config":542},{"href":127,"dataGaName":543,"dataGaLocation":474},"continuous integration & delivery",{"text":177,"config":545},{"href":179,"dataGaName":546,"dataGaLocation":474},"value stream management",{"text":548,"config":549},"GitOps",{"href":550,"dataGaName":551,"dataGaLocation":474},"/ja-jp/solutions/gitops/","gitops",{"text":190,"config":553},{"href":192,"dataGaName":193,"dataGaLocation":474},{"text":195,"config":555},{"href":197,"dataGaName":198,"dataGaLocation":474},{"text":200,"config":557},{"href":202,"dataGaName":203,"dataGaLocation":474},{"text":559,"config":560},"教育",{"href":561,"dataGaName":562,"dataGaLocation":474},"/ja-jp/solutions/education/","education",{"text":564,"config":565},"金融サービス",{"href":566,"dataGaName":567,"dataGaLocation":474},"/ja-jp/solutions/finance/","financial services",{"title":210,"links":569},[570,572,574,576,579,581,585,587,589,591,593,595,597,599],{"text":222,"config":571},{"href":224,"dataGaName":225,"dataGaLocation":474},{"text":227,"config":573},{"href":229,"dataGaName":230,"dataGaLocation":474},{"text":232,"config":575},{"href":234,"dataGaName":235,"dataGaLocation":474},{"text":237,"config":577},{"href":239,"dataGaName":578,"dataGaLocation":474},"docs",{"text":260,"config":580},{"href":262,"dataGaName":5},{"text":582,"config":583},"お客様の成功事例",{"href":584,"dataGaLocation":474},"/customers/",{"text":255,"config":586},{"href":257,"dataGaName":258,"dataGaLocation":474},{"text":264,"config":588},{"href":266,"dataGaName":267,"dataGaLocation":474},{"text":277,"config":590},{"href":279,"dataGaName":280,"dataGaLocation":474},{"text":269,"config":592},{"href":271,"dataGaName":272,"dataGaLocation":474},{"text":282,"config":594},{"href":284,"dataGaName":285,"dataGaLocation":474},{"text":287,"config":596},{"href":289,"dataGaName":290,"dataGaLocation":474},{"text":292,"config":598},{"href":294,"dataGaName":295,"dataGaLocation":474},{"text":297,"config":600},{"href":299,"dataGaName":300,"dataGaLocation":474},{"title":315,"links":602},[603,605,607,609,611,613,615,619,624,626,628,630],{"text":322,"config":604},{"href":324,"dataGaName":317,"dataGaLocation":474},{"text":327,"config":606},{"href":329,"dataGaName":330,"dataGaLocation":474},{"text":335,"config":608},{"href":337,"dataGaName":338,"dataGaLocation":474},{"text":340,"config":610},{"href":342,"dataGaName":343,"dataGaLocation":474},{"text":345,"config":612},{"href":347,"dataGaName":348,"dataGaLocation":474},{"text":350,"config":614},{"href":352,"dataGaName":353,"dataGaLocation":474},{"text":616,"config":617},"Sustainability",{"href":618,"dataGaName":616,"dataGaLocation":474},"/sustainability/",{"text":620,"config":621},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":622,"dataGaName":623,"dataGaLocation":474},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":355,"config":625},{"href":357,"dataGaName":358,"dataGaLocation":474},{"text":365,"config":627},{"href":367,"dataGaName":368,"dataGaLocation":474},{"text":370,"config":629},{"href":372,"dataGaName":373,"dataGaLocation":474},{"text":631,"config":632},"現代奴隷制の透明性に関する声明",{"href":633,"dataGaName":634,"dataGaLocation":474},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":51,"links":636},[637,639,641,643,648,653,658],{"text":51,"config":638},{"href":53,"dataGaName":54,"dataGaLocation":474},{"text":383,"config":640},{"href":385,"dataGaName":386,"dataGaLocation":474},{"text":388,"config":642},{"href":390,"dataGaName":391,"dataGaLocation":474},{"text":644,"config":645},"ステータス",{"href":646,"dataGaName":647,"dataGaLocation":474},"https://status.gitlab.com/","status",{"text":649,"config":650},"利用規約",{"href":651,"dataGaName":652,"dataGaLocation":474},"/terms/","terms of use",{"text":654,"config":655},"プライバシーに関する声明",{"href":656,"dataGaName":657,"dataGaLocation":474},"/ja-jp/privacy/","privacy statement",{"text":659,"config":660},"Cookieの設定",{"dataGaName":661,"dataGaLocation":474,"id":662,"isOneTrustButton":107},"cookie preferences","ot-sdk-btn",{"items":664},[665,667,669],{"text":649,"config":666},{"href":651,"dataGaName":652,"dataGaLocation":474},{"text":654,"config":668},{"href":656,"dataGaName":657,"dataGaLocation":474},{"text":659,"config":670},{"dataGaName":661,"dataGaLocation":474,"id":662,"isOneTrustButton":107},"content:shared:ja-jp:main-footer.yml","Main Footer","shared/ja-jp/main-footer.yml","shared/ja-jp/main-footer",[676],{"_path":677,"_dir":678,"_draft":6,"_partial":6,"_locale":7,"content":679,"config":683,"_id":685,"_type":30,"title":18,"_source":32,"_file":686,"_stem":687,"_extension":35},"/en-us/blog/authors/itzik-gan-baruch","authors",{"name":18,"config":680},{"headshot":681,"ctfId":682},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658921/Blog/Author%20Headshots/iganbaruch-headshot.jpg","iganbaruch",{"template":684},"BlogAuthor","content:en-us:blog:authors:itzik-gan-baruch.yml","en-us/blog/authors/itzik-gan-baruch.yml","en-us/blog/authors/itzik-gan-baruch",{"_path":689,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"header":690,"eyebrow":691,"blurb":692,"button":693,"secondaryButton":697,"_id":699,"_type":30,"title":700,"_source":32,"_file":701,"_stem":702,"_extension":35},"/shared/ja-jp/next-steps","より優れたソフトウェアをより速く提供","フォーチュン100企業の50%以上がGitLabを信頼","インテリジェントなDevSecOpsプラットフォームで\n\n\nチームの可能性を広げましょう。\n",{"text":46,"config":694},{"href":695,"dataGaName":49,"dataGaLocation":696},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":51,"config":698},{"href":53,"dataGaName":54,"dataGaLocation":696},"content:shared:ja-jp:next-steps.yml","Next Steps","shared/ja-jp/next-steps.yml","shared/ja-jp/next-steps",1754424545429]