[{"data":1,"prerenderedAt":2259},["ShallowReactive",2],{"/ja-jp/blog/ci-deployment-and-environments":3,"navigation-ja-jp":1466,"banner-ja-jp":1896,"footer-ja-jp":1904,"blog-post-authors-ja-jp-Ivan Nemytchenko|Cesar Saavedra":2146,"blog-related-posts-ja-jp-ci-deployment-and-environments":2173,"blog-promotions-ja-jp":2196,"next-steps-ja-jp":2250},{"id":4,"title":5,"authors":6,"body":9,"category":1445,"date":1446,"description":1447,"extension":1448,"externalUrl":1449,"faq":1449,"featured":1450,"heroImage":1451,"meta":1452,"navigation":625,"path":1453,"seo":1454,"slug":1457,"stem":1458,"tags":1459,"template":1463,"updatedDate":1464,"__hash__":1465},"blogPosts/ja-jp/blog/ci-deployment-and-environments.md","GitLab CIを使って複数の環境にデプロイする方法",[7,8],"Ivan Nemytchenko","Cesar Saavedra",{"type":10,"value":11,"toc":1427},"minimark",[12,16,25,28,43,46,55,63,66,70,83,92,95,143,150,153,170,180,187,192,199,206,217,245,248,254,271,315,321,330,339,406,409,415,421,427,434,437,442,453,507,510,516,523,529,532,535,538,544,547,552,561,569,582,593,602,761,764,770,773,778,787,942,945,951,954,960,966,969,974,977,980,990,995,998,1004,1007,1010,1037,1040,1066,1072,1075,1078,1083,1086,1093,1098,1101,1104,1111,1117,1120,1126,1129,1132,1139,1142,1220,1229,1232,1235,1241,1244,1247,1256,1259,1265,1268,1271,1274,1283,1286,1364,1367,1373,1376,1405,1409,1419,1424],[13,14,15],"p",{},"いくつかのシナリオを通じて、[GitLab",[13,17,18,19,24],{},"CI](",[20,21,22],"a",{"href":22,"rel":23},"https://about.gitlab.com/ja-jp/solutions/continuous-integration/",[],")",[13,26,27],{},"が持つ多様性と強みをご紹介します。",[13,29,30,31,36,37,42],{},"この投稿は、ある架空のニュースポータルのサクセスストーリーです。あなたは、そのポータルの所有者かつエディターで、唯一の開発者でもあります。プロジェクトコードは既に GitLab.com でホストされており、GitLab CI/CD で",[20,32,35],{"href":33,"rel":34},"https://docs.gitlab.com/ja-jp/ci/testing/",[],"テストを実行する (英語版)","こともできます。ここであなたは考えます。これを",[20,38,41],{"href":39,"rel":40},"https://about.gitlab.com/blog/how-to-keep-up-with-ci-cd-best-practices/",[],"デプロイに使う (英語版)","ことはできないだろうかと。そして、どこまで活用できるのだろう、と。",[13,44,45],{},"このサクセスストーリーを技術スタックに依存しないものにするために、このアプリは単なるHTML ファイルを集めたものだと仮定しましょう。サーバー側のコードも、高度な JavaScript のコンパイルもないものとします。",[13,47,48,49,54],{},"デプロイ先のプラットフォームも単純なものにしましょう。ここでは、「",[20,50,53],{"href":51,"rel":52},"https://aws.amazon.com/jp/s3/",[],"Amazon S3","」を使います。",[13,56,57,58,62],{},"この記事の目的は、コピー＆ペースト可能なスニペットを数多く紹介することではありません。",[20,59,61],{"href":22,"rel":60},[],"GitLab CI"," の基本原理や各種機能をご紹介し、それを現場の技術スタックに簡単に適用できるようにすることが目的です。",[13,64,65],{},"それでは、はじめましょう。このストーリーには、まだ、継続的インテグレーション (CI) は登場しません。",[67,68,69],"h2",{"id":69},"最初のステップ",[13,71,72,76,77,82],{},[73,74,75],"strong",{},"デプロイ","：今回、「デプロイ」とは、一連の HTML ファイルが (",[20,78,81],{"href":79,"rel":80},"https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html",[],"静的な Web サイトホスティング ","用に設定済み) S3 バケット上に表示されることを意味します。",[13,84,85,86,91],{},"これを実現する方法は無数にあります。ここでは、Amazon から提供されている",[20,87,90],{"href":88,"rel":89},"http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html#%E4%BE%8B",[]," awscli ライブラリ (英語版)"," を使います。",[13,93,94],{},"コマンドは、全体ではこのようになります。",[96,97,102],"pre",{"className":98,"code":99,"language":100,"meta":101,"style":101},"language-shell shiki shiki-themes github-light","aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n","shell","",[103,104,105],"code",{"__ignoreMap":101},[106,107,110,114,118,121,124,127,131,134,137,140],"span",{"class":108,"line":109},"line",1,[106,111,113],{"class":112},"s7eDp","aws",[106,115,117],{"class":116},"sYBdl"," s3",[106,119,120],{"class":116}," cp",[106,122,123],{"class":116}," ./",[106,125,126],{"class":116}," s3://yourbucket/",[106,128,130],{"class":129},"sYu0t"," --recursive",[106,132,133],{"class":129}," --exclude",[106,135,136],{"class":116}," \"*\"",[106,138,139],{"class":129}," --include",[106,141,142],{"class":116}," \"*.html\"\n",[13,144,145],{},[146,147],"img",{"alt":148,"src":149},"Manual deployment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398048/blog/Content%20Images/ci-deployment-and-environments/13.jpg",[13,151,152],{},"リポジトリへのコードのプッシュと、デプロイは別々のプロセスです。",[13,154,155,156,159,160,163,164,169],{},"重要なポイント：このコマンドは、2 つの環境変数",[103,157,158],{},"AWS_ACCESS_KEY_ID"," と  ",[103,161,162],{},"AWS_SECRET_ACCESS_KEY"," の指定を",[20,165,168],{"href":166,"rel":167},"https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html#config-settings-and-precedence",[],"コードデベロッパーが行なうものと想定","しています。また、",[13,171,172,173,169,176,179],{},"重要なポイント：このコマンドは、2 つの環境変数 AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY の指定を",[20,174,168],{"href":166,"rel":175},[],[103,177,178],{},"AWS_DEFAULT_REGION"," も指定する必要があるかもしれません。",[13,181,182,183,186],{},"では、",[20,184,61],{"href":22,"rel":185},[]," を使って自動化してみましょう。",[67,188,190],{"id":189},"はじめての自動化デプロイ",[73,191,189],{},[13,193,194,195,198],{},"GitLab では、どのコマンドを実行しても違いはありません。GitLab CI はユーザーの具体的なニーズに合わせて、あたかもコンピュータ上のローカルターミナルで操作している感覚でセットアップできます。ここで実行するコマンドをGitLabにも実行させるよう、CI に指定可能です。 ",[103,196,197],{},".gitlab-ci.yml","ファイルにスクリプトを記述し、コードをプッシュするだけです。これで、CI がジョブをトリガーし、指定コマンドが実行されます。",[13,200,201,202,205],{},"では、ここでストーリーにもう少し肉付けをしましょう。私たちの Web サイトは小規模で、1日あたり 20～30 人の訪問者がいるだけです。コードリポジトリには",[103,203,204],{},"main"," という1つのデフォルトブランチ (があるものとします。",[13,207,208,209,211,212,216],{},"それでは、 ",[103,210,197],{}," ファイルに、先程のコマンドを使った",[213,214,215],"em",{},"ジョブ","を指定することから始めましょう。",[96,218,222],{"className":219,"code":220,"language":221,"meta":101,"style":101},"language-yaml shiki shiki-themes github-light","deploy:\n  script: aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n","yaml",[103,223,224,234],{"__ignoreMap":101},[106,225,226,230],{"class":108,"line":109},[106,227,229],{"class":228},"shJU0","deploy",[106,231,233],{"class":232},"sgsFI",":\n",[106,235,237,240,243],{"class":108,"line":236},2,[106,238,239],{"class":228},"  script",[106,241,242],{"class":232},": ",[106,244,99],{"class":116},[13,246,247],{},"うまくいかないようです：",[13,249,250],{},[146,251],{"alt":252,"src":253},"Failed command","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/fail1.png",[13,255,256,257,259,260,262,263,266,267,270],{},"実行ファイルには",[103,258,113],{}," が必要です。これを確認するのは、私たちの",[213,261,215],{},"です。",[103,264,265],{},"awscli"," をインストールするには、pipが必要です。これは、Pythonパッケージのインストール用のツールです。では、Pythonが事前にインストール済みのDockerイメージを指定しましょう。これには",[103,268,269],{},"pip"," が含まれているはずです。",[96,272,274],{"className":219,"code":273,"language":221,"meta":101,"style":101},"deploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[103,275,276,282,292,299,308],{"__ignoreMap":101},[106,277,278,280],{"class":108,"line":109},[106,279,229],{"class":228},[106,281,233],{"class":232},[106,283,284,287,289],{"class":108,"line":236},[106,285,286],{"class":228},"  image",[106,288,242],{"class":232},[106,290,291],{"class":116},"python:latest\n",[106,293,295,297],{"class":108,"line":294},3,[106,296,239],{"class":228},[106,298,233],{"class":232},[106,300,302,305],{"class":108,"line":301},4,[106,303,304],{"class":232},"  - ",[106,306,307],{"class":116},"pip install awscli\n",[106,309,311,313],{"class":108,"line":310},5,[106,312,304],{"class":232},[106,314,99],{"class":116},[13,316,317],{},[146,318],{"alt":319,"src":320},"Automated deployment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/14.jpg",[13,322,323,324,329],{},"GitLab にコードをプッシュすると、CI により自動的にデプロイされます。awscli のインストールによりジョブの実行時間が伸びますがこの時点ではそれほど問題ではありません。プロセスを高速化する場合、awscliが事前にインストールされた ",[20,325,328],{"href":326,"rel":327},"https://hub.docker.com/",[],"Docker イメージを探す (英語版)","  ことが可能です。または、イメージをご自身で作成しても構いません。",[13,331,332,333,338],{},"ここで、",[20,334,337],{"href":335,"rel":336},"https://console.aws.amazon.com/",[],"AWS コンソール (英語版) ","から取得した環境変数を忘れないでください。",[96,340,342],{"className":219,"code":341,"language":221,"meta":101,"style":101},"variables:\n  AWS_ACCESS_KEY_ID: \"AKIAIOSFODNN7EXAMPLE\"\n  AWS_SECRET_ACCESS_KEY: \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://yourbucket/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[103,343,344,351,361,371,377,385,392,399],{"__ignoreMap":101},[106,345,346,349],{"class":108,"line":109},[106,347,348],{"class":228},"variables",[106,350,233],{"class":232},[106,352,353,356,358],{"class":108,"line":236},[106,354,355],{"class":228},"  AWS_ACCESS_KEY_ID",[106,357,242],{"class":232},[106,359,360],{"class":116},"\"AKIAIOSFODNN7EXAMPLE\"\n",[106,362,363,366,368],{"class":108,"line":294},[106,364,365],{"class":228},"  AWS_SECRET_ACCESS_KEY",[106,367,242],{"class":232},[106,369,370],{"class":116},"\"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"\n",[106,372,373,375],{"class":108,"line":301},[106,374,229],{"class":228},[106,376,233],{"class":232},[106,378,379,381,383],{"class":108,"line":310},[106,380,286],{"class":228},[106,382,242],{"class":232},[106,384,291],{"class":116},[106,386,388,390],{"class":108,"line":387},6,[106,389,239],{"class":228},[106,391,233],{"class":232},[106,393,395,397],{"class":108,"line":394},7,[106,396,304],{"class":232},[106,398,307],{"class":116},[106,400,402,404],{"class":108,"line":401},8,[106,403,304],{"class":232},[106,405,99],{"class":116},[13,407,408],{},"今回は上手くいくはずですが、シークレットキーをオープンにしたままにすることは、プライベートリポジトリであってもよくありません。ではどうすればよいのか、もう少し見てみましょう。",[410,411,413],"h3",{"id":412},"シークレット事項を守り抜くために",[73,414,412],{},[13,416,417,418],{},"GitLab にはシークレット変数用に特別な項目があります:  ",[73,419,420],{},"Settings（設定） > CI/CD > Variables（変数）",[13,422,423],{},[146,424],{"alt":425,"src":426},"Picture of Variables page","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/add-variable-updated.png",[13,428,429,430,433],{},"ここに入力したものすべてが",[73,431,432],{},"環境変数","になります。「Visibility（表示レベル）」の「Masked（マスクする）」ラジオボタンをオンにすると、ジョブログ内で変数がマスクされます。「Protect variable（変数の保護）」チェックボックスにチェックを入れると、変数は保護されているブランチやタグ上で実行されているパイプラインにのみ、エクスポートされます。プロジェクトの「オーナー」や「メンテナー」の権限を持つユーザーが、このセクションにアクセスできます。",[13,435,436],{},"CI 設定から、variables セクションを削除することも可能ですが、別の目的で使用してみましょう。",[410,438,440],{"id":439},"シークレットではない変数を指定して使用する方法",[73,441,439],{},[13,443,444,445,452],{},"構成が大きくなる場合、初期段階で、いくつかのパラメータを変数として設定しておくと便利です。これは特に、パラメータを複数の場面で使用する場合に便利です。今回のケースではまだそのような状況ではありませんが、デモとして、S3 バケット名を ",[73,446,447],{},[20,448,451],{"href":449,"rel":450},"https://docs.gitlab.com/ja-jp/ci/variables/",[],"variable"," に設定してみましょう。",[96,454,456],{"className":219,"code":455,"language":221,"meta":101,"style":101},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[103,457,458,464,474,480,488,494,500],{"__ignoreMap":101},[106,459,460,462],{"class":108,"line":109},[106,461,348],{"class":228},[106,463,233],{"class":232},[106,465,466,469,471],{"class":108,"line":236},[106,467,468],{"class":228},"  S3_BUCKET_NAME",[106,470,242],{"class":232},[106,472,473],{"class":116},"\"yourbucket\"\n",[106,475,476,478],{"class":108,"line":294},[106,477,229],{"class":228},[106,479,233],{"class":232},[106,481,482,484,486],{"class":108,"line":301},[106,483,286],{"class":228},[106,485,242],{"class":232},[106,487,291],{"class":116},[106,489,490,492],{"class":108,"line":310},[106,491,239],{"class":228},[106,493,233],{"class":232},[106,495,496,498],{"class":108,"line":387},[106,497,304],{"class":232},[106,499,307],{"class":116},[106,501,502,504],{"class":108,"line":394},[106,503,304],{"class":232},[106,505,506],{"class":116},"aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n",[13,508,509],{},"ここまで、順調ですね。",[13,511,512],{},[146,513],{"alt":514,"src":515},"Successful build","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/build.png",[13,517,518,519,522],{},"この架空シナリオでは、Web サイトの訪問者数が増えたため、開発者を雇いました。これでチームができました。チームワークにより、",[20,520,61],{"href":22,"rel":521},[]," ワークフローがどのように変化するのか、見てみましょう。",[67,524,526],{"id":525},"gitlab-ciをチームで使う方法",[73,527,528],{},"GitLab CIをチームで使う方法",[13,530,531],{},"同一のリポジトリで 2 人が作業をするようになったため、開発に main ブランチを使うのは得策ではなくなりました。そこで、新規機能や新規記事ごとに異なるブランチを使うことにし、準備ができたら、main ブランチにマージする、ということに決めました。",[13,533,534],{},"ここで問題があります。現行の CI 設定は、ブランチをまったく考慮していない、という点です。GitLab に何かをプッシュするたびに、S3 にデプロイされてしまいます。",[13,536,537],{},"この問題は簡単に回避できます。deploy するジョブに、only: main を追加するだけです。",[13,539,540],{},[146,541],{"alt":542,"src":543},"Automated deployment of main branch","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/15-updated.png",[13,545,546],{},"本番の Web サイトに、すべてのブランチをデプロイしたくありませんが、フィーチャーブランチからの変更点を何らかの方法でプレビューできたら嬉しいですね。",[410,548,550],{"id":549},"コードのテスト用に別の場所を設定する方法",[73,551,549],{},[13,553,554,555,560],{},"最近雇った人 (ここでは「パトリック」と呼びましょう) が、GitLab には",[20,556,559],{"href":557,"rel":558},"https://about.gitlab.comhttps://docs.gitlab.com/ja-jp/user/project/pages/",[]," GitLab Pages (英語版)"," という機能がある、と教えてくれました。作業中のコードをプレビューする場所にもってこいです。",[13,562,563,568],{},[20,564,567],{"href":565,"rel":566},"https://about.gitlab.com/blog/gitlab-pages-setup/",[],"GitLab Pagesで Web サイトをホストする (英語版) "," には、CI 設定ファイルが 次の3 つのシンプルなルールを満たしている必要があります。",[570,571,572,576,579],"ul",{},[573,574,575],"li",{},"ジョブはpagesと名付けなければならない",[573,577,578],{},"artifacts セクションがあり、その中に public フォルダを作成しなければならない",[573,580,581],{},"ホストしたいすべてのファイルは、このpublic フォルダ内に置かなければならない",[13,583,584,585],{},"public フォルダの中身は、http://",[586,587,588,589],"username",{},".gitlab.io/",[590,591,592],"projectname",{},"/でホストされます。",[13,594,595,596,601],{},"プレーン",[20,597,600],{"href":598,"rel":599},"https://gitlab.com/pages/plain-html/blob/master/.gitlab-ci.yml",[]," HTML Web サイト用の設定例","を適用した後は、CI設定全体はこのようになります。",[96,603,605],{"className":219,"code":604,"language":221,"meta":101,"style":101},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy:\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n\n",[103,606,607,613,621,627,633,641,647,653,659,667,675,680,688,698,705,713,721,729,737,746,754],{"__ignoreMap":101},[106,608,609,611],{"class":108,"line":109},[106,610,348],{"class":228},[106,612,233],{"class":232},[106,614,615,617,619],{"class":108,"line":236},[106,616,468],{"class":228},[106,618,242],{"class":232},[106,620,473],{"class":116},[106,622,623],{"class":108,"line":294},[106,624,626],{"emptyLinePlaceholder":625},true,"\n",[106,628,629,631],{"class":108,"line":301},[106,630,229],{"class":228},[106,632,233],{"class":232},[106,634,635,637,639],{"class":108,"line":310},[106,636,286],{"class":228},[106,638,242],{"class":232},[106,640,291],{"class":116},[106,642,643,645],{"class":108,"line":387},[106,644,239],{"class":228},[106,646,233],{"class":232},[106,648,649,651],{"class":108,"line":394},[106,650,304],{"class":232},[106,652,307],{"class":116},[106,654,655,657],{"class":108,"line":401},[106,656,304],{"class":232},[106,658,506],{"class":116},[106,660,662,665],{"class":108,"line":661},9,[106,663,664],{"class":228},"  only",[106,666,233],{"class":232},[106,668,670,672],{"class":108,"line":669},10,[106,671,304],{"class":232},[106,673,674],{"class":116},"main\n",[106,676,678],{"class":108,"line":677},11,[106,679,626],{"emptyLinePlaceholder":625},[106,681,683,686],{"class":108,"line":682},12,[106,684,685],{"class":228},"pages",[106,687,233],{"class":232},[106,689,691,693,695],{"class":108,"line":690},13,[106,692,286],{"class":228},[106,694,242],{"class":232},[106,696,697],{"class":116},"alpine:latest\n",[106,699,701,703],{"class":108,"line":700},14,[106,702,239],{"class":228},[106,704,233],{"class":232},[106,706,708,710],{"class":108,"line":707},15,[106,709,304],{"class":232},[106,711,712],{"class":116},"mkdir -p ./public\n",[106,714,716,718],{"class":108,"line":715},16,[106,717,304],{"class":232},[106,719,720],{"class":116},"cp ./*.html ./public/\n",[106,722,724,727],{"class":108,"line":723},17,[106,725,726],{"class":228},"  artifacts",[106,728,233],{"class":232},[106,730,732,735],{"class":108,"line":731},18,[106,733,734],{"class":228},"    paths",[106,736,233],{"class":232},[106,738,740,743],{"class":108,"line":739},19,[106,741,742],{"class":232},"    - ",[106,744,745],{"class":116},"public\n",[106,747,749,752],{"class":108,"line":748},20,[106,750,751],{"class":228},"  except",[106,753,233],{"class":232},[106,755,757,759],{"class":108,"line":756},21,[106,758,304],{"class":232},[106,760,674],{"class":116},[13,762,763],{},"2 つのジョブを指定しました。1つは、顧客用に Web サイトを S3 にデプロイします (deploy)。もう1つのジョブ (pages) は、Web サイトを GitLab Pages にデプロイします。2 つのジョブは、それぞれ「本番環境」と「ステージング環境」と呼びます。",[13,765,766],{},[146,767],{"alt":768,"src":769},"Deployment to two places","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/16-updated.png",[13,771,772],{},"マスター以外の全ブランチが GitLab Pages にデプロイされます。",[67,774,776],{"id":775},"環境の導入",[73,777,775],{},[13,779,780,781,786],{},"GitLab は",[20,782,785],{"href":783,"rel":784},"https://docs.gitlab.com/ja-jp/ci/environments/",[]," 環境へのサポート (英語版)"," (動的環境および静的環境を含む) を提供しているため、ユーザーは、各デプロイジョブに対応する環境を指定するだけで済みます。",[96,788,790],{"className":219,"code":789,"language":221,"meta":101,"style":101},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: python:latest\n  script:\n  - pip install awscli\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n  only:\n  - main\n\npages:\n  image: alpine:latest\n  environment: staging\n  script:\n  - mkdir -p ./public\n  - cp ./*.html ./public/\n  artifacts:\n    paths:\n    - public\n  except:\n  - main\n\n",[103,791,792,798,806,810,817,827,835,841,847,853,859,865,869,875,883,892,898,904,910,916,922,928,935],{"__ignoreMap":101},[106,793,794,796],{"class":108,"line":109},[106,795,348],{"class":228},[106,797,233],{"class":232},[106,799,800,802,804],{"class":108,"line":236},[106,801,468],{"class":228},[106,803,242],{"class":232},[106,805,473],{"class":116},[106,807,808],{"class":108,"line":294},[106,809,626],{"emptyLinePlaceholder":625},[106,811,812,815],{"class":108,"line":301},[106,813,814],{"class":228},"deploy to production",[106,816,233],{"class":232},[106,818,819,822,824],{"class":108,"line":310},[106,820,821],{"class":228},"  environment",[106,823,242],{"class":232},[106,825,826],{"class":116},"production\n",[106,828,829,831,833],{"class":108,"line":387},[106,830,286],{"class":228},[106,832,242],{"class":232},[106,834,291],{"class":116},[106,836,837,839],{"class":108,"line":394},[106,838,239],{"class":228},[106,840,233],{"class":232},[106,842,843,845],{"class":108,"line":401},[106,844,304],{"class":232},[106,846,307],{"class":116},[106,848,849,851],{"class":108,"line":661},[106,850,304],{"class":232},[106,852,506],{"class":116},[106,854,855,857],{"class":108,"line":669},[106,856,664],{"class":228},[106,858,233],{"class":232},[106,860,861,863],{"class":108,"line":677},[106,862,304],{"class":232},[106,864,674],{"class":116},[106,866,867],{"class":108,"line":682},[106,868,626],{"emptyLinePlaceholder":625},[106,870,871,873],{"class":108,"line":690},[106,872,685],{"class":228},[106,874,233],{"class":232},[106,876,877,879,881],{"class":108,"line":700},[106,878,286],{"class":228},[106,880,242],{"class":232},[106,882,697],{"class":116},[106,884,885,887,889],{"class":108,"line":707},[106,886,821],{"class":228},[106,888,242],{"class":232},[106,890,891],{"class":116},"staging\n",[106,893,894,896],{"class":108,"line":715},[106,895,239],{"class":228},[106,897,233],{"class":232},[106,899,900,902],{"class":108,"line":723},[106,901,304],{"class":232},[106,903,712],{"class":116},[106,905,906,908],{"class":108,"line":731},[106,907,304],{"class":232},[106,909,720],{"class":116},[106,911,912,914],{"class":108,"line":739},[106,913,726],{"class":228},[106,915,233],{"class":232},[106,917,918,920],{"class":108,"line":748},[106,919,734],{"class":228},[106,921,233],{"class":232},[106,923,924,926],{"class":108,"line":756},[106,925,742],{"class":232},[106,927,745],{"class":116},[106,929,931,933],{"class":108,"line":930},22,[106,932,751],{"class":228},[106,934,233],{"class":232},[106,936,938,940],{"class":108,"line":937},23,[106,939,304],{"class":232},[106,941,674],{"class":116},[13,943,944],{},"GitLab はユーザーのデプロイを追跡するため、サーバー上で何がデプロイされているのかを常に把握できます。",[13,946,947],{},[146,948],{"alt":949,"src":950},"List of environments","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/envs-updated.png",[13,952,953],{},"GitLab は現在の環境のそれぞれについて、デプロイの完全履歴を提供してくれます。",[13,955,956],{},[146,957],{"alt":958,"src":959},"List of deployments to staging environment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/staging-env-detail-updated.png",[13,961,962],{},[146,963],{"alt":964,"src":965},"Environments","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/17-updated.png",[13,967,968],{},"すべてが自動化され、セットアップも完了です。これで、新しい課題にチャレンジする準備が整いました。",[67,970,972],{"id":971},"デプロイのトラブルシューティング方法",[73,973,971],{},[13,975,976],{},"また、同じことが起きました。ステージング環境で自分のフィーチャーブランチをプレビューするためにプッシュした 1 分後、パトリックが彼のブランチをプッシュしたのです。ステージング環境はパトリックの作業内容で上書きされてしまいました。大変です。今日で 3 回目です。",[13,978,979],{},"そこで、アイデアが浮かびました。Slackを使ってデプロイを通知するようにすれば、デプロイが完了した時に、コンテンツを別の人がプッシュしてしまうことがなくなります。",[981,982,983],"blockquote",{},[13,984,985],{},[20,986,989],{"href":987,"rel":988},"https://docs.gitlab.com/ja-jp/user/project/integrations/gitlab_slack_application/",[],"GitLabとSlackを連携する方法はこちら",[67,991,993],{"id":992},"規模に応じたチームワーク",[73,994,992],{},[13,996,997],{},"時は過ぎ、Web サイトの人気は非常に上がり、チームも 2 人から 8 人に増えました。チームメンバーは同時進行で開発を行うため、「ステージング」でプレビューを待ち合うことが多くなってきました。「ステージングに対してすべてのブランチをデプロイする」という方針はうまくいかなくなってしまったのです。",[13,999,1000],{},[146,1001],{"alt":1002,"src":1003},"Queue of branches for review on Staging","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398050/blog/Content%20Images/ci-deployment-and-environments/queue.jpg",[13,1005,1006],{},"もう一度、プロセスを見直す時がきました。誰かがステージングサーバー上でコードへの変更内容を確認したいときは、まず「ステージング」ブランチに変更内容をマージする、ということにチームで同意しました。",[13,1008,1009],{},".gitlab-ci.yml への変更は最小限に抑えられます。",[96,1011,1013],{"className":219,"code":1012,"language":221,"meta":101,"style":101},"except:\n\n\n- main\n",[103,1014,1015,1022,1026,1030],{"__ignoreMap":101},[106,1016,1017,1020],{"class":108,"line":109},[106,1018,1019],{"class":228},"except",[106,1021,233],{"class":232},[106,1023,1024],{"class":108,"line":236},[106,1025,626],{"emptyLinePlaceholder":625},[106,1027,1028],{"class":108,"line":294},[106,1029,626],{"emptyLinePlaceholder":625},[106,1031,1032,1035],{"class":108,"line":301},[106,1033,1034],{"class":232},"- ",[106,1036,674],{"class":116},[13,1038,1039],{},"を次のように変更します：",[96,1041,1043],{"className":219,"code":1042,"language":221,"meta":101,"style":101},"only:\n\n\n- staging\n",[103,1044,1045,1052,1056,1060],{"__ignoreMap":101},[106,1046,1047,1050],{"class":108,"line":109},[106,1048,1049],{"class":228},"only",[106,1051,233],{"class":232},[106,1053,1054],{"class":108,"line":236},[106,1055,626],{"emptyLinePlaceholder":625},[106,1057,1058],{"class":108,"line":294},[106,1059,626],{"emptyLinePlaceholder":625},[106,1061,1062,1064],{"class":108,"line":301},[106,1063,1034],{"class":232},[106,1065,891],{"class":116},[13,1067,1068],{},[146,1069],{"alt":1070,"src":1071},"Staging branch","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/18-updated.png",[13,1073,1074],{},"ステージングサーバー上でプレビューを行なう前に、フィーチャーブランチをマージしなければなりません。",[13,1076,1077],{},"もちろん、これによりマージに追加の時間や労力がかかりますが、待機するよりは良い、ということで全員が同意しました。",[410,1079,1081],{"id":1080},"緊急時の対応",[73,1082,1080],{},[13,1084,1085],{},"すべてを制御することは不可能です。そのため、時として何かがうまくいかないこともあります。誰かがブランチを誤った方法でマージしてしまい、あなたのサイトが HackerNews のトップに載ったタイミングで、本番環境に直接プッシュしてしまいました。何千人もの人が、輝かしいメインページの代わりに、完全に崩れたレイアウトを目撃してしまったのです。",[13,1087,1088,1089,1092],{},"しかし幸運なことに、「",[73,1090,1091],{},"ロールバック","」ボタンを見つけた人がいたため、問題発覚 1 分後に、Web サイトは修正されました。",[13,1094,1095],{},[146,1096],{"alt":949,"src":1097},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/prod-env-rollback-arrow-updated.png",[13,1099,1100],{},"「ロールバック」により、1つ前のコミットでの1つ前のジョブが再起動されます",[13,1102,1103],{},"とにかく、この問題に対応する必要があると感じたため、本番環境への GitLab 自動デプロイを停止して、手動デプロイに切り替えることにしました。そのためには、ジョブに when: manual を追加する必要があります。",[13,1105,1106,1107,1110],{},"予想通り、その後は「本番環境」への自動デプロイは行なわれなくなりました。手動でデプロイするには、",[73,1108,1109],{},"CI/CD > Pipelines（パイプライン）"," に移動し、下図にあるボタンをクリックします。",[13,1112,1113],{},[146,1114],{"alt":1115,"src":1116},"Skipped job is available for manual launch","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674076/Blog/Content%20Images/manual-pipeline-arrow-updated.png",[13,1118,1119],{},"時間を早送りしましょう。ついに、あなたの組織は法人化されました。Web サイトに取り組んでいる人も数百人になり、これまでの妥協策はもう通用しません。",[410,1121,1123],{"id":1122},"review-appsの出番です",[73,1124,1125],{},"「Review Apps」の出番です",[13,1127,1128],{},"次にすべき論理的なステップは、レビュー用に、フィーチャーブランチごとにアプリケーションの一時インスタンスを起動することでしょう。",[13,1130,1131],{},"ここでは、そのために S3 上に別のバケットをセットアップします。ただ一つ違うところは、開発ブランチの名前で Web サイトのコンテンツを「フォルダ」にコピーする点です。URL は次のようになります。",[13,1133,1134,1135],{},"http://\u003CREVIEW_S3_BUCKET_NAME>.s3-website-us-east-1.amazonaws.com/",[1136,1137,1138],"branchname",{},"/",[13,1140,1141],{},"前に使った pages ジョブを次のコードで置き換えます。",[96,1143,1145],{"className":219,"code":1144,"language":221,"meta":101,"style":101},"review apps:\n  variables:\n    S3_BUCKET_NAME: \"reviewbucket\"\n  image: python:latest\n  environment: review\n  script:\n  - pip install awscli\n  - mkdir -p ./$CI_BUILD_REF_NAME\n  - cp ./*.html ./$CI_BUILD_REF_NAME/\n  - aws s3 cp ./ s3://$S3_BUCKET_NAME/ --recursive --exclude \"*\" --include \"*.html\"\n\n",[103,1146,1147,1154,1161,1171,1179,1188,1194,1200,1207,1214],{"__ignoreMap":101},[106,1148,1149,1152],{"class":108,"line":109},[106,1150,1151],{"class":228},"review apps",[106,1153,233],{"class":232},[106,1155,1156,1159],{"class":108,"line":236},[106,1157,1158],{"class":228},"  variables",[106,1160,233],{"class":232},[106,1162,1163,1166,1168],{"class":108,"line":294},[106,1164,1165],{"class":228},"    S3_BUCKET_NAME",[106,1167,242],{"class":232},[106,1169,1170],{"class":116},"\"reviewbucket\"\n",[106,1172,1173,1175,1177],{"class":108,"line":301},[106,1174,286],{"class":228},[106,1176,242],{"class":232},[106,1178,291],{"class":116},[106,1180,1181,1183,1185],{"class":108,"line":310},[106,1182,821],{"class":228},[106,1184,242],{"class":232},[106,1186,1187],{"class":116},"review\n",[106,1189,1190,1192],{"class":108,"line":387},[106,1191,239],{"class":228},[106,1193,233],{"class":232},[106,1195,1196,1198],{"class":108,"line":394},[106,1197,304],{"class":232},[106,1199,307],{"class":116},[106,1201,1202,1204],{"class":108,"line":401},[106,1203,304],{"class":232},[106,1205,1206],{"class":116},"mkdir -p ./$CI_BUILD_REF_NAME\n",[106,1208,1209,1211],{"class":108,"line":661},[106,1210,304],{"class":232},[106,1212,1213],{"class":116},"cp ./*.html ./$CI_BUILD_REF_NAME/\n",[106,1215,1216,1218],{"class":108,"line":669},[106,1217,304],{"class":232},[106,1219,506],{"class":116},[13,1221,1222,1223,1228],{},"興味深いのは、$CI_BUILD_REF_NAME という変数がどこからきたか、という点です。GitLab は ",[20,1224,1227],{"href":1225,"rel":1226},"https://docs.gitlab.com/ja-jp/ci/variables/predefined_variables/",[],"多くの環境変数 (英語版)"," があらかじめ定義されています。そのため、ジョブではすぐ変数が使えます。",[13,1230,1231],{},"ここでご注意いただきたいのは、S3_BUCKET_NAME 変数はジョブ内で定義している、ということです。トップレベルの定義を再定義するとき、これを行ないます。",[13,1233,1234],{},"この構成を視覚的にわかりやすく描くと、次のようになります。",[13,1236,1237],{},[146,1238],{"alt":1239,"src":1240},"How to use GitLab CI - update - 19 - updated","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749674077/Blog/Content%20Images/19-updated.png",[13,1242,1243],{},"「Review Apps」の実装の詳細は、実際に現場で使っている技術スタックやデプロイプロセスなどにより大きく異なります。そのため、このブログ記事では詳細をカバーできません。",[13,1245,1246],{},"現実は、この静的な HTML Web サイトのように簡単ではないのです。例えば、あるインスタンスを一時インスタンスにして、必要なソフトウェアやサービスを即座に、自動的に起動させることは簡単な作業ではありません。しかし、特に Docker コンテナ、または Chef や Ansible を使えば実現可能です。",[13,1248,1249,1250,1255],{},"Docker を使ったデプロイについては、今後のブログ記事で取り上げます。GitLab デプロイプロセスをシンプルな HTML ファイルのコピーに単純化し、より複雑なシナリオにしなかったことに対して、少々後めたい気持ちがあります。複雑なシナリオを知りたい方は、「Building an Elixir Release into a Docker image using GitLab CI (英語版のみ：",[20,1251,1254],{"href":1252,"rel":1253},"https://about.gitlab.com/blog/building-an-elixir-release-into-docker-image-using-gitlab-ci-part-1/",[],"GitLab CI を使用して、Elixir リリースを Docker イメージにビルドする)」 をご覧ください","。",[13,1257,1258],{},"さて、記事に戻ります。最後の点について、お話しましょう。",[410,1260,1262],{"id":1261},"異なるプラットフォームへの-gitlab-デプロイ",[73,1263,1264],{},"異なるプラットフォームへの GitLab デプロイ",[13,1266,1267],{},"現実は、S3 や GitLab Pages だけに限定されるものではありません。GitLab はまざまなサービスにアプリやパッケージをホストし、デプロイしています。",[13,1269,1270],{},"さらに、ある時点で、新しいプラットフォームへの移行を決定し、デプロイスクリプトをすべて書き直す必要が生じるかもしれません。そういった場合のダメージを最小限に抑えるために、dpl という Gem を使えます。",[13,1272,1273],{},"上の例では、サービス (Amazon S3) へのコードのサンプルツールとして awscli を使用しました。しかし、どのツールを使っても、また、デプロイ先のシステムに何を選んでも、基本原則は変わりません。いくつかのパラメータでコマンドを実行し、何らかの方法で認証用にシークレットキーを渡すということです。",[13,1275,1276,1277,1282],{},"dpl のデプロイツールは、この基本原則に従い、",[20,1278,1281],{"href":1279,"rel":1280},"https://github.com/travis-ci/dpl#supported-providers",[],"このプロバイダーのリスト","に対して統一されたインターフェイスを提供します。",[13,1284,1285],{},"こちらが、dplを使用した場合の、本番デプロイジョブの例です。",[96,1287,1289],{"className":219,"code":1288,"language":221,"meta":101,"style":101},"variables:\n  S3_BUCKET_NAME: \"yourbucket\"\n\ndeploy to production:\n  environment: production\n  image: ruby:latest\n  script:\n  - gem install dpl\n  - dpl --provider=s3 --bucket=$S3_BUCKET_NAME\n  only:\n  - main\n\n",[103,1290,1291,1297,1305,1309,1315,1323,1332,1338,1345,1352,1358],{"__ignoreMap":101},[106,1292,1293,1295],{"class":108,"line":109},[106,1294,348],{"class":228},[106,1296,233],{"class":232},[106,1298,1299,1301,1303],{"class":108,"line":236},[106,1300,468],{"class":228},[106,1302,242],{"class":232},[106,1304,473],{"class":116},[106,1306,1307],{"class":108,"line":294},[106,1308,626],{"emptyLinePlaceholder":625},[106,1310,1311,1313],{"class":108,"line":301},[106,1312,814],{"class":228},[106,1314,233],{"class":232},[106,1316,1317,1319,1321],{"class":108,"line":310},[106,1318,821],{"class":228},[106,1320,242],{"class":232},[106,1322,826],{"class":116},[106,1324,1325,1327,1329],{"class":108,"line":387},[106,1326,286],{"class":228},[106,1328,242],{"class":232},[106,1330,1331],{"class":116},"ruby:latest\n",[106,1333,1334,1336],{"class":108,"line":394},[106,1335,239],{"class":228},[106,1337,233],{"class":232},[106,1339,1340,1342],{"class":108,"line":401},[106,1341,304],{"class":232},[106,1343,1344],{"class":116},"gem install dpl\n",[106,1346,1347,1349],{"class":108,"line":661},[106,1348,304],{"class":232},[106,1350,1351],{"class":116},"dpl --provider=s3 --bucket=$S3_BUCKET_NAME\n",[106,1353,1354,1356],{"class":108,"line":669},[106,1355,664],{"class":228},[106,1357,233],{"class":232},[106,1359,1360,1362],{"class":108,"line":677},[106,1361,304],{"class":232},[106,1363,674],{"class":116},[13,1365,1366],{},"異なるシステムにデプロイする場合、またはデプロイ先のプラットフォームを頻繁に変更する場合には、デプロイ用スクリプトが統一されるように dplを使うことを検討してください。",[67,1368,1370],{"id":1369},"まとめ5つの重要なポイント",[73,1371,1372],{},"まとめ：5つの重要なポイント",[13,1374,1375],{},"GitLab での CI デプロイについて、CI/CD AWS を使って説明してきました。GitLab AWS デプロイについて役立つ知識が得られたでしょうか。これまで学んできたポイントをまとめると、次のようになります。",[1377,1378,1379,1386,1393,1399,1402],"ol",{},[573,1380,1381,1382,1385],{},"デプロイとは、定期的に実行される、単一の (もしくは一連の) コマンドにすぎません。このため、デプロイは ",[20,1383,61],{"href":22,"rel":1384},[]," 内で実行できます。",[573,1387,1388,1389,1392],{},"ほとんどの場合、実行するコマンドに対していくつかの (もしくは単一の) シークレットキーを指定する必要があります。指定するシークレットキーは、",[73,1390,1391],{},"Settings （設定）> CI/CD > Variables（変数）"," に格納します。",[573,1394,1395,1398],{},[20,1396,61],{"href":22,"rel":1397},[]," では、デプロイ先のブランチを柔軟に指定できます。",[573,1400,1401],{},"複数の環境にデプロイする場合、GitLab はデプロイ履歴を保持します。そのため、任意の前バージョンにロールバックできます。",[573,1403,1404],{},"インフラストラクチャの重要な部分については、GitLab 自動デプロイの代わりに、GitLab インターフェイスからの手動デプロイを有効化できます。",[1406,1407,1408],"style",{},"\n\n\nimg.illustration {\n  padding-left: 12%;\n  padding-right: 12%;\n\n}\n\n\n@media (max-width: 760px) {\n  img.illustration {\n    padding-left: 0px;\n    padding-right: 0px;\n  }\n}\n\n\n",[13,1410,1411],{},[213,1412,1413,1414],{},"監修：小松原 つかさ ",[20,1415,1418],{"href":1416,"rel":1417},"https://gitlab.com/tkomatsubara",[],"@tkomatsubara",[13,1420,1421],{},[213,1422,1423],{},"（GitLab合同会社 ソリューションアーキテクト本部 シニアパートナーソリューションアーキテクト）",[1406,1425,1426],{},"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 .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}",{"title":101,"searchDepth":236,"depth":236,"links":1428},[1429,1430,1434,1437,1438,1439,1444],{"id":69,"depth":236,"text":69},{"id":189,"depth":236,"text":189,"children":1431},[1432,1433],{"id":412,"depth":294,"text":412},{"id":439,"depth":294,"text":439},{"id":525,"depth":236,"text":528,"children":1435},[1436],{"id":549,"depth":294,"text":549},{"id":775,"depth":236,"text":775},{"id":971,"depth":236,"text":971},{"id":992,"depth":236,"text":992,"children":1440},[1441,1442,1443],{"id":1080,"depth":294,"text":1080},{"id":1122,"depth":294,"text":1125},{"id":1261,"depth":294,"text":1264},{"id":1369,"depth":236,"text":1372},"engineering","2021-02-05","GitLab CI の多様性とパワーをAWS(S3)を例に学び、デプロイに活かせる開発力を身に着けましょう。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1749662033/Blog/Hero%20Images/intro.jpg",{},"/ja-jp/blog/ci-deployment-and-environments",{"config":1455,"ogImage":1451,"description":1447,"title":1456},{"noIndex":1450},"GitLab CIを使って複数の環境にデプロイする方法 | GitLab","ci-deployment-and-environments","ja-jp/blog/ci-deployment-and-environments",[1460,1461,1462],"CI","CD","tutorial","BlogPost","2025-08-22","D2P4aTmo2eb2N3shr1ydfXAQ9HzNOoYCoQsv0Jr1m-o",{"logo":1467,"freeTrial":1472,"sales":1477,"login":1482,"items":1487,"search":1816,"minimal":1849,"duo":1866,"switchNav":1875,"pricingDeployment":1886},{"config":1468},{"href":1469,"dataGaName":1470,"dataGaLocation":1471},"/ja-jp/","gitlab logo","header",{"text":1473,"config":1474},"無料トライアルを開始",{"href":1475,"dataGaName":1476,"dataGaLocation":1471},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1478,"config":1479},"デモをリクエスト",{"href":1480,"dataGaName":1481,"dataGaLocation":1471},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":1483,"config":1484},"サインイン",{"href":1485,"dataGaName":1486,"dataGaLocation":1471},"https://gitlab.com/users/sign_in/","sign in",[1488,1517,1619,1624,1738,1794],{"text":1489,"config":1490,"menu":1492},"プラットフォーム",{"dataNavLevelOne":1491},"platform",{"type":1493,"columns":1494},"cards",[1495,1501,1509],{"title":1489,"description":1496,"link":1497},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":1498,"config":1499},"プラットフォームの詳細はこちら",{"href":1500,"dataGaName":1491,"dataGaLocation":1471},"/ja-jp/platform/",{"title":1502,"description":1503,"link":1504},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":1505,"config":1506},"GitLab Duoのご紹介",{"href":1507,"dataGaName":1508,"dataGaLocation":1471},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1510,"description":1511,"link":1512},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":1513,"config":1514},"詳細はこちら",{"href":1515,"dataGaName":1516,"dataGaLocation":1471},"/ja-jp/why-gitlab/","why gitlab",{"text":1518,"left":625,"config":1519,"menu":1521},"製品",{"dataNavLevelOne":1520},"solutions",{"type":1522,"link":1523,"columns":1527,"feature":1598},"lists",{"text":1524,"config":1525},"すべてのソリューションを表示",{"href":1526,"dataGaName":1520,"dataGaLocation":1471},"/ja-jp/solutions/",[1528,1553,1576],{"title":1529,"description":1530,"link":1531,"items":1536},"自動化","CI/CDと自動化でデプロイを加速",{"config":1532},{"icon":1533,"href":1534,"dataGaName":1535,"dataGaLocation":1471},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[1537,1541,1544,1549],{"text":1538,"config":1539},"CI/CD",{"href":1540,"dataGaLocation":1471,"dataGaName":1538},"/ja-jp/solutions/continuous-integration/",{"text":1502,"config":1542},{"href":1507,"dataGaLocation":1471,"dataGaName":1543},"gitlab duo agent platform - product menu",{"text":1545,"config":1546},"ソースコード管理",{"href":1547,"dataGaLocation":1471,"dataGaName":1548},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":1550,"config":1551},"自動化されたソフトウェアデリバリー",{"href":1534,"dataGaLocation":1471,"dataGaName":1552},"Automated software delivery",{"title":1554,"description":1555,"link":1556,"items":1561},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":1557},{"href":1558,"dataGaName":1559,"dataGaLocation":1471,"icon":1560},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1562,1566,1571],{"text":1563,"config":1564},"アプリケーションセキュリティテスト",{"href":1558,"dataGaName":1565,"dataGaLocation":1471},"Application security testing",{"text":1567,"config":1568},"ソフトウェアサプライチェーンセキュリティ",{"href":1569,"dataGaLocation":1471,"dataGaName":1570},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":1572,"config":1573},"ソフトウェアコンプライアンス",{"href":1574,"dataGaName":1575,"dataGaLocation":1471},"/ja-jp/solutions/software-compliance/","software compliance",{"title":1577,"link":1578,"items":1583},"測定",{"config":1579},{"icon":1580,"href":1581,"dataGaName":1582,"dataGaLocation":1471},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[1584,1588,1593],{"text":1585,"config":1586},"可視性と測定",{"href":1581,"dataGaLocation":1471,"dataGaName":1587},"Visibility and Measurement",{"text":1589,"config":1590},"バリューストリーム管理",{"href":1591,"dataGaLocation":1471,"dataGaName":1592},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":1594,"config":1595},"分析とインサイト",{"href":1596,"dataGaLocation":1471,"dataGaName":1597},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":1599,"type":1522,"items":1600},"GitLabが活躍する場所",[1601,1607,1613],{"text":1602,"config":1603},"大企業",{"icon":1604,"href":1605,"dataGaLocation":1471,"dataGaName":1606},"Building","/ja-jp/enterprise/","enterprise",{"text":1608,"config":1609},"スモールビジネス",{"icon":1610,"href":1611,"dataGaLocation":1471,"dataGaName":1612},"Work","/ja-jp/small-business/","small business",{"text":1614,"config":1615},"公共部門",{"icon":1616,"href":1617,"dataGaLocation":1471,"dataGaName":1618},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":1620,"config":1621},"価格",{"href":1622,"dataGaName":1623,"dataGaLocation":1471,"dataNavLevelOne":1623},"/ja-jp/pricing/","pricing",{"text":1625,"config":1626,"menu":1628},"関連リソース",{"dataNavLevelOne":1627},"resources",{"type":1522,"link":1629,"columns":1633,"feature":1727},{"text":1630,"config":1631},"すべてのリソースを表示",{"href":1632,"dataGaName":1627,"dataGaLocation":1471},"/ja-jp/resources/",[1634,1667,1694],{"title":1635,"items":1636},"はじめに",[1637,1642,1647,1652,1657,1662],{"text":1638,"config":1639},"インストール",{"href":1640,"dataGaName":1641,"dataGaLocation":1471},"/ja-jp/install/","install",{"text":1643,"config":1644},"クイックスタートガイド",{"href":1645,"dataGaName":1646,"dataGaLocation":1471},"/ja-jp/get-started/","quick setup checklists",{"text":1648,"config":1649},"学ぶ",{"href":1650,"dataGaLocation":1471,"dataGaName":1651},"https://university.gitlab.com/","learn",{"text":1653,"config":1654},"製品ドキュメント",{"href":1655,"dataGaName":1656,"dataGaLocation":1471},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":1658,"config":1659},"ベストプラクティスビデオ",{"href":1660,"dataGaName":1661,"dataGaLocation":1471},"/ja-jp/getting-started-videos/","best practice videos",{"text":1663,"config":1664},"インテグレーション",{"href":1665,"dataGaName":1666,"dataGaLocation":1471},"/ja-jp/integrations/","integrations",{"title":1668,"items":1669},"検索する",[1670,1675,1680,1685,1689],{"text":1671,"config":1672},"お客様成功事例",{"href":1673,"dataGaName":1674,"dataGaLocation":1471},"/ja-jp/customers/","customer success stories",{"text":1676,"config":1677},"ブログ",{"href":1678,"dataGaName":1679,"dataGaLocation":1471},"/ja-jp/blog/","blog",{"text":1681,"config":1682},"Demo Hub",{"href":1683,"dataGaName":1684,"dataGaLocation":1471},"/ja-jp/demo-hub/","demo hub",{"text":1686,"config":1687},"The Source",{"href":1688,"dataGaName":1679,"dataGaLocation":1471},"/ja-jp/the-source/",{"text":1690,"config":1691},"リモート",{"href":1692,"dataGaName":1693,"dataGaLocation":1471},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1695,"items":1696},"つなげる",[1697,1702,1707,1712,1717,1722],{"text":1698,"config":1699},"GitLabサービス",{"href":1700,"dataGaName":1701,"dataGaLocation":1471},"/ja-jp/services/","services",{"text":1703,"config":1704},"コントリビュート",{"href":1705,"dataGaName":1706,"dataGaLocation":1471},"https://contributors.gitlab.com","contribute",{"text":1708,"config":1709},"コミュニティ",{"href":1710,"dataGaName":1711,"dataGaLocation":1471},"/community/","community",{"text":1713,"config":1714},"フォーラム",{"href":1715,"dataGaName":1716,"dataGaLocation":1471},"https://forum.gitlab.com/","forum",{"text":1718,"config":1719},"イベント",{"href":1720,"dataGaName":1721,"dataGaLocation":1471},"/events/","events",{"text":1723,"config":1724},"パートナー",{"href":1725,"dataGaName":1726,"dataGaLocation":1471},"/ja-jp/partners/","partners",{"config":1728,"title":1731,"text":1732,"link":1733},{"background":1729,"textColor":1730},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1734,"config":1735},"最新情報を読む",{"href":1736,"dataGaName":1737,"dataGaLocation":1471},"/ja-jp/whats-new/","whats new",{"text":1739,"config":1740,"menu":1742},"企業情報",{"dataNavLevelOne":1741},"company",{"type":1522,"columns":1743},[1744],{"items":1745},[1746,1751,1757,1759,1764,1769,1774,1779,1784,1789],{"text":1747,"config":1748},"GitLabについて",{"href":1749,"dataGaName":1750,"dataGaLocation":1471},"/ja-jp/company/","about",{"text":1752,"config":1753,"footerGa":1756},"採用情報",{"href":1754,"dataGaName":1755,"dataGaLocation":1471},"/jobs/","jobs",{"dataGaName":1755},{"text":1718,"config":1758},{"href":1720,"dataGaName":1721,"dataGaLocation":1471},{"text":1760,"config":1761},"経営陣",{"href":1762,"dataGaName":1763,"dataGaLocation":1471},"/company/team/e-group/","leadership",{"text":1765,"config":1766},"ハンドブック",{"href":1767,"dataGaName":1768,"dataGaLocation":1471},"https://handbook.gitlab.com/","handbook",{"text":1770,"config":1771},"投資家向け情報",{"href":1772,"dataGaName":1773,"dataGaLocation":1471},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1775,"config":1776},"トラストセンター",{"href":1777,"dataGaName":1778,"dataGaLocation":1471},"/ja-jp/security/","trust center",{"text":1780,"config":1781},"AI Transparency Center",{"href":1782,"dataGaName":1783,"dataGaLocation":1471},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1785,"config":1786},"ニュースレター",{"href":1787,"dataGaName":1788,"dataGaLocation":1471},"/company/contact/#contact-forms","newsletter",{"text":1790,"config":1791},"プレス",{"href":1792,"dataGaName":1793,"dataGaLocation":1471},"/press/","press",{"text":1795,"config":1796,"menu":1797},"お問い合わせ",{"dataNavLevelOne":1741},{"type":1522,"columns":1798},[1799],{"items":1800},[1801,1806,1811],{"text":1802,"config":1803},"お問い合わせはこちら",{"href":1804,"dataGaName":1805,"dataGaLocation":1471},"/ja-jp/sales/","talk to sales",{"text":1807,"config":1808},"サポートを受ける",{"href":1809,"dataGaName":1810,"dataGaLocation":1471},"https://support.gitlab.com/hc/en-us","support portal",{"text":1812,"config":1813},"カスタマーポータル",{"href":1814,"dataGaName":1815,"dataGaLocation":1471},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1817,"login":1818,"suggestions":1825},"閉じる",{"text":1819,"link":1820},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1821,"config":1822},"GitLab.com",{"href":1485,"dataGaName":1823,"dataGaLocation":1824},"search login","search",{"text":1826,"default":1827},"提案",[1828,1830,1835,1837,1841,1845],{"text":1502,"config":1829},{"href":1507,"dataGaName":1502,"dataGaLocation":1824},{"text":1831,"config":1832},"コード提案（AI）",{"href":1833,"dataGaName":1834,"dataGaLocation":1824},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1538,"config":1836},{"href":1540,"dataGaName":1538,"dataGaLocation":1824},{"text":1838,"config":1839},"GitLab on AWS",{"href":1840,"dataGaName":1838,"dataGaLocation":1824},"/ja-jp/partners/technology-partners/aws/",{"text":1842,"config":1843},"GitLab on Google Cloud",{"href":1844,"dataGaName":1842,"dataGaLocation":1824},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1846,"config":1847},"GitLabを選ぶ理由",{"href":1515,"dataGaName":1848,"dataGaLocation":1824},"Why GitLab?",{"freeTrial":1850,"mobileIcon":1854,"desktopIcon":1859,"secondaryButton":1862},{"text":1473,"config":1851},{"href":1852,"dataGaName":1476,"dataGaLocation":1853},"https://gitlab.com/-/trials/new/","nav",{"altText":1855,"config":1856},"GitLabアイコン",{"src":1857,"dataGaName":1858,"dataGaLocation":1853},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1855,"config":1860},{"src":1861,"dataGaName":1858,"dataGaLocation":1853},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1635,"config":1863},{"href":1864,"dataGaName":1865,"dataGaLocation":1853},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1867,"mobileIcon":1871,"desktopIcon":1873},{"text":1868,"config":1869},"GitLab Duoの詳細について",{"href":1507,"dataGaName":1870,"dataGaLocation":1853},"gitlab duo",{"altText":1855,"config":1872},{"src":1857,"dataGaName":1858,"dataGaLocation":1853},{"altText":1855,"config":1874},{"src":1861,"dataGaName":1858,"dataGaLocation":1853},{"button":1876,"mobileIcon":1881,"desktopIcon":1883},{"text":1877,"config":1878},"/switch",{"href":1879,"dataGaName":1880,"dataGaLocation":1853},"#contact","switch",{"altText":1855,"config":1882},{"src":1857,"dataGaName":1858,"dataGaLocation":1853},{"altText":1855,"config":1884},{"src":1885,"dataGaName":1858,"dataGaLocation":1853},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1887,"mobileIcon":1892,"desktopIcon":1894},{"text":1888,"config":1889},"料金ページに戻る",{"href":1622,"dataGaName":1890,"dataGaLocation":1853,"icon":1891},"back to pricing","GoBack",{"altText":1855,"config":1893},{"src":1857,"dataGaName":1858,"dataGaLocation":1853},{"altText":1855,"config":1895},{"src":1861,"dataGaName":1858,"dataGaLocation":1853},{"title":1897,"button":1898,"config":1902},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":1513,"config":1899},{"href":1900,"dataGaName":1901,"dataGaLocation":1471},"/ja-jp/gitlab-orbit/","orbit",{"layout":1903,"disabled":1450},"release",{"data":1905},{"text":1906,"source":1907,"edit":1913,"contribute":1918,"config":1923,"items":1928,"minimal":2137},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1908,"config":1909},"ページのソースを表示",{"href":1910,"dataGaName":1911,"dataGaLocation":1912},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1914,"config":1915},"このページを編集",{"href":1916,"dataGaName":1917,"dataGaLocation":1912},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1919,"config":1920},"ご協力をお願いします",{"href":1921,"dataGaName":1922,"dataGaLocation":1912},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1924,"facebook":1925,"youtube":1926,"linkedin":1927},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1929,1974,2027,2070,2104],{"title":1620,"links":1930,"subMenu":1945},[1931,1935,1940],{"text":1932,"config":1933},"プランの表示",{"href":1622,"dataGaName":1934,"dataGaLocation":1912},"view plans",{"text":1936,"config":1937},"Premiumを選ぶ理由",{"href":1938,"dataGaName":1939,"dataGaLocation":1912},"/ja-jp/pricing/premium/","why premium",{"text":1941,"config":1942},"Ultimateを選ぶ理由",{"href":1943,"dataGaName":1944,"dataGaLocation":1912},"/ja-jp/pricing/ultimate/","why ultimate",[1946],{"title":1795,"links":1947},[1948,1950,1952,1954,1959,1964,1969],{"text":1795,"config":1949},{"href":1804,"dataGaName":1481,"dataGaLocation":1912},{"text":1807,"config":1951},{"href":1809,"dataGaName":1810,"dataGaLocation":1912},{"text":1812,"config":1953},{"href":1814,"dataGaName":1815,"dataGaLocation":1912},{"text":1955,"config":1956},"ステータス",{"href":1957,"dataGaName":1958,"dataGaLocation":1912},"https://status.gitlab.com/","status",{"text":1960,"config":1961},"利用規約",{"href":1962,"dataGaName":1963,"dataGaLocation":1912},"/terms/","terms of use",{"text":1965,"config":1966},"プライバシーに関する声明",{"href":1967,"dataGaName":1968,"dataGaLocation":1912},"/ja-jp/privacy/","privacy statement",{"text":1970,"config":1971},"Cookie 優先設定",{"dataGaName":1972,"dataGaLocation":1912,"id":1973,"isOneTrustButton":625},"cookie preferences","ot-sdk-btn",{"title":1518,"links":1975,"subMenu":1984},[1976,1980],{"text":1977,"config":1978},"DevSecOpsプラットフォーム",{"href":1500,"dataGaName":1979,"dataGaLocation":1912},"devsecops platform",{"text":1981,"config":1982},"AI支援開発",{"href":1507,"dataGaName":1983,"dataGaLocation":1912},"ai-assisted development",[1985],{"title":1986,"links":1987},"トピック",[1988,1992,1997,2002,2007,2012,2017,2022],{"text":1538,"config":1989},{"href":1990,"dataGaName":1991,"dataGaLocation":1912},"/ja-jp/topics/ci-cd/","cicd",{"text":1993,"config":1994},"GitOps",{"href":1995,"dataGaName":1996,"dataGaLocation":1912},"/ja-jp/topics/gitops/","gitops",{"text":1998,"config":1999},"DevOps",{"href":2000,"dataGaName":2001,"dataGaLocation":1912},"/ja-jp/topics/devops/","devops",{"text":2003,"config":2004},"バージョン管理",{"href":2005,"dataGaName":2006,"dataGaLocation":1912},"/ja-jp/topics/version-control/","version control",{"text":2008,"config":2009},"DevSecOps",{"href":2010,"dataGaName":2011,"dataGaLocation":1912},"/ja-jp/topics/devsecops/","devsecops",{"text":2013,"config":2014},"クラウドネイティブ",{"href":2015,"dataGaName":2016,"dataGaLocation":1912},"/ja-jp/topics/cloud-native/","cloud native",{"text":2018,"config":2019},"コーディングのためのAI",{"href":2020,"dataGaName":2021,"dataGaLocation":1912},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":2023,"config":2024},"エージェント型AI",{"href":2025,"dataGaName":2026,"dataGaLocation":1912},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":2028,"links":2029},"ソリューション",[2030,2033,2035,2040,2044,2047,2050,2053,2055,2057,2060,2065],{"text":1563,"config":2031},{"href":1558,"dataGaName":2032,"dataGaLocation":1912},"Application Security Testing",{"text":1550,"config":2034},{"href":1534,"dataGaName":1535,"dataGaLocation":1912},{"text":2036,"config":2037},"アジャイル開発",{"href":2038,"dataGaName":2039,"dataGaLocation":1912},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":2041,"config":2042},"SCM",{"href":1547,"dataGaName":2043,"dataGaLocation":1912},"source code management",{"text":1538,"config":2045},{"href":1540,"dataGaName":2046,"dataGaLocation":1912},"continuous integration & delivery",{"text":1589,"config":2048},{"href":1591,"dataGaName":2049,"dataGaLocation":1912},"value stream management",{"text":1993,"config":2051},{"href":2052,"dataGaName":1996,"dataGaLocation":1912},"/ja-jp/solutions/gitops/",{"text":1602,"config":2054},{"href":1605,"dataGaName":1606,"dataGaLocation":1912},{"text":1608,"config":2056},{"href":1611,"dataGaName":1612,"dataGaLocation":1912},{"text":2058,"config":2059},"公共機関",{"href":1617,"dataGaName":1618,"dataGaLocation":1912},{"text":2061,"config":2062},"教育",{"href":2063,"dataGaName":2064,"dataGaLocation":1912},"/ja-jp/solutions/education/","education",{"text":2066,"config":2067},"金融サービス",{"href":2068,"dataGaName":2069,"dataGaLocation":1912},"/ja-jp/solutions/finance/","financial services",{"title":2071,"links":2072},"リソース",[2073,2075,2077,2079,2083,2085,2088,2090,2092,2094,2096,2098,2100,2102],{"text":1638,"config":2074},{"href":1640,"dataGaName":1641,"dataGaLocation":1912},{"text":1643,"config":2076},{"href":1645,"dataGaName":1646,"dataGaLocation":1912},{"text":1648,"config":2078},{"href":1650,"dataGaName":1651,"dataGaLocation":1912},{"text":1653,"config":2080},{"href":2081,"dataGaName":2082,"dataGaLocation":1912},"https://docs.gitlab.com/ja-jp","docs",{"text":1676,"config":2084},{"href":1678,"dataGaName":1679,"dataGaLocation":1912},{"text":2086,"config":2087},"最新リリース",{"href":1736,"dataGaName":1737,"dataGaLocation":1912},{"text":1671,"config":2089},{"href":1673,"dataGaName":1674,"dataGaLocation":1912},{"text":1690,"config":2091},{"href":1692,"dataGaName":1693,"dataGaLocation":1912},{"text":1698,"config":2093},{"href":1700,"dataGaName":1701,"dataGaLocation":1912},{"text":1703,"config":2095},{"href":1705,"dataGaName":1706,"dataGaLocation":1912},{"text":1708,"config":2097},{"href":1710,"dataGaName":1711,"dataGaLocation":1912},{"text":1713,"config":2099},{"href":1715,"dataGaName":1716,"dataGaLocation":1912},{"text":1718,"config":2101},{"href":1720,"dataGaName":1721,"dataGaLocation":1912},{"text":1723,"config":2103},{"href":1725,"dataGaName":1726,"dataGaLocation":1912},{"title":2105,"links":2106},"会社情報",[2107,2109,2111,2113,2115,2117,2121,2126,2128,2130,2132],{"text":1747,"config":2108},{"href":1749,"dataGaName":1741,"dataGaLocation":1912},{"text":1752,"config":2110},{"href":1754,"dataGaName":1755,"dataGaLocation":1912},{"text":1760,"config":2112},{"href":1762,"dataGaName":1763,"dataGaLocation":1912},{"text":1765,"config":2114},{"href":1767,"dataGaName":1768,"dataGaLocation":1912},{"text":1770,"config":2116},{"href":1772,"dataGaName":1773,"dataGaLocation":1912},{"text":2118,"config":2119},"Sustainability",{"href":2120,"dataGaName":2118,"dataGaLocation":1912},"/sustainability/",{"text":2122,"config":2123},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":2124,"dataGaName":2125,"dataGaLocation":1912},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1775,"config":2127},{"href":1777,"dataGaName":1778,"dataGaLocation":1912},{"text":1785,"config":2129},{"href":1787,"dataGaName":1788,"dataGaLocation":1912},{"text":1790,"config":2131},{"href":1792,"dataGaName":1793,"dataGaLocation":1912},{"text":2133,"config":2134},"現代奴隷制の透明性に関する声明",{"href":2135,"dataGaName":2136,"dataGaLocation":1912},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2138},[2139,2141,2144],{"text":1960,"config":2140},{"href":1962,"dataGaName":1963,"dataGaLocation":1912},{"text":2142,"config":2143},"Cookieの設定",{"dataGaName":1972,"dataGaLocation":1912,"id":1973,"isOneTrustButton":625},{"text":1965,"config":2145},{"href":1967,"dataGaName":1968,"dataGaLocation":1912},[2147,2161],{"id":2148,"title":7,"body":1449,"config":2149,"content":2151,"description":1449,"extension":2155,"meta":2156,"navigation":625,"path":2157,"seo":2158,"stem":2159,"__hash__":2160},"blogAuthors/en-us/blog/authors/ivan-nemytchenko.yml",{"template":2150},"BlogAuthor",{"name":7,"config":2152},{"headshot":2153,"ctfId":2154},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","Ivan-Nemytchenko","yml",{},"/en-us/blog/authors/ivan-nemytchenko",{},"en-us/blog/authors/ivan-nemytchenko","LIveI3a-Zqab8RyZk3ijJwKPTck0i-FN_JanwQMOZr4",{"id":2162,"title":8,"body":1449,"config":2163,"content":2164,"description":1449,"extension":2155,"meta":2168,"navigation":625,"path":2169,"seo":2170,"stem":2171,"__hash__":2172},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":2150},{"name":8,"config":2165},{"headshot":2166,"ctfId":2167},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[2174,2181,2188],{"title":2175,"description":2175,"heroImage":2176,"category":1445,"date":2177,"authors":2178,"slug":2180,"externalUrl":1449},"MCPサーバーとは？仕組みやソフトウェア開発の活用例をわかりやすく解説","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786001428/qedvughylmeposoqm5zs.jpg","2026-08-07",[2179],"GitLab Team","what-is-mcp-server",{"title":2182,"description":2183,"heroImage":2184,"category":1445,"date":2185,"authors":2186,"slug":2187,"externalUrl":1449},"イテレーションとは？意味や進め方、おすすめの支援ツールを紹介","イテレーションとは、アジャイル開発における「反復」を意味する開発単位です。本記事では、イテレーションの意味やスプリントとの違い、具体的な進め方、成功のポイントをわかりやすく解説します。アジャイル開発を支援するツールもあわせて紹介します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785816755/mj23yaguu0gxvbztd6pl.jpg","2026-08-06",[2179],"what-is-iteration",{"title":2189,"description":2190,"heroImage":2191,"category":1445,"date":2185,"authors":2192,"slug":2195,"externalUrl":1449},"GitLab Self-Hostedで実現するコンフィデンシャルAI","ソースコードをハードウェアで暗号化された境界の外に出すことなく、GitLab DuoのAIコーディングエージェントを開発者に提供します。GPUは不要です。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png",[2193,2194],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"promotions":2197},[2198,2212,2224,2236],{"id":2199,"categories":2200,"header":2202,"text":2203,"button":2204,"image":2209},"ai-modernization",[2201],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":2205,"config":2206},"AI成熟度スコアを確認する",{"href":2207,"dataGaName":2208,"dataGaLocation":1679},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":2210},{"src":2211},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2213,"categories":2214,"header":2216,"text":2203,"button":2217,"image":2221},"devops-modernization",[2215,2011],"product","単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":2218,"config":2219},"DevOps成熟度スコアを確認しましょう",{"href":2220,"dataGaName":2208,"dataGaLocation":1679},"/ja-jp/assessments/devops-modernization-assessment/",{"config":2222},{"src":2223},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2225,"categories":2226,"header":2228,"text":2203,"button":2229,"image":2233},"security-modernization",[2227],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":2230,"config":2231},"セキュリティ成熟度スコアを確認しましょう",{"href":2232,"dataGaName":2208,"dataGaLocation":1679},"/ja-jp/assessments/security-modernization-assessment/",{"config":2234},{"src":2235},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2237,"paths":2238,"header":2241,"text":2242,"button":2243,"image":2248},"github-azure-migration",[2239,2240],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":2244,"config":2245},"GitLabとGitHubの比較を見る",{"href":2246,"dataGaName":2247,"dataGaLocation":1679},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2249},{"src":2223},{"header":2251,"blurb":2252,"button":2253,"secondaryButton":2257},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1473,"config":2254},{"href":2255,"dataGaName":1476,"dataGaLocation":2256},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1795,"config":2258},{"href":1804,"dataGaName":1481,"dataGaLocation":2256},1786803789943]