[{"data":1,"prerenderedAt":3161},["ShallowReactive",2],{"/ja-jp/blog/basics-of-gitlab-ci-updated":3,"navigation-ja-jp":2382,"banner-ja-jp":2812,"footer-ja-jp":2820,"blog-post-authors-ja-jp-Itzik Gan Baruch":3061,"blog-related-posts-ja-jp-basics-of-gitlab-ci-updated":3075,"blog-promotions-ja-jp":3098,"next-steps-ja-jp":3152},{"id":4,"title":5,"authors":6,"body":8,"category":2361,"date":2362,"description":2363,"extension":2364,"externalUrl":2365,"faq":2365,"featured":2366,"heroImage":2367,"meta":2368,"navigation":245,"path":2369,"seo":2370,"slug":2374,"stem":2375,"tags":2376,"template":2379,"updatedDate":2380,"__hash__":2381},"blogPosts/ja-jp/blog/basics-of-gitlab-ci-updated.md","CI 入門：ジョブを順序どおりに、並列に、または順不同で実行する方法",[7],"Itzik Gan Baruch",{"type":9,"value":10,"toc":2332},"minimark",[11,27,30,33,36,39,79,88,93,100,129,132,139,142,148,151,154,161,164,209,212,216,219,222,263,266,272,279,342,345,351,354,357,364,467,470,473,630,633,639,646,701,704,717,721,724,730,733,769,779,782,788,791,821,824,827,838,988,991,994,1000,1009,1012,1031,1085,1091,1148,1157,1161,1164,1167,1174,1177,1319,1324,1617,1629,1635,1638,1641,1646,1654,1663,1672,1734,1751,1774,1777,1783,1790,1796,1801,1804,1813,1919,1922,1928,1931,1935,1938,1941,1944,1947,1956,1961,1964,1971,1974,1983,1998,2001,2010,2014,2017,2021,2036,2051,2054,2065,2069,2072,2108,2111,2114,2117,2238,2241,2245,2275,2279,2283,2286,2290,2293,2297,2300,2303,2306,2314,2325,2328],[12,13,14,20,21,26],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://about.gitlab.com/topics/ci-cd/",[],"継続的インテグレーション (CI) (英語版)","\nのことを何一つ知らず、ソフトウェア開発ライフサイクルに ",[15,22,25],{"href":23,"rel":24},"https://about.gitlab.com/blog/how-to-keep-up-with-ci-cd-best-practices/",[],"どうして CI が必要なのか (英語版)","\n分からない、と仮定しましょう。",[12,28,29],{},"いま、あるプロジェクトで作業をしていて、そこには2つのテキストファイルから成るコードがあるものとします。さらに、これらの2つのファイルには「Hello world」というフレーズが含まれている必要がある、という点に注意してください。",[12,31,32],{},"このフレーズが含まれていなければ、開発チームがその月のお給料を受け取れないことになるかもしれないくらい、重要なポイントです。",[12,34,35],{},"そこで、責任感のあるソフトウェアデベロッパーが、顧客にコードを納品する前に実行する、短いスクリプトを書きました。",[12,37,38],{},"以下のような非常に洗練されたコードです。",[40,41,46],"pre",{"className":42,"code":43,"language":44,"meta":45,"style":45},"language-bash shiki shiki-themes github-light","cat file1.txt file2.txt | grep -q \"Hello world\"\n","bash","",[47,48,49],"code",{"__ignoreMap":45},[50,51,54,58,62,65,69,72,76],"span",{"class":52,"line":53},"line",1,[50,55,57],{"class":56},"s7eDp","cat",[50,59,61],{"class":60},"sYBdl"," file1.txt",[50,63,64],{"class":60}," file2.txt",[50,66,68],{"class":67},"sD7c4"," |",[50,70,71],{"class":56}," grep",[50,73,75],{"class":74},"sYu0t"," -q",[50,77,78],{"class":60}," \"Hello world\"\n",[12,80,81,82,87],{},"ここでの懸念事項はチームには10名のデベロッパーがいて、人的要因がコードの品質に大きな影響を及ぼす可能性があるという点です。 1週間前、新しくチームに入ったメンバーがこのスクリプトを実行し忘れ、3件のクライアントに機能しないビルドが納品されるという事態が発生しました。この事態の解決にあたり、幸いにもコードは既にGitLab\nにあり、",[15,83,86],{"href":84,"rel":85},"https://about.gitlab.com/ja-jp/solutions/continuous-integration/",[],"ビルトインの\nCI","\nがあることが分かりました。さらに、あるカンファレンスで、テスト実行にCIを使うのが一般的ということを耳にしていました。",[89,90,92],"h2",{"id":91},"ci-内で最初のテストを実行する","CI 内で最初のテストを実行する",[12,94,95,96,99],{},"ドキュメントによると、CI の実行に必要なのは ",[47,97,98],{},".gitlab-ci.yml"," ファイル内に 以下の2 行のコードを追加することだけでした。",[40,101,105],{"className":102,"code":103,"language":104,"meta":45,"style":45},"language-yaml shiki shiki-themes github-light","test:\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n","yaml",[47,106,107,117],{"__ignoreMap":45},[50,108,109,113],{"class":52,"line":53},[50,110,112],{"class":111},"shJU0","test",[50,114,116],{"class":115},"sgsFI",":\n",[50,118,120,123,126],{"class":52,"line":119},2,[50,121,122],{"class":111},"  script",[50,124,125],{"class":115},": ",[50,127,128],{"class":60},"cat file1.txt file2.txt | grep -q 'Hello world'\n",[12,130,131],{},"コミットして...無事にビルドが成功しました。",[12,133,134],{},[135,136],"img",{"alt":137,"src":138},"CI内でビルドに成功","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/build_succeeded.png",[12,140,141],{},"では、2 つ目のファイルの「world」という文言を「Africa」に置き換え、何が起こるか確認してみましょう。",[12,143,144],{},[135,145],{"alt":146,"src":147},"CI内でビルドに失敗","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/build_failed.png",[12,149,150],{},"ビルドは予想どおり失敗します。",[12,152,153],{},"ここで、自動化テストが完成しました。GitLab CI は、DevOps\n環境内でソースコードのリポジトリに新しいコードをプッシュするたびにこのテストスクリプトを実行します。",[12,155,156,160],{},[157,158,159],"strong",{},"注:"," 上記例では、file1.txt と file2.txt がGitLabランナーを実行するホストに存在すると仮定しています。",[12,162,163],{},"この例を実際に GitLabで実行するには、以下のようにファイルを作成するコードを実行した後、テストスクリプトを実行する必要があります。",[40,165,167],{"className":102,"code":166,"language":104,"meta":45,"style":45},"test:\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",[47,168,169,175,182,191,199],{"__ignoreMap":45},[50,170,171,173],{"class":52,"line":53},[50,172,112],{"class":111},[50,174,116],{"class":115},[50,176,177,180],{"class":52,"line":119},[50,178,179],{"class":111},"before_script",[50,181,116],{"class":115},[50,183,185,188],{"class":52,"line":184},3,[50,186,187],{"class":115},"      - ",[50,189,190],{"class":60},"echo \"Hello \" > | tr -d \"\\n\" | > file1.txt\n",[50,192,194,196],{"class":52,"line":193},4,[50,195,187],{"class":115},[50,197,198],{"class":60},"echo \"world\" > file2.txt\n",[50,200,202,205,207],{"class":52,"line":201},5,[50,203,204],{"class":111},"script",[50,206,125],{"class":115},[50,208,128],{"class":60},[12,210,211],{},"なお、分かりやすくするために、この 2 つのファイルは既にホストに存在していると仮定し、以降の例では作成しないものとします。",[89,213,215],{"id":214},"ciビルド結果をダウンロード可能にする","CIビルド結果をダウンロード可能にする",[12,217,218],{},"次にすることは、顧客に納品するコードをパッケージ化することです。ソフトウェア開発プロセスのこの部分も自動化してしまいましょう。",[12,220,221],{},"まず、CI に別のジョブを定義する必要があります。このジョブは「package」という名前にしましょう。",[40,223,225],{"className":102,"code":224,"language":104,"meta":45,"style":45},"test:\n  script: cat file1.txt file2.txt | grep -q 'Hello world'\n\npackage:\n  script: cat file1.txt file2.txt | gzip > package.gz\n",[47,226,227,233,241,247,254],{"__ignoreMap":45},[50,228,229,231],{"class":52,"line":53},[50,230,112],{"class":111},[50,232,116],{"class":115},[50,234,235,237,239],{"class":52,"line":119},[50,236,122],{"class":111},[50,238,125],{"class":115},[50,240,128],{"class":60},[50,242,243],{"class":52,"line":184},[50,244,246],{"emptyLinePlaceholder":245},true,"\n",[50,248,249,252],{"class":52,"line":193},[50,250,251],{"class":111},"package",[50,253,116],{"class":115},[50,255,256,258,260],{"class":52,"line":201},[50,257,122],{"class":111},[50,259,125],{"class":115},[50,261,262],{"class":60},"cat file1.txt file2.txt | gzip > package.gz\n",[12,264,265],{},"よって、今ここにはタブが 2 つあります。",[12,267,268],{},[135,269],{"alt":270,"src":271},"2つのタブ ― 2つのジョブから生成","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/two_tabs.png",[12,273,274,275,278],{},"しかし、新たに作成されるファイルがダウンロードできるようにビルドの「アーティファクト」であることを指定し忘れてしまいました。。修正するには、",[47,276,277],{},"artifacts","\nセクションを追加します。",[40,280,282],{"className":102,"code":281,"language":104,"meta":45,"style":45},"test:\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",[47,283,284,290,298,302,308,317,325,333],{"__ignoreMap":45},[50,285,286,288],{"class":52,"line":53},[50,287,112],{"class":111},[50,289,116],{"class":115},[50,291,292,294,296],{"class":52,"line":119},[50,293,122],{"class":111},[50,295,125],{"class":115},[50,297,128],{"class":60},[50,299,300],{"class":52,"line":184},[50,301,246],{"emptyLinePlaceholder":245},[50,303,304,306],{"class":52,"line":193},[50,305,251],{"class":111},[50,307,116],{"class":115},[50,309,310,312,314],{"class":52,"line":201},[50,311,122],{"class":111},[50,313,125],{"class":115},[50,315,316],{"class":60},"cat file1.txt file2.txt | gzip > packaged.gz\n",[50,318,320,323],{"class":52,"line":319},6,[50,321,322],{"class":111},"  artifacts",[50,324,116],{"class":115},[50,326,328,331],{"class":52,"line":327},7,[50,329,330],{"class":111},"    paths",[50,332,116],{"class":115},[50,334,336,339],{"class":52,"line":335},8,[50,337,338],{"class":115},"    - ",[50,340,341],{"class":60},"packaged.gz\n",[12,343,344],{},"修正した結果を確認すると、アーティファクトが作成されダウンロードできるようになっています。",[12,346,347],{},[135,348],{"alt":349,"src":350},"ダウンロードボタンのチェック","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/artifacts.png",[12,352,353],{},"しかし、ここで修正が必要な新たな問題があります。2\nつのジョブは現在は並列実行されていますが、テストに失敗した場合、アプリケーションをパッケージ化しないように変更をする必要があります。",[89,355,356],{"id":356},"ジョブを順次実行する",[12,358,359,360,363],{},"そこで「package」ジョブは、テストが成功した場合のみ実行するものとします。",[47,361,362],{},"stages"," を指定し、ジョブの実行順序を定義しましょう。",[40,365,367],{"className":102,"code":366,"language":104,"meta":45,"style":45},"stages:\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",[47,368,369,375,383,390,394,400,409,417,421,428,437,446,453,460],{"__ignoreMap":45},[50,370,371,373],{"class":52,"line":53},[50,372,362],{"class":111},[50,374,116],{"class":115},[50,376,377,380],{"class":52,"line":119},[50,378,379],{"class":115},"  - ",[50,381,382],{"class":60},"test\n",[50,384,385,387],{"class":52,"line":184},[50,386,379],{"class":115},[50,388,389],{"class":60},"package\n",[50,391,392],{"class":52,"line":193},[50,393,246],{"emptyLinePlaceholder":245},[50,395,396,398],{"class":52,"line":201},[50,397,112],{"class":111},[50,399,116],{"class":115},[50,401,402,405,407],{"class":52,"line":319},[50,403,404],{"class":111},"  stage",[50,406,125],{"class":115},[50,408,382],{"class":60},[50,410,411,413,415],{"class":52,"line":327},[50,412,122],{"class":111},[50,414,125],{"class":115},[50,416,128],{"class":60},[50,418,419],{"class":52,"line":335},[50,420,246],{"emptyLinePlaceholder":245},[50,422,424,426],{"class":52,"line":423},9,[50,425,251],{"class":111},[50,427,116],{"class":115},[50,429,431,433,435],{"class":52,"line":430},10,[50,432,404],{"class":111},[50,434,125],{"class":115},[50,436,389],{"class":60},[50,438,440,442,444],{"class":52,"line":439},11,[50,441,122],{"class":111},[50,443,125],{"class":115},[50,445,316],{"class":60},[50,447,449,451],{"class":52,"line":448},12,[50,450,322],{"class":111},[50,452,116],{"class":115},[50,454,456,458],{"class":52,"line":455},13,[50,457,330],{"class":111},[50,459,116],{"class":115},[50,461,463,465],{"class":52,"line":462},14,[50,464,338],{"class":115},[50,466,341],{"class":60},[12,468,469],{},"上記のようになりました。",[12,471,472],{},"ちなみに、コンパイル (我々のケースでは2つのファイルを連結することを意味します) には時間がかかるため、2\n回も実行したくはありません。コンパイルは別のステップとして定義しましょう。",[40,474,476],{"className":102,"code":475,"language":104,"meta":45,"style":45},"stages:\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",[47,477,478,484,491,497,503,507,514,522,531,537,543,550,554,560,568,578,583,590,599,609,616,623],{"__ignoreMap":45},[50,479,480,482],{"class":52,"line":53},[50,481,362],{"class":111},[50,483,116],{"class":115},[50,485,486,488],{"class":52,"line":119},[50,487,379],{"class":115},[50,489,490],{"class":60},"compile\n",[50,492,493,495],{"class":52,"line":184},[50,494,379],{"class":115},[50,496,382],{"class":60},[50,498,499,501],{"class":52,"line":193},[50,500,379],{"class":115},[50,502,389],{"class":60},[50,504,505],{"class":52,"line":201},[50,506,246],{"emptyLinePlaceholder":245},[50,508,509,512],{"class":52,"line":319},[50,510,511],{"class":111},"compile",[50,513,116],{"class":115},[50,515,516,518,520],{"class":52,"line":327},[50,517,404],{"class":111},[50,519,125],{"class":115},[50,521,490],{"class":60},[50,523,524,526,528],{"class":52,"line":335},[50,525,122],{"class":111},[50,527,125],{"class":115},[50,529,530],{"class":60},"cat file1.txt file2.txt > compiled.txt\n",[50,532,533,535],{"class":52,"line":423},[50,534,322],{"class":111},[50,536,116],{"class":115},[50,538,539,541],{"class":52,"line":430},[50,540,330],{"class":111},[50,542,116],{"class":115},[50,544,545,547],{"class":52,"line":439},[50,546,338],{"class":115},[50,548,549],{"class":60},"compiled.txt\n",[50,551,552],{"class":52,"line":448},[50,553,246],{"emptyLinePlaceholder":245},[50,555,556,558],{"class":52,"line":455},[50,557,112],{"class":111},[50,559,116],{"class":115},[50,561,562,564,566],{"class":52,"line":462},[50,563,404],{"class":111},[50,565,125],{"class":115},[50,567,382],{"class":60},[50,569,571,573,575],{"class":52,"line":570},15,[50,572,122],{"class":111},[50,574,125],{"class":115},[50,576,577],{"class":60},"cat compiled.txt | grep -q 'Hello world'\n",[50,579,581],{"class":52,"line":580},16,[50,582,246],{"emptyLinePlaceholder":245},[50,584,586,588],{"class":52,"line":585},17,[50,587,251],{"class":111},[50,589,116],{"class":115},[50,591,593,595,597],{"class":52,"line":592},18,[50,594,404],{"class":111},[50,596,125],{"class":115},[50,598,389],{"class":60},[50,600,602,604,606],{"class":52,"line":601},19,[50,603,122],{"class":111},[50,605,125],{"class":115},[50,607,608],{"class":60},"cat compiled.txt | gzip > packaged.gz\n",[50,610,612,614],{"class":52,"line":611},20,[50,613,322],{"class":111},[50,615,116],{"class":115},[50,617,619,621],{"class":52,"line":618},21,[50,620,330],{"class":111},[50,622,116],{"class":115},[50,624,626,628],{"class":52,"line":625},22,[50,627,338],{"class":115},[50,629,341],{"class":60},[12,631,632],{},"それでは、アーティファクトを見てみましょう。",[12,634,635],{},[135,636],{"alt":637,"src":638},"不必要なアーティファクト","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399213/blog/Content%20Images/the-basics-of-gitlab-ci/clean-artifacts.png",[12,640,641,642,645],{},"この「コンパイル」ファイルを常にダウンロード可能にする必要はないようです。一時的なアーティファクトとして「20\n分」で保存期間切れとなるよう、",[47,643,644],{},"expire_in"," を設定します。",[40,647,649],{"className":102,"code":648,"language":104,"meta":45,"style":45},"compile:\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",[47,650,651,657,665,673,679,685,691],{"__ignoreMap":45},[50,652,653,655],{"class":52,"line":53},[50,654,511],{"class":111},[50,656,116],{"class":115},[50,658,659,661,663],{"class":52,"line":119},[50,660,404],{"class":111},[50,662,125],{"class":115},[50,664,490],{"class":60},[50,666,667,669,671],{"class":52,"line":184},[50,668,122],{"class":111},[50,670,125],{"class":115},[50,672,530],{"class":60},[50,674,675,677],{"class":52,"line":193},[50,676,322],{"class":111},[50,678,116],{"class":115},[50,680,681,683],{"class":52,"line":201},[50,682,330],{"class":111},[50,684,116],{"class":115},[50,686,687,689],{"class":52,"line":319},[50,688,338],{"class":115},[50,690,549],{"class":60},[50,692,693,696,698],{"class":52,"line":327},[50,694,695],{"class":111},"    expire_in",[50,697,125],{"class":115},[50,699,700],{"class":60},"20 minutes\n",[12,702,703],{},"構成ファイルは見たところ問題なさそうです。",[705,706,707,711,714],"ul",{},[708,709,710],"li",{},"アプリケーションをコンパイル、テスト、パッケージ化するために、3 つの連続したステージを作成しました。",[708,712,713],{},"コンパイル済みアプリを次のステージに渡すと、コンパイルを 2回実行する必要がなくなります(それにより実行が高速化されます)。",[708,715,716],{},"パッケージ化されたアプリケーションは、今後も使用できるようビルドアーティファクトとして保管します。",[89,718,720],{"id":719},"どのdockerイメージを使用するのか学ぶ","どのDockerイメージを使用するのか学ぶ",[12,722,723],{},"ここまでは順調です。しかし、CIビルドにはまだ時間がかかります。ログを見てみましょう。",[12,725,726],{},[135,727],{"alt":728,"src":729},"ruby3.1","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/ruby-31.png",[12,731,732],{},"ここに注目してください。Ruby 3.1とあります。",[12,734,735,736,741,742,747,754,755,762,763,768],{},"なぜ Ruby が必要なのかといえば、GitLab.com が ",[15,737,740],{"href":738,"rel":739},"https://about.gitlab.com/blog/shared-runners/",[],"ビルド実行 (英語版)"," に Docker\nイメージを使用しており、",[15,743,746],{"href":744,"rel":745},"https://docs.gitlab.com/ja-jp/user/gitlab_com/#shared-runners",[],"デフォルトで (英語版)",[15,748,751],{"href":749,"rel":750},"https://hub.docker.com/_/ruby/",[],[47,752,753],{},"ruby:3.1","\nイメージを使用するからです。間違いなく、このイメージには必要のないパッケージが多数含まれています。Google\nで検索して調べたところ、",[15,756,759],{"href":757,"rel":758},"https://hub.docker.com/_/alpine/",[],[47,760,761],{},"alpine"," というイメージがあり、ほとんど空の\n",[15,764,767],{"href":765,"rel":766},"https://about.gitlab.com/ja-jp/blog/what-is-linux/",[],"Linux ","イメージであることが分かりました。",[12,770,771,772,774,775,778],{},"それでは、",[47,773,98],{}," に  ",[47,776,777],{},"image: alpine"," を追加して、このイメージを使用したいと明示的に指定しましょう。",[12,780,781],{},"うまくいきました。パイプラインの実行が3 分ほど短縮できたようです。",[12,783,784],{},[135,785],{"alt":786,"src":787},"ビルド速度を短縮","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399214/blog/Content%20Images/the-basics-of-gitlab-ci/speed.png",[12,789,790],{},"パブリックイメージはたくさんあるようです。",[705,792,793,800,807,814],{},[708,794,795],{},[15,796,799],{"href":797,"rel":798},"https://hub.docker.com/_/mysql/",[],"mysql",[708,801,802],{},[15,803,806],{"href":804,"rel":805},"https://hub.docker.com/_/python/",[],"Python",[708,808,809],{},[15,810,813],{"href":811,"rel":812},"https://hub.docker.com/_/java/",[],"Java",[708,815,816],{},[15,817,820],{"href":818,"rel":819},"https://hub.docker.com/_/php/",[],"php",[12,822,823],{},"それにより、我々の技術スタックに適したものを選ぶことができます。不必要なソフトウェアが含まれていないイメージを指定することで、ダウンロード時間が最短で済みます。",[89,825,826],{"id":826},"複雑なシナリオに対応する",[12,828,829,830,833,834,837],{},"さて、ここで新しいクライアントが、アプリを ",[47,831,832],{},".gz"," ではなく、",[47,835,836],{},".iso"," イメージとしてパッケージ化してほしい、と希望しているとします。CI\nがすべての作業を行なってくれるため、コードにはジョブを 1 つ追加するだけです。ISO\nイメージはmkisofsコマンドを使用して作成できます。構成ファイルは次のようになります。",[40,839,841],{"className":102,"code":840,"language":104,"meta":45,"style":45},"image: alpine\nstages:\n  - compile\n  - test\n  - package\n\n# ... \"compile\" and \"test\" jobs are skipped here for the sake of compactness\n\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",[47,842,843,853,859,865,871,877,881,887,891,895,902,910,918,924,930,936,940,947,955,961,968,974,980],{"__ignoreMap":45},[50,844,845,848,850],{"class":52,"line":53},[50,846,847],{"class":111},"image",[50,849,125],{"class":115},[50,851,852],{"class":60},"alpine\n",[50,854,855,857],{"class":52,"line":119},[50,856,362],{"class":111},[50,858,116],{"class":115},[50,860,861,863],{"class":52,"line":184},[50,862,379],{"class":115},[50,864,490],{"class":60},[50,866,867,869],{"class":52,"line":193},[50,868,379],{"class":115},[50,870,382],{"class":60},[50,872,873,875],{"class":52,"line":201},[50,874,379],{"class":115},[50,876,389],{"class":60},[50,878,879],{"class":52,"line":319},[50,880,246],{"emptyLinePlaceholder":245},[50,882,883],{"class":52,"line":327},[50,884,886],{"class":885},"sAwPA","# ... \"compile\" and \"test\" jobs are skipped here for the sake of compactness\n",[50,888,889],{"class":52,"line":335},[50,890,246],{"emptyLinePlaceholder":245},[50,892,893],{"class":52,"line":423},[50,894,246],{"emptyLinePlaceholder":245},[50,896,897,900],{"class":52,"line":430},[50,898,899],{"class":111},"pack-gz",[50,901,116],{"class":115},[50,903,904,906,908],{"class":52,"line":439},[50,905,404],{"class":111},[50,907,125],{"class":115},[50,909,389],{"class":60},[50,911,912,914,916],{"class":52,"line":448},[50,913,122],{"class":111},[50,915,125],{"class":115},[50,917,608],{"class":60},[50,919,920,922],{"class":52,"line":455},[50,921,322],{"class":111},[50,923,116],{"class":115},[50,925,926,928],{"class":52,"line":462},[50,927,330],{"class":111},[50,929,116],{"class":115},[50,931,932,934],{"class":52,"line":570},[50,933,338],{"class":115},[50,935,341],{"class":60},[50,937,938],{"class":52,"line":580},[50,939,246],{"emptyLinePlaceholder":245},[50,941,942,945],{"class":52,"line":585},[50,943,944],{"class":111},"pack-iso",[50,946,116],{"class":115},[50,948,949,951,953],{"class":52,"line":592},[50,950,404],{"class":111},[50,952,125],{"class":115},[50,954,389],{"class":60},[50,956,957,959],{"class":52,"line":601},[50,958,122],{"class":111},[50,960,116],{"class":115},[50,962,963,965],{"class":52,"line":611},[50,964,379],{"class":115},[50,966,967],{"class":60},"mkisofs -o ./packaged.iso ./compiled.txt\n",[50,969,970,972],{"class":52,"line":618},[50,971,322],{"class":111},[50,973,116],{"class":115},[50,975,976,978],{"class":52,"line":625},[50,977,330],{"class":111},[50,979,116],{"class":115},[50,981,983,985],{"class":52,"line":982},23,[50,984,338],{"class":115},[50,986,987],{"class":60},"packaged.iso\n",[12,989,990],{},"ジョブ名は同じにする必要はありません。ジョブ名が同じだと、ソフトウェア開発プロセスの同じステージでジョブを並列実行できません。そのため、ジョブやステージの名前が同じになるのは、偶然のことだと考えてください。",[12,992,993],{},"さて、ビルドは失敗しました。",[12,995,996],{},[135,997],{"alt":998,"src":999},"mkisofs\nが欠落しているために失敗したビルド","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399214/blog/Content%20Images/the-basics-of-gitlab-ci/mkisofs.png",[12,1001,1002,1005,1006,1008],{},[47,1003,1004],{},"mkisofs"," が ",[47,1007,761],{}," イメージに含まれていないことが原因です。まずはこのパッケージをインストールする必要があります。",[89,1010,1011],{"id":1011},"欠落しているソフトウェアやパッケージの対応",[12,1013,1014,1019,1020,1022,1023,1026,1027,1030],{},[15,1015,1018],{"href":1016,"rel":1017},"https://pkgs.alpinelinux.org/contents?file=mkisofs&path=&name=&branch=edge&repo=&arch=",[],"Alpine Linux Web サイト (英語版)","\nによると、",[47,1021,1004],{}," は ",[47,1024,1025],{},"xorriso","パッケージと ",[47,1028,1029],{},"cdrkit","\nパッケージの一部です。次のコマンドを実行することでパッケージをインストールできます。",[40,1032,1034],{"className":42,"code":1033,"language":44,"meta":45,"style":45},"echo \"ipv6\" >> /etc/modules  # enable networking\n\napk update                   # update packages list\n\napk add xorriso              # install package\n",[47,1035,1036,1053,1057,1068,1072],{"__ignoreMap":45},[50,1037,1038,1041,1044,1047,1050],{"class":52,"line":53},[50,1039,1040],{"class":74},"echo",[50,1042,1043],{"class":60}," \"ipv6\"",[50,1045,1046],{"class":67}," >>",[50,1048,1049],{"class":60}," /etc/modules",[50,1051,1052],{"class":885},"  # enable networking\n",[50,1054,1055],{"class":52,"line":119},[50,1056,246],{"emptyLinePlaceholder":245},[50,1058,1059,1062,1065],{"class":52,"line":184},[50,1060,1061],{"class":56},"apk",[50,1063,1064],{"class":60}," update",[50,1066,1067],{"class":885},"                   # update packages list\n",[50,1069,1070],{"class":52,"line":193},[50,1071,246],{"emptyLinePlaceholder":245},[50,1073,1074,1076,1079,1082],{"class":52,"line":201},[50,1075,1061],{"class":56},[50,1077,1078],{"class":60}," add",[50,1080,1081],{"class":60}," xorriso",[50,1083,1084],{"class":885},"              # install package\n",[12,1086,1087,1088,1090],{},"CI ではこれらは他のコマンドと何ら変わりません。",[47,1089,204],{}," セクションで実行する必要があるコマンドの全リストは、このようになります。",[40,1092,1096],{"className":1093,"code":1094,"language":1095,"meta":45,"style":45},"language-yml shiki shiki-themes github-light","script:\n\n- echo \"ipv6\" >> /etc/modules\n\n- apk update\n\n- apk add xorriso\n\n- mkisofs -o ./packaged.iso ./compiled.txt\n","yml",[47,1097,1098,1104,1108,1116,1120,1127,1131,1138,1142],{"__ignoreMap":45},[50,1099,1100,1102],{"class":52,"line":53},[50,1101,204],{"class":111},[50,1103,116],{"class":115},[50,1105,1106],{"class":52,"line":119},[50,1107,246],{"emptyLinePlaceholder":245},[50,1109,1110,1113],{"class":52,"line":184},[50,1111,1112],{"class":115},"- ",[50,1114,1115],{"class":60},"echo \"ipv6\" >> /etc/modules\n",[50,1117,1118],{"class":52,"line":193},[50,1119,246],{"emptyLinePlaceholder":245},[50,1121,1122,1124],{"class":52,"line":201},[50,1123,1112],{"class":115},[50,1125,1126],{"class":60},"apk update\n",[50,1128,1129],{"class":52,"line":319},[50,1130,246],{"emptyLinePlaceholder":245},[50,1132,1133,1135],{"class":52,"line":327},[50,1134,1112],{"class":115},[50,1136,1137],{"class":60},"apk add xorriso\n",[50,1139,1140],{"class":52,"line":335},[50,1141,246],{"emptyLinePlaceholder":245},[50,1143,1144,1146],{"class":52,"line":423},[50,1145,1112],{"class":115},[50,1147,967],{"class":60},[12,1149,1150,1151,1153,1154,1156],{},"構文的に正しくするため、パッケージのインストールに関連したコマンドは ",[47,1152,179],{}," 内に置きましょう。",[47,1155,179],{},"\nを構成の最上位レベルで使うと、そのコマンドがすべてのジョブの前に実行されることに留意してください。今回は特定のジョブの前で実行させます。",[89,1158,1160],{"id":1159},"dag有向非巡回グラフより高速で柔軟なパイプラインのために","DAG（有向非巡回グラフ）：より高速で柔軟なパイプラインのために",[12,1162,1163],{},"ステージを定義して、テストに合格した場合にのみパッケージジョブを実行するようにしました。後のステージに定義されているジョブに対し、いくつかのジョブのステージ順序を並び替えて先に実行させたい場合はどうすればいいでしょうか。場合によっては、従来のステージ順序がパイプライン全体の実行時間を遅くしてしまう可能性があります。",[12,1165,1166],{},"テストステージに、実行に時間のかかる負荷の高いテストがいくつか含まれており、それらのテストが必ずしもパッケージジョブに関連していないとします。この場合、テストの完了を待たずにパッケージジョブを開始できれば、より効率的になります。それにはDAG (有向非巡回グラフ) が役立ちます。特定のジョブのステージ順序を変えるためには、ジョブの依存関係 (通常のステージの順序をスキップするもの)\nを定義します。",[12,1168,1169,1170,1173],{},"GitLab には、ジョブ間の依存関係を作成する特殊キーワード ",[47,1171,1172],{},"needs","\nがあります。これを使うことで、依存しているジョブが完了するとすぐにジョブを前倒しで実行できるようになります。",[12,1175,1176],{},"次の例では、テストジョブが完了するとすぐにパックジョブが実行を開始します。そのため、将来誰かがテストをテストステージに追加した場合に、新しいテストジョブの完了を待たずにパッケージジョブが実行を開始します。",[40,1178,1180],{"className":102,"code":1179,"language":104,"meta":45,"style":45},"pack-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",[47,1181,1182,1188,1196,1204,1218,1224,1230,1236,1240,1246,1254,1261,1267,1273,1279,1285,1291,1301,1307,1313],{"__ignoreMap":45},[50,1183,1184,1186],{"class":52,"line":53},[50,1185,899],{"class":111},[50,1187,116],{"class":115},[50,1189,1190,1192,1194],{"class":52,"line":119},[50,1191,404],{"class":111},[50,1193,125],{"class":115},[50,1195,389],{"class":60},[50,1197,1198,1200,1202],{"class":52,"line":184},[50,1199,122],{"class":111},[50,1201,125],{"class":115},[50,1203,608],{"class":60},[50,1205,1206,1209,1212,1215],{"class":52,"line":193},[50,1207,1208],{"class":111},"  needs",[50,1210,1211],{"class":115},": [",[50,1213,1214],{"class":60},"\"test\"",[50,1216,1217],{"class":115},"]\n",[50,1219,1220,1222],{"class":52,"line":201},[50,1221,322],{"class":111},[50,1223,116],{"class":115},[50,1225,1226,1228],{"class":52,"line":319},[50,1227,330],{"class":111},[50,1229,116],{"class":115},[50,1231,1232,1234],{"class":52,"line":327},[50,1233,338],{"class":115},[50,1235,341],{"class":60},[50,1237,1238],{"class":52,"line":335},[50,1239,246],{"emptyLinePlaceholder":245},[50,1241,1242,1244],{"class":52,"line":423},[50,1243,944],{"class":111},[50,1245,116],{"class":115},[50,1247,1248,1250,1252],{"class":52,"line":430},[50,1249,404],{"class":111},[50,1251,125],{"class":115},[50,1253,389],{"class":60},[50,1255,1256,1259],{"class":52,"line":439},[50,1257,1258],{"class":111},"  before_script",[50,1260,116],{"class":115},[50,1262,1263,1265],{"class":52,"line":448},[50,1264,379],{"class":115},[50,1266,1115],{"class":60},[50,1268,1269,1271],{"class":52,"line":455},[50,1270,379],{"class":115},[50,1272,1126],{"class":60},[50,1274,1275,1277],{"class":52,"line":462},[50,1276,379],{"class":115},[50,1278,1137],{"class":60},[50,1280,1281,1283],{"class":52,"line":570},[50,1282,122],{"class":111},[50,1284,116],{"class":115},[50,1286,1287,1289],{"class":52,"line":580},[50,1288,379],{"class":115},[50,1290,967],{"class":60},[50,1292,1293,1295,1297,1299],{"class":52,"line":585},[50,1294,1208],{"class":111},[50,1296,1211],{"class":115},[50,1298,1214],{"class":60},[50,1300,1217],{"class":115},[50,1302,1303,1305],{"class":52,"line":592},[50,1304,322],{"class":111},[50,1306,116],{"class":115},[50,1308,1309,1311],{"class":52,"line":601},[50,1310,330],{"class":111},[50,1312,116],{"class":115},[50,1314,1315,1317],{"class":52,"line":611},[50,1316,338],{"class":115},[50,1318,987],{"class":60},[12,1320,1321,1323],{},[47,1322,98],{}," の最終バージョン:",[40,1325,1327],{"className":102,"code":1326,"language":104,"meta":45,"style":45},"image: 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",[47,1328,1329,1337,1341,1347,1353,1359,1365,1369,1375,1383,1389,1396,1402,1410,1416,1422,1428,1436,1440,1446,1454,1462,1466,1472,1481,1490,1501,1508,1515,1522,1527,1534,1543,1550,1557,1564,1571,1578,1585,1596,1603,1610],{"__ignoreMap":45},[50,1330,1331,1333,1335],{"class":52,"line":53},[50,1332,847],{"class":111},[50,1334,125],{"class":115},[50,1336,852],{"class":60},[50,1338,1339],{"class":52,"line":119},[50,1340,246],{"emptyLinePlaceholder":245},[50,1342,1343,1345],{"class":52,"line":184},[50,1344,362],{"class":111},[50,1346,116],{"class":115},[50,1348,1349,1351],{"class":52,"line":193},[50,1350,379],{"class":115},[50,1352,490],{"class":60},[50,1354,1355,1357],{"class":52,"line":201},[50,1356,379],{"class":115},[50,1358,382],{"class":60},[50,1360,1361,1363],{"class":52,"line":319},[50,1362,379],{"class":115},[50,1364,389],{"class":60},[50,1366,1367],{"class":52,"line":327},[50,1368,246],{"emptyLinePlaceholder":245},[50,1370,1371,1373],{"class":52,"line":335},[50,1372,511],{"class":111},[50,1374,116],{"class":115},[50,1376,1377,1379,1381],{"class":52,"line":423},[50,1378,404],{"class":111},[50,1380,125],{"class":115},[50,1382,490],{"class":60},[50,1384,1385,1387],{"class":52,"line":430},[50,1386,1258],{"class":111},[50,1388,116],{"class":115},[50,1390,1391,1393],{"class":52,"line":439},[50,1392,187],{"class":115},[50,1394,1395],{"class":60},"echo \"Hello  \" | tr -d \"\\n\" > file1.txt\n",[50,1397,1398,1400],{"class":52,"line":448},[50,1399,187],{"class":115},[50,1401,198],{"class":60},[50,1403,1404,1406,1408],{"class":52,"line":455},[50,1405,122],{"class":111},[50,1407,125],{"class":115},[50,1409,530],{"class":60},[50,1411,1412,1414],{"class":52,"line":462},[50,1413,322],{"class":111},[50,1415,116],{"class":115},[50,1417,1418,1420],{"class":52,"line":570},[50,1419,330],{"class":111},[50,1421,116],{"class":115},[50,1423,1424,1426],{"class":52,"line":580},[50,1425,338],{"class":115},[50,1427,549],{"class":60},[50,1429,1430,1432,1434],{"class":52,"line":585},[50,1431,695],{"class":111},[50,1433,125],{"class":115},[50,1435,700],{"class":60},[50,1437,1438],{"class":52,"line":592},[50,1439,246],{"emptyLinePlaceholder":245},[50,1441,1442,1444],{"class":52,"line":601},[50,1443,112],{"class":111},[50,1445,116],{"class":115},[50,1447,1448,1450,1452],{"class":52,"line":611},[50,1449,404],{"class":111},[50,1451,125],{"class":115},[50,1453,382],{"class":60},[50,1455,1456,1458,1460],{"class":52,"line":618},[50,1457,122],{"class":111},[50,1459,125],{"class":115},[50,1461,577],{"class":60},[50,1463,1464],{"class":52,"line":625},[50,1465,246],{"emptyLinePlaceholder":245},[50,1467,1468,1470],{"class":52,"line":982},[50,1469,899],{"class":111},[50,1471,116],{"class":115},[50,1473,1475,1477,1479],{"class":52,"line":1474},24,[50,1476,404],{"class":111},[50,1478,125],{"class":115},[50,1480,389],{"class":60},[50,1482,1484,1486,1488],{"class":52,"line":1483},25,[50,1485,122],{"class":111},[50,1487,125],{"class":115},[50,1489,608],{"class":60},[50,1491,1493,1495,1497,1499],{"class":52,"line":1492},26,[50,1494,1208],{"class":111},[50,1496,1211],{"class":115},[50,1498,1214],{"class":60},[50,1500,1217],{"class":115},[50,1502,1504,1506],{"class":52,"line":1503},27,[50,1505,322],{"class":111},[50,1507,116],{"class":115},[50,1509,1511,1513],{"class":52,"line":1510},28,[50,1512,330],{"class":111},[50,1514,116],{"class":115},[50,1516,1518,1520],{"class":52,"line":1517},29,[50,1519,338],{"class":115},[50,1521,341],{"class":60},[50,1523,1525],{"class":52,"line":1524},30,[50,1526,246],{"emptyLinePlaceholder":245},[50,1528,1530,1532],{"class":52,"line":1529},31,[50,1531,944],{"class":111},[50,1533,116],{"class":115},[50,1535,1537,1539,1541],{"class":52,"line":1536},32,[50,1538,404],{"class":111},[50,1540,125],{"class":115},[50,1542,389],{"class":60},[50,1544,1546,1548],{"class":52,"line":1545},33,[50,1547,1258],{"class":111},[50,1549,116],{"class":115},[50,1551,1553,1555],{"class":52,"line":1552},34,[50,1554,379],{"class":115},[50,1556,1115],{"class":60},[50,1558,1560,1562],{"class":52,"line":1559},35,[50,1561,379],{"class":115},[50,1563,1126],{"class":60},[50,1565,1567,1569],{"class":52,"line":1566},36,[50,1568,379],{"class":115},[50,1570,1137],{"class":60},[50,1572,1574,1576],{"class":52,"line":1573},37,[50,1575,122],{"class":111},[50,1577,116],{"class":115},[50,1579,1581,1583],{"class":52,"line":1580},38,[50,1582,379],{"class":115},[50,1584,967],{"class":60},[50,1586,1588,1590,1592,1594],{"class":52,"line":1587},39,[50,1589,1208],{"class":111},[50,1591,1211],{"class":115},[50,1593,1214],{"class":60},[50,1595,1217],{"class":115},[50,1597,1599,1601],{"class":52,"line":1598},40,[50,1600,322],{"class":111},[50,1602,116],{"class":115},[50,1604,1606,1608],{"class":52,"line":1605},41,[50,1607,330],{"class":111},[50,1609,116],{"class":115},[50,1611,1613,1615],{"class":52,"line":1612},42,[50,1614,338],{"class":115},[50,1616,987],{"class":60},[12,1618,1619,1620,1622,1623,1625,1626,1628],{},"パイプラインが作成できました！ステージは 3 つの連続したステージで、ジョブ ",[47,1621,899],{}," と ",[47,1624,944],{}," が、",[47,1627,251],{},"\nステージ内で並列実行されています。",[12,1630,1631],{},[135,1632],{"alt":1633,"src":1634},"パイプラインのイラスト","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782399214/blog/Content%20Images/the-basics-of-gitlab-ci/pipeline.png",[89,1636,1637],{"id":1637},"高度なパイプラインの構築",[12,1639,1640],{},"ここからは、高度なパイプラインを構築する方法を説明します。",[1642,1643,1645],"h3",{"id":1644},"ciパイプラインに自動テストを実装","CIパイプラインに自動テストを実装",[12,1647,1648,1653],{},[15,1649,1652],{"href":1650,"rel":1651},"https://about.gitlab.com/ja-jp/",[],"DevOps","\nにおいて、ソフトウェア開発戦略の重要なルールは、素晴らしいユーザーエクスペリエンスを備えた優れたアプリを作成する、というものです。ここでは、CI\nパイプラインにいくつかのテストを追加し、プロセス全体の早い段階でバグを検出、修正しましょう。この方法なら、問題が大きくなる前や新しいプロジェクトに移る前に問題を修正できます。",[12,1655,1656,1657,1662],{},"GitLabにはさまざまな ",[15,1658,1661],{"href":1659,"rel":1660},"https://docs.gitlab.com/ja-jp/ci/testing/",[],"テスト","\n用にすぐ使えるテンプレートがあり、これらを使用することで作業が簡単になります。必要な手順は、CI の構成にテンプレートを追加するだけです。",[12,1664,1665,1666,1671],{},"この例では、",[15,1667,1670],{"href":1668,"rel":1669},"https://docs.gitlab.com/ja-jp/ci/testing/accessibility_testing/",[],"アクセシビリティテスト (英語版)","\nを追加します。",[40,1673,1675],{"className":102,"code":1674,"language":104,"meta":45,"style":45},"stages:\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",[47,1676,1677,1683,1690,1694,1701,1711,1715,1722],{"__ignoreMap":45},[50,1678,1679,1681],{"class":52,"line":53},[50,1680,362],{"class":111},[50,1682,116],{"class":115},[50,1684,1685,1687],{"class":52,"line":119},[50,1686,379],{"class":115},[50,1688,1689],{"class":60},"accessibility\n",[50,1691,1692],{"class":52,"line":184},[50,1693,246],{"emptyLinePlaceholder":245},[50,1695,1696,1699],{"class":52,"line":193},[50,1697,1698],{"class":111},"variables",[50,1700,116],{"class":115},[50,1702,1703,1706,1708],{"class":52,"line":201},[50,1704,1705],{"class":111},"  a11y_urls",[50,1707,125],{"class":115},[50,1709,1710],{"class":60},"\"https://about.gitlab.com https://www.example.com\"\n",[50,1712,1713],{"class":52,"line":319},[50,1714,246],{"emptyLinePlaceholder":245},[50,1716,1717,1720],{"class":52,"line":327},[50,1718,1719],{"class":111},"include",[50,1721,116],{"class":115},[50,1723,1724,1726,1729,1731],{"class":52,"line":335},[50,1725,379],{"class":115},[50,1727,1728],{"class":111},"template",[50,1730,125],{"class":115},[50,1732,1733],{"class":60},"\"Verify/Accessibility.gitlab-ci.yml\"\n",[12,1735,1736,1739,1740,1622,1745,1750],{},[47,1737,1738],{},"a11y_urls"," 変数をカスタム化し、Web ページの URL を挿入して、",[15,1741,1744],{"href":1742,"rel":1743},"https://pa11y.org/",[],"Pa11y",[15,1746,1749],{"href":1747,"rel":1748},"https://docs.gitlab.com/ja-jp/ci/testing/code_quality/",[],"コード品質"," のテストを行います。",[40,1752,1754],{"className":102,"code":1753,"language":104,"meta":45,"style":45},"    include:\n    - template: Jobs/Code-Quality.gitlab-ci.yml\n",[47,1755,1756,1763],{"__ignoreMap":45},[50,1757,1758,1761],{"class":52,"line":53},[50,1759,1760],{"class":111},"    include",[50,1762,116],{"class":115},[50,1764,1765,1767,1769,1771],{"class":52,"line":119},[50,1766,338],{"class":115},[50,1768,1728],{"class":111},[50,1770,125],{"class":115},[50,1772,1773],{"class":60},"Jobs/Code-Quality.gitlab-ci.yml\n",[12,1775,1776],{},"GitLab\nを使うと、マージリクエストのウィジェットエリア内でテストレポートを簡単に確認できます。コードレビュー、パイプラインステータス、テスト結果を一か所にまとめることで、あらゆることがよりスムーズに効率よくできるようになります。",[12,1778,1779],{},[135,1780],{"alt":1781,"src":1782},"アクセシビリティレポート","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_10.56.41.png",[1784,1785,1786],"center",{},[1787,1788,1789],"i",{},"アクセシビリティ・マージリクエスト・ウィジェット",[12,1791,1792],{},[135,1793],{"alt":1794,"src":1795},"MR\n内のコード品質ウィジェット","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_11.00.25.png",[1784,1797,1798],{},[1787,1799,1800],{},"コード品質マージリクエストウィジェット",[1642,1802,1803],{"id":1803},"マトリックスビルド",[12,1805,1806,1807,1812],{},"場合によっては、異なる構成、OS\nバージョン、プログラミング言語バージョンなどでアプリをテストする必要があります。そのような場合には、",[15,1808,1811],{"href":1809,"rel":1810},"https://docs.gitlab.com/ja-jp/ci/yaml/#parallelmatrix",[],"parallel:matrix (英語版)"," ビルドを使って、1\nつのジョブ構成でさまざまな組み合わせでアプリケーションを並列にテストします。このブログでは、マトリックスキーワードを使用して、異なるバージョンの\nPython でコードのテストを行います。",[40,1814,1816],{"className":102,"code":1815,"language":104,"meta":45,"style":45},"python-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",[47,1817,1818,1825,1835,1844,1850,1857,1864,1871,1878,1885],{"__ignoreMap":45},[50,1819,1820,1823],{"class":52,"line":53},[50,1821,1822],{"class":111},"python-req",[50,1824,116],{"class":115},[50,1826,1827,1830,1832],{"class":52,"line":119},[50,1828,1829],{"class":111},"  image",[50,1831,125],{"class":115},[50,1833,1834],{"class":60},"python:$VERSION\n",[50,1836,1837,1839,1841],{"class":52,"line":184},[50,1838,404],{"class":111},[50,1840,125],{"class":115},[50,1842,1843],{"class":60},"lint\n",[50,1845,1846,1848],{"class":52,"line":193},[50,1847,122],{"class":111},[50,1849,116],{"class":115},[50,1851,1852,1854],{"class":52,"line":201},[50,1853,338],{"class":115},[50,1855,1856],{"class":60},"pip install -r requirements_dev.txt\n",[50,1858,1859,1861],{"class":52,"line":319},[50,1860,338],{"class":115},[50,1862,1863],{"class":60},"chmod +x ./build_cpp.sh\n",[50,1865,1866,1868],{"class":52,"line":327},[50,1867,338],{"class":115},[50,1869,1870],{"class":60},"./build_cpp.sh\n",[50,1872,1873,1876],{"class":52,"line":335},[50,1874,1875],{"class":111},"  parallel",[50,1877,116],{"class":115},[50,1879,1880,1883],{"class":52,"line":423},[50,1881,1882],{"class":111},"    matrix",[50,1884,116],{"class":115},[50,1886,1887,1889,1892,1894,1897,1900,1903,1905,1908,1910,1913,1916],{"class":52,"line":430},[50,1888,187],{"class":115},[50,1890,1891],{"class":111},"VERSION",[50,1893,1211],{"class":115},[50,1895,1896],{"class":60},"'3.8'",[50,1898,1899],{"class":115},", ",[50,1901,1902],{"class":60},"'3.9'",[50,1904,1899],{"class":115},[50,1906,1907],{"class":60},"'3.10'",[50,1909,1899],{"class":115},[50,1911,1912],{"class":60},"'3.11'",[50,1914,1915],{"class":115},"]   ",[50,1917,1918],{"class":885},"# https://hub.docker.com/_/python\n",[12,1920,1921],{},"パイプライン実行中、このジョブは 4 通りの方法で並列実行されます。それぞれ以下のように異なる Python イメージを使用します。",[12,1923,1924],{},[135,1925],{"alt":1926,"src":1927},"実行中のマトリックスジョブ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-02_at_11.12.48.png",[1642,1929,1930],{"id":1930},"ユニットテスト",[1932,1933,1934],"h4",{"id":1934},"ユニットテストとは",[12,1936,1937],{},"ユニットテストとは、ソフトウェアの個々のコンポーネントや機能が期待通りに機能するかを確認する、対象を絞った単体テストです。ユニットテストは、ソフトウェア開発プロセスの早い段階でバグを検出して修正し、コードのそれぞれの部分が、独立した状態でも正しく機能することを確認するために必須です。",[12,1939,1940],{},"例: 計算機アプリを開発しているとします。加算関数のユニットテストでは、2 + 2 が 4\nになるかどうかを確認します。このテストに合格すれば、加算関数が正しく機能していることが確認されます。",[1932,1942,1943],{"id":1943},"ユニットテストのベストプラクティス",[12,1945,1946],{},"テストに失敗すると、パイプラインは失敗し、ユーザーに通知が送られます。デベロッパーはジョブのログ (通常何千行もある)\nを確認し、どこでテストに失敗したのかを特定し、修正します。このチェックには時間がかかり、効率がよくありません。",[12,1948,1949,1950,1955],{},"そこで、",[15,1951,1954],{"href":1952,"rel":1953},"https://docs.gitlab.com/ja-jp/ci/testing/unit_test_reports/",[],"ユニットテストレポート (英語版)","\nを使うようにジョブを構成することができます。GitLab\nはマージリクエストとパイプラインの詳細ページ上にレポートを表示することができるため、ログ全体を確認しなくてもエラーをより簡単に素早く特定できます。",[1957,1958,1960],"h5",{"id":1959},"junitテストレポート","JUnitテストレポート",[12,1962,1963],{},"以下はJUnit テストレポートの例です。",[12,1965,1966,1970],{},[135,1967],{"alt":1968,"src":1969},"パイプラインの JUnit テストレポート v13 10","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674097/Blog/Content%20Images/pipelines_junit_test_report_v13_10.png","{:\n.shadow.center}",[1642,1972,1973],{"id":1973},"統合テストおよびエンドツーエンドテスト戦略",[12,1975,1976,1977,1982],{},"通常の開発ルーチンに加え、統合テストとエンドツーエンドテスト専用に指定したパイプラインをセットアップすることが非常に重要です。これらのテストでは、",[15,1978,1981],{"href":1979,"rel":1980},"https://about.gitlab.com/ja-jp/topics/microservices/",[],"マイクロサービス (英語版)","、UI\nテスト、それ他のコンポーネントを含んだ、コードの異なる部位の連携がスムーズかどうかをチェックします。",[12,1984,1985,1986,1991,1992,1997],{},"これらのテストは ",[15,1987,1990],{"href":1988,"rel":1989},"https://docs.gitlab.com/ja-jp/ci/pipelines/schedules/",[],"毎晩 (英語版)","\n実行されます。",[15,1993,1996],{"href":1994,"rel":1995},"https://docs.gitlab.com/ja-jp/user/project/integrations/gitlab_slack_application/#notification-events",[],"テスト結果を自動的に指定のスラックチャンネルに送るよう (英語版)","\nに設定することもできます。そうすることで、デベロッパーが翌日出社したときに迅速に問題を確認できます。こうした機能はすべて、問題を早期に特定して修正することを優先すべく設計されています。",[1642,1999,2000],{"id":2000},"テスト環境",[12,2002,2003,2004,2009],{},"テストの中には、アプリをしっかりテストするために、テスト環境を構築しなければならない場合があります。GitLab CI/CD\nを使用するとテスト環境のデプロイが自動化でき、時間を大幅に節約できます。本ブログは主に CI\nに着目したものとなっているため、詳細には触れません。アプリのデプロイとリリースについては、",[15,2005,2008],{"href":2006,"rel":2007},"https://docs.gitlab.com/ja-jp/topics/release_your_application/",[],"GitLab ドキュメントのこのセクション (英語版)","\nを参照してください。",[89,2011,2013],{"id":2012},"ci-パイプラインへのセキュリティスキャンの実装","CI パイプラインへのセキュリティスキャンの実装",[12,2015,2016],{},"CI パイプラインにセキュリティスキャンを実装する方法は次のとおりです。",[1642,2018,2020],{"id":2019},"sastおよびdastインテグレーション","SASTおよびDASTインテグレーション",[12,2022,2023,2024,2029,2030,2035],{},"コードの安全性を守ることは非常に重要であり、最新の変更に脆弱性がある場合は、その内容を直ちに把握したいと考えます。したがって、パイプラインにセキュリティスキャンを追加するのが最適な対応といえるでしょう。セキュリティスキャンは、コミットごとにコードをチェックし、リスクがあれば警告してくれます。CI\nパイプラインに静的アプリケーションセキュリティテスト (",[15,2025,2028],{"href":2026,"rel":2027},"https://docs.gitlab.com/ja-jp/user/application_security/sast/",[],"SAST (英語版)",")\nや動的アプリケーションセキュリティテスト (",[15,2031,2034],{"href":2032,"rel":2033},"https://docs.gitlab.com/ja-jp/user/application_security/dast/",[],"DAST (英語版)",")\nなどの各種スキャンを追加する方法を説明する以下のナビゲーションをご確認ください。",[12,2037,2038,2039,2042,2043],{},"ナビゲーションを開始するには、以下の画像を",[157,2040,2041],{},"クリック","してください。 ",[15,2044,2047],{"href":2045,"rel":2046},"https://gitlab.navattic.com/gitlab-scans",[],[135,2048],{"alt":2049,"src":2050},"スキャンの製品ツアー","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-14_at_13.44.42.png",[12,2052,2053],{},"さらに、AI を活用すれば、脆弱性をさらに深く掘り下げ、修正方法の提案が得られます。詳しくは以下のナビゲーションをご確認ください。",[12,2055,2056,2057],{},"ナビゲーションを開始するには、以下の画像をクリックしてください。 ",[15,2058,2061],{"href":2059,"rel":2060},"https://tech-marketing.gitlab.io/static-demos/pt-explain-vulnerability.html",[],[135,2062],{"alt":2063,"src":2064},"製品ツアーでの脆弱性の説明","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674096/Blog/Content%20Images/Screenshot_2024-04-14_at_13.50.24.png",[89,2066,2068],{"id":2067},"gitlab-ci使い方まとめ","GitLab CI使い方まとめ",[12,2070,2071],{},"まだまだお伝えしたいことはありますが、ここで一度終わりにしましょう。説明に使用した例はすべて意図的に単純なものにしました。これは、慣れない技術スタックの説明が続くことで内容が頭に入らないといった状況を避け、GitLab\nCIのコンセプトを理解してもらうためです。では、ここまで学んできたことを次にまとめます。",[2073,2074,2075,2087,2090,2093,2096,2099],"ol",{},[708,2076,2077,2078,2080,2081,2086],{},"GitLab CI に作業をまかせるには、",[47,2079,98],{}," 内で 1 つ以上の",[15,2082,2085],{"href":2083,"rel":2084},"https://docs.gitlab.com/ja-jp/ci/jobs/",[],"ジョブ\n(英語版)","を定義する必要があります。",[708,2088,2089],{},"ジョブには名前を付ける必要がありますが、その際は適切な名前を付けるようにしてください。",[708,2091,2092],{},"それぞれのジョブには、指定のキーワードで定義された、 GitLab CI 用の一連のルールと指示が含まれます。",[708,2094,2095],{},"ジョブは、順序どおりに、並列に、または DAG\n(英語版)\nを使って順不同で実行できます。",[708,2097,2098],{},"ジョブ間ではファイルを渡してビルドアーティファクトに保存し、インターフェイスからダウンロードできるようにすることも可能です。",[708,2100,2101,2102,2107],{},"CI パイプラインに ",[15,2103,2106],{"href":2104,"rel":2105},"https://docs.gitlab.com/ja-jp/development/integrations/secure/",[],"テストとセキュリティスキャン\n(英語版)","\nを追加して、開発中のアプリの品質とセキュリティを確保します。",[12,2109,2110],{},"本記事で使用した用語およびキーワードの説明と、関連するドキュメントのリンクを下表にまとめました。",[1642,2112,2113],{"id":2113},"キーワードの説明とドキュメント",[12,2115,2116],{},"{: #keywords}",[2118,2119,2120,2133],"table",{},[2121,2122,2123],"thead",{},[2124,2125,2126,2130],"tr",{},[2127,2128,2129],"th",{},"キーワード/用語",[2127,2131,2132],{},"説明",[2134,2135,2136,2148,2159,2170,2181,2192,2203,2215,2226],"tbody",{},[2124,2137,2138,2145],{},[2139,2140,2141],"td",{},[15,2142,98],{"href":2143,"rel":2144},"https://docs.gitlab.com/ja-jp/ci/yaml/",[],[2139,2146,2147],{},"プロジェクトのビルド方法の定義をすべて含むファイル",[2124,2149,2150,2156],{},[2139,2151,2152],{},[15,2153,204],{"href":2154,"rel":2155},"https://docs.gitlab.com/ja-jp/ci/yaml/#script",[],[2139,2157,2158],{},"実行するシェルスクリプトを定義する",[2124,2160,2161,2167],{},[2139,2162,2163],{},[15,2164,179],{"href":2165,"rel":2166},"https://docs.gitlab.com/ja-jp/ci/yaml/#before_script",[],[2139,2168,2169],{},"(全)ジョブの前に実行するコマンドを定義するために使用する",[2124,2171,2172,2178],{},[2139,2173,2174],{},[15,2175,847],{"href":2176,"rel":2177},"https://docs.gitlab.com/ja-jp/ci/docker/using_docker_images/#what-is-image",[],[2139,2179,2180],{},"使用するDocker イメージを定義する",[2124,2182,2183,2189],{},[2139,2184,2185],{},[15,2186,362],{"href":2187,"rel":2188},"https://docs.gitlab.com/ja-jp/ci/yaml/#stages",[],[2139,2190,2191],{},"パイプラインのステージを定義する (デフォルトは test)",[2124,2193,2194,2200],{},[2139,2195,2196],{},[15,2197,277],{"href":2198,"rel":2199},"https://docs.gitlab.com/ja-jp/ci/yaml/#artifacts",[],[2139,2201,2202],{},"ビルドアーティファクトのリストを定義する",[2124,2204,2205,2212],{},[2139,2206,2207],{},[15,2208,2211],{"href":2209,"rel":2210},"https://docs.gitlab.com/ja-jp/ci/yaml/#artifactsexpire_in",[],"artifacts:expire_in",[2139,2213,2214],{},"指定時間後にアップロードしたアーティファクトを削除するために使用する",[2124,2216,2217,2223],{},[2139,2218,2219],{},[15,2220,1172],{"href":2221,"rel":2222},"https://docs.gitlab.com/ja-jp/ci/yaml/#needs",[],[2139,2224,2225],{},"ジョブ間の依存関係を定義するときに使用し、ジョブを特定の順序で実行することを可能にする",[2124,2227,2228,2235],{},[2139,2229,2230],{},[15,2231,2234],{"href":2232,"rel":2233},"https://about.gitlab.com/topics/ci-cd/cicd-pipeline/",[],"pipelines",[2139,2236,2237],{},"いくつかのステージ (バッチ) で実行されるビルドのグループを指す",[12,2239,2240],{},"※ドキュメントはすべて英語版です。",[89,2242,2244],{"id":2243},"cicdについてさらに詳しく","CI/CDについてさらに詳しく",[705,2246,2247,2254,2261,2268],{},[708,2248,2249],{},[15,2250,2253],{"href":2251,"rel":2252},"https://about.gitlab.com/blog/beginner-guide-ci-cd/",[],"GitLab’s guide to CI/CD for beginners (GitLab のビギナーのための CI/CD ガイド\n(英語版))",[708,2255,2256],{},[15,2257,2260],{"href":2258,"rel":2259},"https://about.gitlab.com/blog/directed-acyclic-graph/",[],"Get faster and more flexible pipelines with a Directed Acyclic Graph\n(有向非巡回グラフ（DAG）を使用して、より高速で柔軟なパイプラインを実現する(英語版))",[708,2262,2263],{},[15,2264,2267],{"href":2265,"rel":2266},"http://beenje.github.io/blog/posts/gitlab-ci-and-conda/",[],"Decrease build time with custom Docker image (カスタム化した Docker\nイメージでビルド時間を短縮する (英語版))",[708,2269,2270],{},[15,2271,2274],{"href":2272,"rel":2273},"https://about.gitlab.com/blog/introducing-the-gitlab-ci-cd-catalog-beta/",[],"Introducing the GitLab CI/CD Catalog Beta (GitLab CI/CD カタログベータ版の紹介\n(英語版))",[89,2276,2278],{"id":2277},"よくある質問-faq","よくある質問 (FAQ)",[1642,2280,2282],{"id":2281},"ciジョブを順次実行するかまたは並列実行するかどのように選択すればいいですか","CIジョブを順次実行するか、または並列実行するか、どのように選択すればいいですか？",[12,2284,2285],{},"CI\nジョブを順次実行するか、並列実行するかを選択する際は、ジョブの依存関係、リソースの利用可能性、実行時間、潜在的な干渉、テストスイートの構造、コスト面を考慮します。たとえば、デプロイジョブが始まるまでに終わらせなければならないビルドジョブがあったとします。その場合、これらのジョブを順次実行して、正しい実行順序を確かめます。一方、ユニットテストや統合テストなどのタスクは独立しており、それぞれの完了には依存しないため、並列実行できます。",[1642,2287,2289],{"id":2288},"gitlab-ciの-dag有向非巡回グラフとは何ですかまたdag-はパイプラインの柔軟性をどのように向上させますか","GitLab CIの DAG（有向非巡回グラフ）とは何ですか？また、DAG はパイプラインの柔軟性をどのように向上させますか？",[12,2291,2292],{},"GitLab CI の有向非巡回グラフ (DAG) は、パイプラインステージの順序を並び替えます。DAG\nはジョブ間の依存関係を設定するため、前のステージにあるジョブが終わり次第、その後のステージのジョブが開始されます。これによりパイプライン全体の実行時間が短縮され、効率が向上し、一部のジョブは通常の順序より早く完了します。",[1642,2294,2296],{"id":2295},"gitlab-の-ci-ジョブに最適なdockerイメージを選ぶ際に重要視しなければならないことは何ですか","GitLab の CI ジョブに最適なDockerイメージを選ぶ際に重要視しなければならないことは何ですか？",[12,2298,2299],{},"GitLab はジョブの実行の際に Docker イメージを使用します。デフォルトのイメージは ruby:3.1\nです。ジョブの要件によって、最適なイメージを選ぶことがとても大切です。ジョブはまず指定された Docker\nイメージをダウンロードしますが、イメージに必要ではない追加パッケージが含まれていると、ダウンロードや実行に余分な時間がかかります。そのため、実行時に不必要な遅延が発生しないように、選択したイメージにはジョブに必要なパッケージだけが含まれていることを確認することが重要です。",[89,2301,2302],{"id":2302},"次のステップ",[12,2304,2305],{},"ソフトウェア開発プラクティスで後れを取らないためにも、次のステップとしてCI/CDコンポーネントの標準化と再利用方法を理解することをお勧めします。GitLab\nCI/CD カタログ (英語版)\nもご確認ください。",[12,2307,2308,2309,2313],{},"継続的インテグレーションとデリバリー入門は、",[15,2310,2312],{"href":84,"rel":2311},[],"こちら","をご覧ください。",[12,2315,2316,2317,2322],{},"*監修：川瀬 洋平 ",[15,2318,2321],{"href":2319,"rel":2320},"https://gitlab.com/ykawase",[],"@ykawase",[2323,2324],"br",{},[12,2326,2327],{},"（GitLab合同会社 カスタマーサクセス本部 シニアカスタマーサクセスマネージャー）*",[2329,2330,2331],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":45,"searchDepth":119,"depth":119,"links":2333},[2334,2335,2336,2337,2338,2339,2340,2341,2348,2351,2354,2355,2360],{"id":91,"depth":119,"text":92},{"id":214,"depth":119,"text":215},{"id":356,"depth":119,"text":356},{"id":719,"depth":119,"text":720},{"id":826,"depth":119,"text":826},{"id":1011,"depth":119,"text":1011},{"id":1159,"depth":119,"text":1160},{"id":1637,"depth":119,"text":1637,"children":2342},[2343,2344,2345,2346,2347],{"id":1644,"depth":184,"text":1645},{"id":1803,"depth":184,"text":1803},{"id":1930,"depth":184,"text":1930},{"id":1973,"depth":184,"text":1973},{"id":2000,"depth":184,"text":2000},{"id":2012,"depth":119,"text":2013,"children":2349},[2350],{"id":2019,"depth":184,"text":2020},{"id":2067,"depth":119,"text":2068,"children":2352},[2353],{"id":2113,"depth":184,"text":2113},{"id":2243,"depth":119,"text":2244},{"id":2277,"depth":119,"text":2278,"children":2356},[2357,2358,2359],{"id":2281,"depth":184,"text":2282},{"id":2288,"depth":184,"text":2289},{"id":2295,"depth":184,"text":2296},{"id":2302,"depth":119,"text":2302},"engineering","2020-12-10","継続的インテグレーション (CI) 入門：CI は初めてですか？GitLab CI の使い方を学び、最初のCIパイプラインをGitLabでビルドしてみましょう。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662061/Blog/Hero%20Images/cicdcover.png",{},"/ja-jp/blog/basics-of-gitlab-ci-updated",{"ogTitle":5,"ogImage":2367,"ogDescription":2363,"ogSiteName":2371,"noIndex":2366,"ogType":2372,"ogUrl":2373,"title":5,"canonicalUrls":2373,"description":2363},"https://about.gitlab.com","article","https://about.gitlab.com/blog/basics-of-gitlab-ci-updated","basics-of-gitlab-ci-updated","ja-jp/blog/basics-of-gitlab-ci-updated",[2377,2378],"CI","tutorial","BlogPost","2026-08-04","wGC-G-XBXYgaCuQGCBP5UyLCqRctLutdVYltD4Z6YC8",{"logo":2383,"freeTrial":2388,"sales":2393,"login":2398,"items":2403,"search":2732,"minimal":2765,"duo":2782,"switchNav":2791,"pricingDeployment":2802},{"config":2384},{"href":2385,"dataGaName":2386,"dataGaLocation":2387},"/ja-jp/","gitlab logo","header",{"text":2389,"config":2390},"無料トライアルを開始",{"href":2391,"dataGaName":2392,"dataGaLocation":2387},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":2394,"config":2395},"デモをリクエスト",{"href":2396,"dataGaName":2397,"dataGaLocation":2387},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":2399,"config":2400},"サインイン",{"href":2401,"dataGaName":2402,"dataGaLocation":2387},"https://gitlab.com/users/sign_in/","sign in",[2404,2433,2535,2540,2654,2710],{"text":2405,"config":2406,"menu":2408},"プラットフォーム",{"dataNavLevelOne":2407},"platform",{"type":2409,"columns":2410},"cards",[2411,2417,2425],{"title":2405,"description":2412,"link":2413},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":2414,"config":2415},"プラットフォームの詳細はこちら",{"href":2416,"dataGaName":2407,"dataGaLocation":2387},"/ja-jp/platform/",{"title":2418,"description":2419,"link":2420},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":2421,"config":2422},"GitLab Duoのご紹介",{"href":2423,"dataGaName":2424,"dataGaLocation":2387},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":2426,"description":2427,"link":2428},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":2429,"config":2430},"詳細はこちら",{"href":2431,"dataGaName":2432,"dataGaLocation":2387},"/ja-jp/why-gitlab/","why gitlab",{"text":2434,"left":245,"config":2435,"menu":2437},"製品",{"dataNavLevelOne":2436},"solutions",{"type":2438,"link":2439,"columns":2443,"feature":2514},"lists",{"text":2440,"config":2441},"すべてのソリューションを表示",{"href":2442,"dataGaName":2436,"dataGaLocation":2387},"/ja-jp/solutions/",[2444,2469,2492],{"title":2445,"description":2446,"link":2447,"items":2452},"自動化","CI/CDと自動化でデプロイを加速",{"config":2448},{"icon":2449,"href":2450,"dataGaName":2451,"dataGaLocation":2387},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[2453,2457,2460,2465],{"text":2454,"config":2455},"CI/CD",{"href":2456,"dataGaLocation":2387,"dataGaName":2454},"/ja-jp/solutions/continuous-integration/",{"text":2418,"config":2458},{"href":2423,"dataGaLocation":2387,"dataGaName":2459},"gitlab duo agent platform - product menu",{"text":2461,"config":2462},"ソースコード管理",{"href":2463,"dataGaLocation":2387,"dataGaName":2464},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":2466,"config":2467},"自動化されたソフトウェアデリバリー",{"href":2450,"dataGaLocation":2387,"dataGaName":2468},"Automated software delivery",{"title":2470,"description":2471,"link":2472,"items":2477},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":2473},{"href":2474,"dataGaName":2475,"dataGaLocation":2387,"icon":2476},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[2478,2482,2487],{"text":2479,"config":2480},"アプリケーションセキュリティテスト",{"href":2474,"dataGaName":2481,"dataGaLocation":2387},"Application security testing",{"text":2483,"config":2484},"ソフトウェアサプライチェーンセキュリティ",{"href":2485,"dataGaLocation":2387,"dataGaName":2486},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":2488,"config":2489},"ソフトウェアコンプライアンス",{"href":2490,"dataGaName":2491,"dataGaLocation":2387},"/ja-jp/solutions/software-compliance/","software compliance",{"title":2493,"link":2494,"items":2499},"測定",{"config":2495},{"icon":2496,"href":2497,"dataGaName":2498,"dataGaLocation":2387},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[2500,2504,2509],{"text":2501,"config":2502},"可視性と測定",{"href":2497,"dataGaLocation":2387,"dataGaName":2503},"Visibility and Measurement",{"text":2505,"config":2506},"バリューストリーム管理",{"href":2507,"dataGaLocation":2387,"dataGaName":2508},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":2510,"config":2511},"分析とインサイト",{"href":2512,"dataGaLocation":2387,"dataGaName":2513},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":2515,"type":2438,"items":2516},"GitLabが活躍する場所",[2517,2523,2529],{"text":2518,"config":2519},"大企業",{"icon":2520,"href":2521,"dataGaLocation":2387,"dataGaName":2522},"Building","/ja-jp/enterprise/","enterprise",{"text":2524,"config":2525},"スモールビジネス",{"icon":2526,"href":2527,"dataGaLocation":2387,"dataGaName":2528},"Work","/ja-jp/small-business/","small business",{"text":2530,"config":2531},"公共部門",{"icon":2532,"href":2533,"dataGaLocation":2387,"dataGaName":2534},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":2536,"config":2537},"価格",{"href":2538,"dataGaName":2539,"dataGaLocation":2387,"dataNavLevelOne":2539},"/ja-jp/pricing/","pricing",{"text":2541,"config":2542,"menu":2544},"関連リソース",{"dataNavLevelOne":2543},"resources",{"type":2438,"link":2545,"columns":2549,"feature":2643},{"text":2546,"config":2547},"すべてのリソースを表示",{"href":2548,"dataGaName":2543,"dataGaLocation":2387},"/ja-jp/resources/",[2550,2583,2610],{"title":2551,"items":2552},"はじめに",[2553,2558,2563,2568,2573,2578],{"text":2554,"config":2555},"インストール",{"href":2556,"dataGaName":2557,"dataGaLocation":2387},"/ja-jp/install/","install",{"text":2559,"config":2560},"クイックスタートガイド",{"href":2561,"dataGaName":2562,"dataGaLocation":2387},"/ja-jp/get-started/","quick setup checklists",{"text":2564,"config":2565},"学ぶ",{"href":2566,"dataGaLocation":2387,"dataGaName":2567},"https://university.gitlab.com/","learn",{"text":2569,"config":2570},"製品ドキュメント",{"href":2571,"dataGaName":2572,"dataGaLocation":2387},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":2574,"config":2575},"ベストプラクティスビデオ",{"href":2576,"dataGaName":2577,"dataGaLocation":2387},"/ja-jp/getting-started-videos/","best practice videos",{"text":2579,"config":2580},"インテグレーション",{"href":2581,"dataGaName":2582,"dataGaLocation":2387},"/ja-jp/integrations/","integrations",{"title":2584,"items":2585},"検索する",[2586,2591,2596,2601,2605],{"text":2587,"config":2588},"お客様成功事例",{"href":2589,"dataGaName":2590,"dataGaLocation":2387},"/ja-jp/customers/","customer success stories",{"text":2592,"config":2593},"ブログ",{"href":2594,"dataGaName":2595,"dataGaLocation":2387},"/ja-jp/blog/","blog",{"text":2597,"config":2598},"Demo Hub",{"href":2599,"dataGaName":2600,"dataGaLocation":2387},"/ja-jp/demo-hub/","demo hub",{"text":2602,"config":2603},"The Source",{"href":2604,"dataGaName":2595,"dataGaLocation":2387},"/ja-jp/the-source/",{"text":2606,"config":2607},"リモート",{"href":2608,"dataGaName":2609,"dataGaLocation":2387},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2611,"items":2612},"つなげる",[2613,2618,2623,2628,2633,2638],{"text":2614,"config":2615},"GitLabサービス",{"href":2616,"dataGaName":2617,"dataGaLocation":2387},"/ja-jp/services/","services",{"text":2619,"config":2620},"コントリビュート",{"href":2621,"dataGaName":2622,"dataGaLocation":2387},"https://contributors.gitlab.com","contribute",{"text":2624,"config":2625},"コミュニティ",{"href":2626,"dataGaName":2627,"dataGaLocation":2387},"/community/","community",{"text":2629,"config":2630},"フォーラム",{"href":2631,"dataGaName":2632,"dataGaLocation":2387},"https://forum.gitlab.com/","forum",{"text":2634,"config":2635},"イベント",{"href":2636,"dataGaName":2637,"dataGaLocation":2387},"/events/","events",{"text":2639,"config":2640},"パートナー",{"href":2641,"dataGaName":2642,"dataGaLocation":2387},"/ja-jp/partners/","partners",{"config":2644,"title":2647,"text":2648,"link":2649},{"background":2645,"textColor":2646},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":2650,"config":2651},"最新情報を読む",{"href":2652,"dataGaName":2653,"dataGaLocation":2387},"/ja-jp/whats-new/","whats new",{"text":2655,"config":2656,"menu":2658},"企業情報",{"dataNavLevelOne":2657},"company",{"type":2438,"columns":2659},[2660],{"items":2661},[2662,2667,2673,2675,2680,2685,2690,2695,2700,2705],{"text":2663,"config":2664},"GitLabについて",{"href":2665,"dataGaName":2666,"dataGaLocation":2387},"/ja-jp/company/","about",{"text":2668,"config":2669,"footerGa":2672},"採用情報",{"href":2670,"dataGaName":2671,"dataGaLocation":2387},"/jobs/","jobs",{"dataGaName":2671},{"text":2634,"config":2674},{"href":2636,"dataGaName":2637,"dataGaLocation":2387},{"text":2676,"config":2677},"経営陣",{"href":2678,"dataGaName":2679,"dataGaLocation":2387},"/company/team/e-group/","leadership",{"text":2681,"config":2682},"ハンドブック",{"href":2683,"dataGaName":2684,"dataGaLocation":2387},"https://handbook.gitlab.com/","handbook",{"text":2686,"config":2687},"投資家向け情報",{"href":2688,"dataGaName":2689,"dataGaLocation":2387},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2691,"config":2692},"トラストセンター",{"href":2693,"dataGaName":2694,"dataGaLocation":2387},"/ja-jp/security/","trust center",{"text":2696,"config":2697},"AI Transparency Center",{"href":2698,"dataGaName":2699,"dataGaLocation":2387},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":2701,"config":2702},"ニュースレター",{"href":2703,"dataGaName":2704,"dataGaLocation":2387},"/company/contact/#contact-forms","newsletter",{"text":2706,"config":2707},"プレス",{"href":2708,"dataGaName":2709,"dataGaLocation":2387},"/press/","press",{"text":2711,"config":2712,"menu":2713},"お問い合わせ",{"dataNavLevelOne":2657},{"type":2438,"columns":2714},[2715],{"items":2716},[2717,2722,2727],{"text":2718,"config":2719},"お問い合わせはこちら",{"href":2720,"dataGaName":2721,"dataGaLocation":2387},"/ja-jp/sales/","talk to sales",{"text":2723,"config":2724},"サポートを受ける",{"href":2725,"dataGaName":2726,"dataGaLocation":2387},"https://support.gitlab.com/hc/en-us","support portal",{"text":2728,"config":2729},"カスタマーポータル",{"href":2730,"dataGaName":2731,"dataGaLocation":2387},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2733,"login":2734,"suggestions":2741},"閉じる",{"text":2735,"link":2736},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":2737,"config":2738},"GitLab.com",{"href":2401,"dataGaName":2739,"dataGaLocation":2740},"search login","search",{"text":2742,"default":2743},"提案",[2744,2746,2751,2753,2757,2761],{"text":2418,"config":2745},{"href":2423,"dataGaName":2418,"dataGaLocation":2740},{"text":2747,"config":2748},"コード提案（AI）",{"href":2749,"dataGaName":2750,"dataGaLocation":2740},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":2454,"config":2752},{"href":2456,"dataGaName":2454,"dataGaLocation":2740},{"text":2754,"config":2755},"GitLab on AWS",{"href":2756,"dataGaName":2754,"dataGaLocation":2740},"/ja-jp/partners/technology-partners/aws/",{"text":2758,"config":2759},"GitLab on Google Cloud",{"href":2760,"dataGaName":2758,"dataGaLocation":2740},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":2762,"config":2763},"GitLabを選ぶ理由",{"href":2431,"dataGaName":2764,"dataGaLocation":2740},"Why GitLab?",{"freeTrial":2766,"mobileIcon":2770,"desktopIcon":2775,"secondaryButton":2778},{"text":2389,"config":2767},{"href":2768,"dataGaName":2392,"dataGaLocation":2769},"https://gitlab.com/-/trials/new/","nav",{"altText":2771,"config":2772},"GitLabアイコン",{"src":2773,"dataGaName":2774,"dataGaLocation":2769},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2771,"config":2776},{"src":2777,"dataGaName":2774,"dataGaLocation":2769},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2551,"config":2779},{"href":2780,"dataGaName":2781,"dataGaLocation":2769},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":2783,"mobileIcon":2787,"desktopIcon":2789},{"text":2784,"config":2785},"GitLab Duoの詳細について",{"href":2423,"dataGaName":2786,"dataGaLocation":2769},"gitlab duo",{"altText":2771,"config":2788},{"src":2773,"dataGaName":2774,"dataGaLocation":2769},{"altText":2771,"config":2790},{"src":2777,"dataGaName":2774,"dataGaLocation":2769},{"button":2792,"mobileIcon":2797,"desktopIcon":2799},{"text":2793,"config":2794},"/switch",{"href":2795,"dataGaName":2796,"dataGaLocation":2769},"#contact","switch",{"altText":2771,"config":2798},{"src":2773,"dataGaName":2774,"dataGaLocation":2769},{"altText":2771,"config":2800},{"src":2801,"dataGaName":2774,"dataGaLocation":2769},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2803,"mobileIcon":2808,"desktopIcon":2810},{"text":2804,"config":2805},"料金ページに戻る",{"href":2538,"dataGaName":2806,"dataGaLocation":2769,"icon":2807},"back to pricing","GoBack",{"altText":2771,"config":2809},{"src":2773,"dataGaName":2774,"dataGaLocation":2769},{"altText":2771,"config":2811},{"src":2777,"dataGaName":2774,"dataGaLocation":2769},{"title":2813,"button":2814,"config":2818},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":2429,"config":2815},{"href":2816,"dataGaName":2817,"dataGaLocation":2387},"/ja-jp/gitlab-orbit/","orbit",{"layout":2819,"disabled":2366},"release",{"data":2821},{"text":2822,"source":2823,"edit":2829,"contribute":2834,"config":2839,"items":2844,"minimal":3052},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":2824,"config":2825},"ページのソースを表示",{"href":2826,"dataGaName":2827,"dataGaLocation":2828},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2830,"config":2831},"このページを編集",{"href":2832,"dataGaName":2833,"dataGaLocation":2828},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2835,"config":2836},"ご協力をお願いします",{"href":2837,"dataGaName":2838,"dataGaLocation":2828},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2840,"facebook":2841,"youtube":2842,"linkedin":2843},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2845,2890,2942,2985,3019],{"title":2536,"links":2846,"subMenu":2861},[2847,2851,2856],{"text":2848,"config":2849},"プランの表示",{"href":2538,"dataGaName":2850,"dataGaLocation":2828},"view plans",{"text":2852,"config":2853},"Premiumを選ぶ理由",{"href":2854,"dataGaName":2855,"dataGaLocation":2828},"/ja-jp/pricing/premium/","why premium",{"text":2857,"config":2858},"Ultimateを選ぶ理由",{"href":2859,"dataGaName":2860,"dataGaLocation":2828},"/ja-jp/pricing/ultimate/","why ultimate",[2862],{"title":2711,"links":2863},[2864,2866,2868,2870,2875,2880,2885],{"text":2711,"config":2865},{"href":2720,"dataGaName":2397,"dataGaLocation":2828},{"text":2723,"config":2867},{"href":2725,"dataGaName":2726,"dataGaLocation":2828},{"text":2728,"config":2869},{"href":2730,"dataGaName":2731,"dataGaLocation":2828},{"text":2871,"config":2872},"ステータス",{"href":2873,"dataGaName":2874,"dataGaLocation":2828},"https://status.gitlab.com/","status",{"text":2876,"config":2877},"利用規約",{"href":2878,"dataGaName":2879,"dataGaLocation":2828},"/terms/","terms of use",{"text":2881,"config":2882},"プライバシーに関する声明",{"href":2883,"dataGaName":2884,"dataGaLocation":2828},"/ja-jp/privacy/","privacy statement",{"text":2886,"config":2887},"Cookie 優先設定",{"dataGaName":2888,"dataGaLocation":2828,"id":2889,"isOneTrustButton":245},"cookie preferences","ot-sdk-btn",{"title":2434,"links":2891,"subMenu":2900},[2892,2896],{"text":2893,"config":2894},"DevSecOpsプラットフォーム",{"href":2416,"dataGaName":2895,"dataGaLocation":2828},"devsecops platform",{"text":2897,"config":2898},"AI支援開発",{"href":2423,"dataGaName":2899,"dataGaLocation":2828},"ai-assisted development",[2901],{"title":2902,"links":2903},"トピック",[2904,2908,2913,2917,2922,2927,2932,2937],{"text":2454,"config":2905},{"href":2906,"dataGaName":2907,"dataGaLocation":2828},"/ja-jp/topics/ci-cd/","cicd",{"text":2909,"config":2910},"GitOps",{"href":2911,"dataGaName":2912,"dataGaLocation":2828},"/ja-jp/topics/gitops/","gitops",{"text":1652,"config":2914},{"href":2915,"dataGaName":2916,"dataGaLocation":2828},"/ja-jp/topics/devops/","devops",{"text":2918,"config":2919},"バージョン管理",{"href":2920,"dataGaName":2921,"dataGaLocation":2828},"/ja-jp/topics/version-control/","version control",{"text":2923,"config":2924},"DevSecOps",{"href":2925,"dataGaName":2926,"dataGaLocation":2828},"/ja-jp/topics/devsecops/","devsecops",{"text":2928,"config":2929},"クラウドネイティブ",{"href":2930,"dataGaName":2931,"dataGaLocation":2828},"/ja-jp/topics/cloud-native/","cloud native",{"text":2933,"config":2934},"コーディングのためのAI",{"href":2935,"dataGaName":2936,"dataGaLocation":2828},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":2938,"config":2939},"エージェント型AI",{"href":2940,"dataGaName":2941,"dataGaLocation":2828},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":2943,"links":2944},"ソリューション",[2945,2948,2950,2955,2959,2962,2965,2968,2970,2972,2975,2980],{"text":2479,"config":2946},{"href":2474,"dataGaName":2947,"dataGaLocation":2828},"Application Security Testing",{"text":2466,"config":2949},{"href":2450,"dataGaName":2451,"dataGaLocation":2828},{"text":2951,"config":2952},"アジャイル開発",{"href":2953,"dataGaName":2954,"dataGaLocation":2828},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":2956,"config":2957},"SCM",{"href":2463,"dataGaName":2958,"dataGaLocation":2828},"source code management",{"text":2454,"config":2960},{"href":2456,"dataGaName":2961,"dataGaLocation":2828},"continuous integration & delivery",{"text":2505,"config":2963},{"href":2507,"dataGaName":2964,"dataGaLocation":2828},"value stream management",{"text":2909,"config":2966},{"href":2967,"dataGaName":2912,"dataGaLocation":2828},"/ja-jp/solutions/gitops/",{"text":2518,"config":2969},{"href":2521,"dataGaName":2522,"dataGaLocation":2828},{"text":2524,"config":2971},{"href":2527,"dataGaName":2528,"dataGaLocation":2828},{"text":2973,"config":2974},"公共機関",{"href":2533,"dataGaName":2534,"dataGaLocation":2828},{"text":2976,"config":2977},"教育",{"href":2978,"dataGaName":2979,"dataGaLocation":2828},"/ja-jp/solutions/education/","education",{"text":2981,"config":2982},"金融サービス",{"href":2983,"dataGaName":2984,"dataGaLocation":2828},"/ja-jp/solutions/finance/","financial services",{"title":2986,"links":2987},"リソース",[2988,2990,2992,2994,2998,3000,3003,3005,3007,3009,3011,3013,3015,3017],{"text":2554,"config":2989},{"href":2556,"dataGaName":2557,"dataGaLocation":2828},{"text":2559,"config":2991},{"href":2561,"dataGaName":2562,"dataGaLocation":2828},{"text":2564,"config":2993},{"href":2566,"dataGaName":2567,"dataGaLocation":2828},{"text":2569,"config":2995},{"href":2996,"dataGaName":2997,"dataGaLocation":2828},"https://docs.gitlab.com/ja-jp","docs",{"text":2592,"config":2999},{"href":2594,"dataGaName":2595,"dataGaLocation":2828},{"text":3001,"config":3002},"最新リリース",{"href":2652,"dataGaName":2653,"dataGaLocation":2828},{"text":2587,"config":3004},{"href":2589,"dataGaName":2590,"dataGaLocation":2828},{"text":2606,"config":3006},{"href":2608,"dataGaName":2609,"dataGaLocation":2828},{"text":2614,"config":3008},{"href":2616,"dataGaName":2617,"dataGaLocation":2828},{"text":2619,"config":3010},{"href":2621,"dataGaName":2622,"dataGaLocation":2828},{"text":2624,"config":3012},{"href":2626,"dataGaName":2627,"dataGaLocation":2828},{"text":2629,"config":3014},{"href":2631,"dataGaName":2632,"dataGaLocation":2828},{"text":2634,"config":3016},{"href":2636,"dataGaName":2637,"dataGaLocation":2828},{"text":2639,"config":3018},{"href":2641,"dataGaName":2642,"dataGaLocation":2828},{"title":3020,"links":3021},"会社情報",[3022,3024,3026,3028,3030,3032,3036,3041,3043,3045,3047],{"text":2663,"config":3023},{"href":2665,"dataGaName":2657,"dataGaLocation":2828},{"text":2668,"config":3025},{"href":2670,"dataGaName":2671,"dataGaLocation":2828},{"text":2676,"config":3027},{"href":2678,"dataGaName":2679,"dataGaLocation":2828},{"text":2681,"config":3029},{"href":2683,"dataGaName":2684,"dataGaLocation":2828},{"text":2686,"config":3031},{"href":2688,"dataGaName":2689,"dataGaLocation":2828},{"text":3033,"config":3034},"Sustainability",{"href":3035,"dataGaName":3033,"dataGaLocation":2828},"/sustainability/",{"text":3037,"config":3038},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":3039,"dataGaName":3040,"dataGaLocation":2828},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2691,"config":3042},{"href":2693,"dataGaName":2694,"dataGaLocation":2828},{"text":2701,"config":3044},{"href":2703,"dataGaName":2704,"dataGaLocation":2828},{"text":2706,"config":3046},{"href":2708,"dataGaName":2709,"dataGaLocation":2828},{"text":3048,"config":3049},"現代奴隷制の透明性に関する声明",{"href":3050,"dataGaName":3051,"dataGaLocation":2828},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":3053},[3054,3056,3059],{"text":2876,"config":3055},{"href":2878,"dataGaName":2879,"dataGaLocation":2828},{"text":3057,"config":3058},"Cookieの設定",{"dataGaName":2888,"dataGaLocation":2828,"id":2889,"isOneTrustButton":245},{"text":2881,"config":3060},{"href":2883,"dataGaName":2884,"dataGaLocation":2828},[3062],{"id":3063,"title":7,"body":2365,"config":3064,"content":3066,"description":2365,"extension":1095,"meta":3070,"navigation":245,"path":3071,"seo":3072,"stem":3073,"__hash__":3074},"blogAuthors/en-us/blog/authors/itzik-gan-baruch.yml",{"template":3065},"BlogAuthor",{"name":7,"config":3067},{"headshot":3068,"ctfId":3069},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749658921/Blog/Author%20Headshots/iganbaruch-headshot.jpg","iganbaruch",{},"/en-us/blog/authors/itzik-gan-baruch",{},"en-us/blog/authors/itzik-gan-baruch","bz9VMiTQ1ixvnoxUFk0jiUcnLG3oQsymgXNCqyRqfsk",[3076,3083,3090],{"title":3077,"description":3077,"heroImage":3078,"category":2361,"date":3079,"authors":3080,"slug":3082,"externalUrl":2365},"MCPサーバーとは？仕組みやソフトウェア開発の活用例をわかりやすく解説","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786001428/qedvughylmeposoqm5zs.jpg","2026-08-07",[3081],"GitLab Team","what-is-mcp-server",{"title":3084,"description":3085,"heroImage":3086,"category":2361,"date":3087,"authors":3088,"slug":3089,"externalUrl":2365},"イテレーションとは？意味や進め方、おすすめの支援ツールを紹介","イテレーションとは、アジャイル開発における「反復」を意味する開発単位です。本記事では、イテレーションの意味やスプリントとの違い、具体的な進め方、成功のポイントをわかりやすく解説します。アジャイル開発を支援するツールもあわせて紹介します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785816755/mj23yaguu0gxvbztd6pl.jpg","2026-08-06",[3081],"what-is-iteration",{"title":3091,"description":3092,"heroImage":3093,"category":2361,"date":3087,"authors":3094,"slug":3097,"externalUrl":2365},"GitLab Self-Hostedで実現するコンフィデンシャルAI","ソースコードをハードウェアで暗号化された境界の外に出すことなく、GitLab DuoのAIコーディングエージェントを開発者に提供します。GPUは不要です。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png",[3095,3096],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"promotions":3099},[3100,3114,3126,3138],{"id":3101,"categories":3102,"header":3104,"text":3105,"button":3106,"image":3111},"ai-modernization",[3103],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":3107,"config":3108},"AI成熟度スコアを確認する",{"href":3109,"dataGaName":3110,"dataGaLocation":2595},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":3112},{"src":3113},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":3115,"categories":3116,"header":3118,"text":3105,"button":3119,"image":3123},"devops-modernization",[3117,2926],"product","単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":3120,"config":3121},"DevOps成熟度スコアを確認しましょう",{"href":3122,"dataGaName":3110,"dataGaLocation":2595},"/ja-jp/assessments/devops-modernization-assessment/",{"config":3124},{"src":3125},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":3127,"categories":3128,"header":3130,"text":3105,"button":3131,"image":3135},"security-modernization",[3129],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":3132,"config":3133},"セキュリティ成熟度スコアを確認しましょう",{"href":3134,"dataGaName":3110,"dataGaLocation":2595},"/ja-jp/assessments/security-modernization-assessment/",{"config":3136},{"src":3137},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":3139,"paths":3140,"header":3143,"text":3144,"button":3145,"image":3150},"github-azure-migration",[3141,3142],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":3146,"config":3147},"GitLabとGitHubの比較を見る",{"href":3148,"dataGaName":3149,"dataGaLocation":2595},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":3151},{"src":3125},{"header":3153,"blurb":3154,"button":3155,"secondaryButton":3159},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":2389,"config":3156},{"href":3157,"dataGaName":2392,"dataGaLocation":3158},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":2711,"config":3160},{"href":2720,"dataGaName":2397,"dataGaLocation":3158},1786803769921]