[{"data":1,"prerenderedAt":2692},["ShallowReactive",2],{"/ja-jp/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab":3,"navigation-ja-jp":1900,"banner-ja-jp":2328,"footer-ja-jp":2335,"blog-post-authors-ja-jp-Benjamin Skierlak|James Wormwell":2577,"blog-related-posts-ja-jp-from-code-to-production-a-guide-to-continuous-deployment-with-gitlab":2604,"blog-promotions-ja-jp":2630,"next-steps-ja-jp":2683},{"id":4,"title":5,"authors":6,"body":9,"category":1877,"date":1878,"description":1879,"extension":1880,"externalUrl":1881,"faq":1881,"featured":1882,"heroImage":1883,"meta":1884,"navigation":396,"path":1885,"seo":1886,"slug":1890,"stem":1891,"tags":1892,"template":1897,"updatedDate":1898,"__hash__":1899},"blogPosts/ja-jp/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab.md","コードから本番環境へ：GitLabを活用した継続的デプロイのガイド",[7,8],"Benjamin Skierlak","James Wormwell",{"type":10,"value":11,"toc":1859},"minimark",[12,16,19,23,26,30,33,58,61,75,78,82,85,143,146,149,160,163,166,177,180,183,197,200,203,217,220,224,227,230,233,236,247,263,267,295,298,317,320,325,329,366,416,420,423,545,549,552,560,563,571,575,582,644,647,653,661,666,674,684,692,701,720,728,737,741,744,825,828,842,845,849,852,858,896,899,902,981,983,997,1001,1004,1042,1049,1060,1063,1067,1070,1253,1256,1267,1274,1278,1284,1354,1357,1474,1477,1572,1575,1632,1635,1646,1649,1655,1662,1666,1669,1675,1678,1695,1698,1714,1717,1720,1737,1740,1743,1746,1749,1766,1769,1772,1789,1792,1795,1812,1816,1819,1823,1826,1836,1843,1853,1856],[13,14,15],"p",{},"継続的デプロイは、チームがより迅速かつ高い信頼性で価値を生み出せる画期的な手法です。しかし、GitOpsやKubernetesを用いたコンテナオーケストレーション、動的環境などの高度なデプロイワークフローに取り組むのは、継続的デプロイの導入を始めたばかりのチームにとってはハードルが高いと感じられるかもしれません。",[13,17,18],{},"GitLabでは、シームレスかつスケーラブルなデリバリーを実現することに注力しています。チームが基本に集中できるようにすることで、時間をかけてより複雑な戦略へと発展できる、強固な基盤を構築できます。このガイドでは、GitLabを活用した継続的デプロイの導入に必要な基本的なステップを紹介し、長期的な成功のための土台作りをサポートします。",[20,21,22],"h2",{"id":22},"まずはワークフローの計画から",[13,24,25],{},"技術的な実装に入る前に、デプロイワークフローをしっかりと設計する時間を取りましょう。成功の鍵は、慎重な計画と体系的なアプローチにあります。",[27,28,29],"h3",{"id":29},"アーティファクト管理戦略",[13,31,32],{},"継続的デプロイにおいて、アーティファクトとは、ビルドプロセスによって生成されるパッケージ化された成果物を指し、保存、バージョン管理、デプロイが必要です。アーティファクトには、次のようなものが含まれます。",[34,35,36,40,43,46,49,52,55],"ul",{},[37,38,39],"li",{},"アプリケーション用のコンテナイメージ",[37,41,42],{},"パッケージ",[37,44,45],{},"コンパイル済みのバイナリや実行ファイル",[37,47,48],{},"ライブラリ",[37,50,51],{},"設定ファイル",[37,53,54],{},"ドキュメントパッケージ",[37,56,57],{},"その他のアーティファクト",[13,59,60],{},"各アーティファクトは、デプロイプロセスにおいて特定の役割を果たします。たとえば、一般的なWebアプリケーションでは、次のようなアーティファクトが生成されることがあります。",[34,62,63,66,69,72],{},[37,64,65],{},"バックエンドサービス用のコンテナイメージ",[37,67,68],{},"コンパイル済みフロントエンドアセットのZIPアーカイブ",[37,70,71],{},"データベース変更用のSQLファイル",[37,73,74],{},"環境ごとの設定ファイル",[13,76,77],{},"アーティファクトの適切な管理はデプロイを成功させる鍵となります。ここからは、アーティファクト管理のアプローチについて詳しく見ていきましょう。",[79,80,81],"h4",{"id":81},"アーティファクトとリリースのバージョニング戦略",[13,83,84],{},"クリーンで整理された構造を保つためのベストプラクティスとして、アーティファクトの明確なバージョニング戦略を確立することが重要です。リリース作成時のポイントは以下のとおりです。",[34,86,87,109,121,132],{},[37,88,89,90],{},"リリースタグにセマンティックバージョニング（major.minor.patch）を使用する",[34,91,92,100,103,106],{},[37,93,94,95,99],{},"例：安定版リリースが",[96,97,98],"code",{},"myapp:1.2.3","の場合",[37,101,102],{},"破壊的な変更がある場合は、メジャーバージョン変更（2.0.0）",[37,104,105],{},"新機能を追加する場合は、マイナーバージョン変更（1.3.0）",[37,107,108],{},"バグ修正を行う場合は、パッチバージョン変更（1.2.4）",[37,110,111,112],{},"最新の安定版を示す「latest」タグを維持する",[34,113,114],{},[37,115,116,117,120],{},"例：",[96,118,119],{},"myapp:latest","（自動デプロイ用）",[37,122,123,124],{},"コミットSHAを含めることで、正確なバージョン追跡を行う",[34,125,126],{},[37,127,116,128,131],{},[96,129,130],{},"myapp:1.2.3-abc123f","（デバッグ用）",[37,133,134,135],{},"開発環境向けにブランチベースのタグを使用する",[34,136,137],{},[37,138,116,139,142],{},[96,140,141],{},"myapp:feature-user-auth","（新機能テスト用）",[79,144,145],{"id":145},"ビルドアーティファクトの保持",[13,147,148],{},"明確な保持ルールを実装しましょう。",[34,150,151,154,157],{},[37,152,153],{},"一時的なアーティファクトの明確な有効期限を設定する",[37,155,156],{},"永続的に保持する必要があるアーティファクトを定義する",[37,158,159],{},"ストレージ管理のためのクリーンアップポリシーを設定する",[79,161,162],{"id":162},"レジストリアクセスと認証",[13,164,165],{},"適切なアクセス制御でアーティファクトのセキュリティを確保しましょう。",[34,167,168,171,174],{},[37,169,170],{},"デベロッパーのアクセス用にパーソナルアクセストークンを実装する",[37,172,173],{},"パイプラインの認証にCI/CD変数を設定する",[37,175,176],{},"適切なアクセススコープを設定する",[27,178,179],{"id":179},"環境戦略",[13,181,182],{},"環境設計はデプロイパイプライン全体の構成に影響を与えるため、早い段階で検討しましょう。",[34,184,185,188,191,194],{},[37,186,187],{},"開発、ステージング環境、本番環境の設定",[37,189,190],{},"環境ごとの変数とシークレットの管理",[37,192,193],{},"アクセス制御と保護ルールの設定",[37,195,196],{},"デプロイの追跡とモニタリングのアプローチ",[27,198,199],{"id":199},"デプロイターゲット",[13,201,202],{},"どこに、どのようにデプロイするのかを慎重に検討しましょう。これらの決定は重要であり、それぞれのメリットとデメリットを考慮する必要があります。",[34,204,205,208,211,214],{},[37,206,207],{},"インフラ要件（仮想マシン、コンテナ、クラウドサービス）",[37,209,210],{},"ネットワークアクセスとセキュリティ設定",[37,212,213],{},"認証メカニズム（SSH鍵、アクセストークン）",[37,215,216],{},"リソースの割り当てとスケーリングの考慮",[13,218,219],{},"これで戦略が定まり、基盤となる決定が完了したので、これらの計画を実際に動作するパイプラインに落とし込んでいきます。それでは、実際に機能する例を作ることで概念を深掘りしていきましょう。まずはシンプルなアプリケーションから始め、徐々にデプロイの機能を追加していきます。",[20,221,223],{"id":222},"cdパイプラインの実装","CDパイプラインの実装",[27,225,226],{"id":226},"具体的な手順",[13,228,229],{},"Webアプリケーション向けの基本的な継続的デプロイ（CD）パイプラインの実装手順を順を追って説明します。例としてシンプルなHTMLアプリケーションを使用しますが、ここで紹介する原則はどのタイプのアプリケーションにも応用できます。今回は、アプリケーションをDockerイメージとしてパッケージ化し、シンプルな仮想マシン上にデプロイします。これにより、最小限の依存関係を持つ厳選されたイメージを活用し、環境依存の要件が意図せず混入するのを防ぐことができます。また、仮想マシン上で動作させることで、GitLabのネイティブなインテグレーション機能を活用しない設定となります。複雑で本格的な環境ではなく、理解しやすい簡易的な環境から始めてみましょう。",[79,231,232],{"id":232},"前提条件",[13,234,235],{},"この例では、クラウドプロバイダーの仮想マシン上で実行するアプリケーションをコンテナ化することを目指します。また、ローカル環境でもこのアプリケーションをテストします。以下の前提条件は、このシナリオにおいてのみ必要なものです。",[237,238,240,246],"h5",{"id":239},"仮想マシンvmのセットアップ",[241,242,245],"a",{"href":243,"rel":244},"https://about.gitlab.com/ja-jp/blog/what-is-vm/",[],"仮想マシン（VM）","のセットアップ",[34,248,249,257,260],{},[37,250,251,252,256],{},"お好みのクラウドプロバイダーで",[241,253,255],{"href":243,"rel":254},[],"VM","をプロビジョニングします（例：GCP、AWS、Azure）",[37,258,259],{},"ネットワークルールを設定し、ポート22、80、443へのアクセスを許可します",[37,261,262],{},"デプロイ用にマシンのパブリックIPアドレスを記録します",[237,264,266],{"id":265},"ssh認証のセットアップ","SSH認証のセットアップ：",[34,268,269,272,280,286,289,292],{},[37,270,271],{},"マシン用の公開鍵と秘密鍵のペアを生成します",[37,273,274,275,279],{},"GitLabで",[276,277,278],"strong",{},"設定 > CI/CD > 変数","を開きます",[37,281,282,285],{},[96,283,284],{},"GITLAB_KEY","という変数を作成します",[37,287,288],{},"タイプを「ファイル」に設定します（SSH認証に必須）",[37,290,291],{},"秘密鍵を「値」フィールドに貼り付けます",[37,293,294],{},"「ユーザー」変数を定義します（VMにログインしてスクリプトを実行するユーザー）",[237,296,297],{"id":297},"デプロイ変数の設定",[34,299,300],{},[37,301,302,303],{},"デプロイターゲット用の変数を作成します",[34,304,305,311],{},[37,306,307,310],{},[96,308,309],{},"STAGING_TARGET","：ステージング環境のサーバーIPまたはドメイン",[37,312,313,316],{},[96,314,315],{},"PRODUCTION_TARGET","：本番環境のサーバーIPまたはドメイン",[237,318,319],{"id":319},"ローカル開発環境のセットアップ",[34,321,322],{},[37,323,324],{},"デプロイのテスト用に、ローカルマシンにDockerをインストールします",[237,326,328],{"id":327},"gitlabコンテナレジストリへのアクセス","GitLabコンテナレジストリへのアクセス",[34,330,331,344,363],{},[37,332,333,334],{},"レジストリパスを確認します：",[34,335,336,341],{},[37,337,338,279],{},[276,339,340],{},"デプロイ > コンテナレジストリ",[37,342,343],{},"レジストリパスをコピーします（例：registry.gitlab.com/group/project）",[37,345,346,347],{},"認証の設定：",[34,348,349,354,357,360],{},[37,350,351,279],{},[276,352,353],{},"設定 > アクセストークン",[37,355,356],{},"レジストリアクセス権を持つ新しいトークンを作成します",[37,358,359],{},"トークンの有効期限を最大1年に設定します",[37,361,362],{},"トークンを安全に保存します",[37,364,365],{},"ローカルレジストリのアクセス設定：",[367,368,373],"pre",{"className":369,"code":370,"language":371,"meta":372,"style":372},"language-shell shiki shiki-themes github-light","docker login registry.gitlab.com\n\n# パーソナルアクセストークンを使用する場合のユーザー名はgitlab-ci-tokenです\n\n# Password:（ここにアクセストークンを入力）\n","shell","",[96,374,375,391,398,405,410],{"__ignoreMap":372},[376,377,380,384,388],"span",{"class":378,"line":379},"line",1,[376,381,383],{"class":382},"s7eDp","docker",[376,385,387],{"class":386},"sYBdl"," login",[376,389,390],{"class":386}," registry.gitlab.com\n",[376,392,394],{"class":378,"line":393},2,[376,395,397],{"emptyLinePlaceholder":396},true,"\n",[376,399,401],{"class":378,"line":400},3,[376,402,404],{"class":403},"sAwPA","# パーソナルアクセストークンを使用する場合のユーザー名はgitlab-ci-tokenです\n",[376,406,408],{"class":378,"line":407},4,[376,409,397],{"emptyLinePlaceholder":396},[376,411,413],{"class":378,"line":412},5,[376,414,415],{"class":403},"# Password:（ここにアクセストークンを入力）\n",[79,417,419],{"id":418},"_1-アプリケーションを作成する","1. アプリケーションを作成する",[13,421,422],{},"基本的なWebアプリケーションから始めましょう。今回の例では、シンプルなHTMLページを使用します。",[367,424,428],{"className":425,"code":426,"language":427,"meta":372,"style":372},"language-xml shiki shiki-themes github-light","\u003C!|||UNTRANSLATED_CONTENT_START|||-- index.html -->\n\n\u003Chtml>\n  \u003Chead>\n    \u003Cstyle>\n      body {\n        background-color: #171321; /* GitLab dark */\n      }\n    \u003C/style>\n  \u003C/head>\n  \u003Cbody>\n    \u003C!|||UNTRANSLATED_CONTENT_END|||-- ここにコンテンツを追加 -->\n  \u003C/body>\n\u003C/html>\n","xml",[96,429,430,436,440,452,462,472,478,484,490,500,510,520,526,535],{"__ignoreMap":372},[376,431,432],{"class":378,"line":379},[376,433,435],{"class":434},"sgsFI","\u003C!|||UNTRANSLATED_CONTENT_START|||-- index.html -->\n",[376,437,438],{"class":378,"line":393},[376,439,397],{"emptyLinePlaceholder":396},[376,441,442,445,449],{"class":378,"line":400},[376,443,444],{"class":434},"\u003C",[376,446,448],{"class":447},"shJU0","html",[376,450,451],{"class":434},">\n",[376,453,454,457,460],{"class":378,"line":407},[376,455,456],{"class":434},"  \u003C",[376,458,459],{"class":447},"head",[376,461,451],{"class":434},[376,463,464,467,470],{"class":378,"line":412},[376,465,466],{"class":434},"    \u003C",[376,468,469],{"class":447},"style",[376,471,451],{"class":434},[376,473,475],{"class":378,"line":474},6,[376,476,477],{"class":434},"      body {\n",[376,479,481],{"class":378,"line":480},7,[376,482,483],{"class":434},"        background-color: #171321; /* GitLab dark */\n",[376,485,487],{"class":378,"line":486},8,[376,488,489],{"class":434},"      }\n",[376,491,493,496,498],{"class":378,"line":492},9,[376,494,495],{"class":434},"    \u003C/",[376,497,469],{"class":447},[376,499,451],{"class":434},[376,501,503,506,508],{"class":378,"line":502},10,[376,504,505],{"class":434},"  \u003C/",[376,507,459],{"class":447},[376,509,451],{"class":434},[376,511,513,515,518],{"class":378,"line":512},11,[376,514,456],{"class":434},[376,516,517],{"class":447},"body",[376,519,451],{"class":434},[376,521,523],{"class":378,"line":522},12,[376,524,525],{"class":434},"    \u003C!|||UNTRANSLATED_CONTENT_END|||-- ここにコンテンツを追加 -->\n",[376,527,529,531,533],{"class":378,"line":528},13,[376,530,505],{"class":434},[376,532,517],{"class":447},[376,534,451],{"class":434},[376,536,538,541,543],{"class":378,"line":537},14,[376,539,540],{"class":434},"\u003C/",[376,542,448],{"class":447},[376,544,451],{"class":434},[79,546,548],{"id":547},"_2-アプリケーションをコンテナ化する","2. アプリケーションをコンテナ化する",[13,550,551],{},"アプリケーションをパッケージ化するために、Dockerfileを作成します：",[367,553,558],{"className":554,"code":556,"language":557,"meta":372},[555],"language-text","FROM nginx:1.26.2\n\nCOPY index.html /usr/share/nginx/html/index.html\n","text",[96,559,556],{"__ignoreMap":372},[13,561,562],{},"このDockerfileは",[34,564,565,568],{},[37,566,567],{},"nginxをベースイメージとして使用し、Webコンテンツを配信できるようにします",[37,569,570],{},"作成したindex.htmlをnginxのディレクトリ構造内の適切な場所にコピーします",[79,572,574],{"id":573},"_3-cicdパイプラインを設定する","3. CI/CDパイプラインを設定する",[13,576,577,578,581],{},"GitLabのパイプラインステージを定義するために、",[96,579,580],{},".gitlab-ci.yml","ファイル を作成します：",[367,583,587],{"className":584,"code":585,"language":586,"meta":372,"style":372},"language-yaml shiki shiki-themes github-light","variables:\n  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest\n  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA\n\nstages:\n  - publish\n  - deploy\n\n","yaml",[96,588,589,597,608,618,622,629,637],{"__ignoreMap":372},[376,590,591,594],{"class":378,"line":379},[376,592,593],{"class":447},"variables",[376,595,596],{"class":434},":\n",[376,598,599,602,605],{"class":378,"line":393},[376,600,601],{"class":447},"  TAG_LATEST",[376,603,604],{"class":434},": ",[376,606,607],{"class":386},"$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest\n",[376,609,610,613,615],{"class":378,"line":400},[376,611,612],{"class":447},"  TAG_COMMIT",[376,614,604],{"class":434},[376,616,617],{"class":386},"$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA\n",[376,619,620],{"class":378,"line":407},[376,621,397],{"emptyLinePlaceholder":396},[376,623,624,627],{"class":378,"line":412},[376,625,626],{"class":447},"stages",[376,628,596],{"class":434},[376,630,631,634],{"class":378,"line":474},[376,632,633],{"class":434},"  - ",[376,635,636],{"class":386},"publish\n",[376,638,639,641],{"class":378,"line":480},[376,640,633],{"class":434},[376,642,643],{"class":386},"deploy\n",[13,645,646],{},"解説：",[13,648,649,652],{},[96,650,651],{},"TAG_LATEST","は、次の3つの要素で構成されています：",[34,654,655],{},[37,656,657,660],{},[96,658,659],{},"$CI_REGISTRY_IMAGE","：GitLabのプロジェクトのコンテナレジストリのパス",[13,662,116,663],{},[96,664,665],{},"registry.gitlab.com/your-group/your-project",[34,667,668],{},[37,669,670,673],{},[96,671,672],{},"$CI_COMMIT_REF_NAME","：ブランチ名またはタグ名",[13,675,676,677,680,681],{},"例：ブランチの場合は",[96,678,679],{},"/main","、フィーチャーブランチの場合は",[96,682,683],{},"/feature-login",[34,685,686],{},[37,687,688,691],{},[96,689,690],{},":latest","：固定のサフィックス",[13,693,694,695,697,698],{},"これにより、mainブランチの",[96,696,651],{},"は次のようになります：",[96,699,700],{},"registry.gitlab.com/your-group/your-project/main:latest",[13,702,703,706,707,709,710,712,713,716,717],{},[96,704,705],{},"TAG_COMMIT","は",[96,708,651],{},"とほぼ同じですが、",[96,711,690],{},"の代わりにコミット識別子の",[96,714,715],{},"$CI_COMMIT_SHA","を使います。例：",[96,718,719],{},":abc123def456",[13,721,722,723,697,725],{},"したがって、同じmainブランチでの",[96,724,705],{},[96,726,727],{},"registry.gitlab.com/your-group/your-project/main:abc123def456",[13,729,730,731,733,734,736],{},"両方のタグを使用する理由は、",[96,732,651],{},"が常に最新バージョンを取得しやすくするのに対し、",[96,735,705],{},"は必要に応じて特定のバージョンに戻れるようにするためです。",[79,738,740],{"id":739},"_4-コンテナレジストリに公開する","4. コンテナレジストリに公開する",[13,742,743],{},"パイプラインに公開ジョブを追加します：",[367,745,747],{"className":584,"code":746,"language":586,"meta":372,"style":372},"publish:\n  stage: publish\n  image: docker:latest\n  services:\n    - docker:dind\n  script:\n    - docker build -t $TAG_LATEST -t $TAG_COMMIT .\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $TAG_LATEST\n    - docker push $TAG_COMMIT\n\n",[96,748,749,756,765,775,782,790,797,804,811,818],{"__ignoreMap":372},[376,750,751,754],{"class":378,"line":379},[376,752,753],{"class":447},"publish",[376,755,596],{"class":434},[376,757,758,761,763],{"class":378,"line":393},[376,759,760],{"class":447},"  stage",[376,762,604],{"class":434},[376,764,636],{"class":386},[376,766,767,770,772],{"class":378,"line":400},[376,768,769],{"class":447},"  image",[376,771,604],{"class":434},[376,773,774],{"class":386},"docker:latest\n",[376,776,777,780],{"class":378,"line":407},[376,778,779],{"class":447},"  services",[376,781,596],{"class":434},[376,783,784,787],{"class":378,"line":412},[376,785,786],{"class":434},"    - ",[376,788,789],{"class":386},"docker:dind\n",[376,791,792,795],{"class":378,"line":474},[376,793,794],{"class":447},"  script",[376,796,596],{"class":434},[376,798,799,801],{"class":378,"line":480},[376,800,786],{"class":434},[376,802,803],{"class":386},"docker build -t $TAG_LATEST -t $TAG_COMMIT .\n",[376,805,806,808],{"class":378,"line":486},[376,807,786],{"class":434},[376,809,810],{"class":386},"docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n",[376,812,813,815],{"class":378,"line":492},[376,814,786],{"class":434},[376,816,817],{"class":386},"docker push $TAG_LATEST\n",[376,819,820,822],{"class":378,"line":502},[376,821,786],{"class":434},[376,823,824],{"class":386},"docker push $TAG_COMMIT\n",[13,826,827],{},"このジョブは",[34,829,830,833,836,839],{},[37,831,832],{},"Docker-in-Dockerを使用してイメージをビルドします",[37,834,835],{},"2つのタグを付けたイメージを作成します",[37,837,838],{},"GitLabレジストリへの認証を行います",[37,840,841],{},"両方のイメージをレジストリにプッシュします",[13,843,844],{},"これで、コンテナイメージが安全にレジストリに保存されました。次は、ターゲット環境へのデプロイを進めていきます。本番環境へ移行する前に、まずローカル環境でテストを行い、設定が正しく機能していることを確認しましょう。",[79,846,848],{"id":847},"_5-環境へデプロイする","5. 環境へデプロイする",[13,850,851],{},"本番環境にデプロイする前に、ローカル環境でテストできます。先ほどGitLabレジストリにイメージを公開したので、それをローカル環境でプルしてテストします。コンテナイメージのパスが分からない場合は、GitLabの**デプロイ",[853,854,855],"blockquote",{},[13,856,857],{},"コンテナレジストリ**に移動し、該当のコンテナイメージの行末にあるアイコンをクリックすると、パスをコピーできます。",[367,859,861],{"className":369,"code":860,"language":371,"meta":372,"style":372},"docker login registry.gitlab.com \n\ndocker run -p 80:80 registry.gitlab.com/your-project-path/main:latest\n",[96,862,863,875,879],{"__ignoreMap":372},[376,864,865,867,869,872],{"class":378,"line":379},[376,866,383],{"class":382},[376,868,387],{"class":386},[376,870,871],{"class":386}," registry.gitlab.com",[376,873,874],{"class":434}," \n",[376,876,877],{"class":378,"line":393},[376,878,397],{"emptyLinePlaceholder":396},[376,880,881,883,886,890,893],{"class":378,"line":400},[376,882,383],{"class":382},[376,884,885],{"class":386}," run",[376,887,889],{"class":888},"sYu0t"," -p",[376,891,892],{"class":386}," 80:80",[376,894,895],{"class":386}," registry.gitlab.com/your-project-path/main:latest\n",[13,897,898],{},"これにより、Webブラウザからlocalhostにアクセスし、ローカル環境でアプリケーションを確認できるようになります。",[13,900,901],{},"それでは、パイプラインにデプロイジョブを追加しましょう：",[367,903,905],{"className":584,"code":904,"language":586,"meta":372,"style":372},"deploy:\n  stage: deploy\n  image: alpine:latest\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$TARGET_SERVER \n      docker pull $TAG_COMMIT &&\n      docker rm -f myapp || true &&\n      docker run -d -p 80:80 --name myapp $TAG_COMMIT\n\n",[96,906,907,914,922,931,937,944,951,957,966,971,976],{"__ignoreMap":372},[376,908,909,912],{"class":378,"line":379},[376,910,911],{"class":447},"deploy",[376,913,596],{"class":434},[376,915,916,918,920],{"class":378,"line":393},[376,917,760],{"class":447},[376,919,604],{"class":434},[376,921,643],{"class":386},[376,923,924,926,928],{"class":378,"line":400},[376,925,769],{"class":447},[376,927,604],{"class":434},[376,929,930],{"class":386},"alpine:latest\n",[376,932,933,935],{"class":378,"line":407},[376,934,794],{"class":447},[376,936,596],{"class":434},[376,938,939,941],{"class":378,"line":412},[376,940,786],{"class":434},[376,942,943],{"class":386},"chmod 400 $GITLAB_KEY\n",[376,945,946,948],{"class":378,"line":474},[376,947,786],{"class":434},[376,949,950],{"class":386},"apk add openssh-client\n",[376,952,953,955],{"class":378,"line":480},[376,954,786],{"class":434},[376,956,810],{"class":386},[376,958,959,961,964],{"class":378,"line":486},[376,960,786],{"class":434},[376,962,963],{"class":386},"ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$TARGET_SERVER",[376,965,874],{"class":434},[376,967,968],{"class":378,"line":492},[376,969,970],{"class":386},"      docker pull $TAG_COMMIT &&\n",[376,972,973],{"class":378,"line":502},[376,974,975],{"class":386},"      docker rm -f myapp || true &&\n",[376,977,978],{"class":378,"line":512},[376,979,980],{"class":386},"      docker run -d -p 80:80 --name myapp $TAG_COMMIT\n",[13,982,827],{},[34,984,985,988,991,994],{},[37,986,987],{},"デプロイ先のサーバーへのSSHアクセスを確立します",[37,989,990],{},"最新のコンテナイメージをプルします",[37,992,993],{},"既存のコンテナを削除します",[37,995,996],{},"新しいバージョンのコンテナをデプロイします",[79,998,1000],{"id":999},"_6-デプロイを追跡する","6. デプロイを追跡する",[13,1002,1003],{},"環境設定を追加してデプロイの追跡を有効にします：",[367,1005,1007],{"className":584,"code":1006,"language":586,"meta":372,"style":372},"deploy:\n  environment:\n    name: production\n    url: https://your-application-url.com \n\n",[96,1008,1009,1015,1022,1032],{"__ignoreMap":372},[376,1010,1011,1013],{"class":378,"line":379},[376,1012,911],{"class":447},[376,1014,596],{"class":434},[376,1016,1017,1020],{"class":378,"line":393},[376,1018,1019],{"class":447},"  environment",[376,1021,596],{"class":434},[376,1023,1024,1027,1029],{"class":378,"line":400},[376,1025,1026],{"class":447},"    name",[376,1028,604],{"class":434},[376,1030,1031],{"class":386},"production\n",[376,1033,1034,1037,1039],{"class":378,"line":407},[376,1035,1036],{"class":447},"    url",[376,1038,604],{"class":434},[376,1040,1041],{"class":386},"https://your-application-url.com\n",[13,1043,1044,1045,1048],{},"これにより、GitLabの",[276,1046,1047],{},"オペレーション > 環境","セクションに環境オブジェクトが作成され、以下の情報が提供されます：",[34,1050,1051,1054,1057],{},[37,1052,1053],{},"デプロイ履歴",[37,1055,1056],{},"現在のデプロイ状況",[37,1058,1059],{},"アプリケーションへのクイックアクセス",[13,1061,1062],{},"単一の環境向けのパイプラインは、最初のステップとしては有効ですが、ほとんどのチームでは適切なテストやステージングを行うために複数の環境を管理する必要があります。このより実践的なシナリオに対応するために、パイプラインを拡張していきましょう。",[79,1064,1066],{"id":1065},"_7-複数環境をセットアップする","7. 複数環境をセットアップする",[13,1068,1069],{},"より堅牢なパイプラインを構築するために、ステージング環境と本番環境のデプロイを設定します：",[367,1071,1073],{"className":584,"code":1072,"language":586,"meta":372,"style":372},"stages:\n  - publish\n  - staging\n  - release\n  - version\n  - production\n\nstaging:\n  stage: staging\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  environment:\n    name: staging\n    url: https://staging.your-app.com\n  # デプロイスクリプトを記述\n\nproduction:\n  stage: production\n  rules:\n    - if: $CI_COMMIT_TAG\n  environment:\n    name: production\n    url: https://your-app.com\n  # デプロイスクリプトを記述\n\n",[96,1074,1075,1081,1087,1094,1101,1108,1114,1118,1125,1133,1140,1152,1158,1166,1175,1181,1186,1194,1203,1210,1222,1229,1238,1248],{"__ignoreMap":372},[376,1076,1077,1079],{"class":378,"line":379},[376,1078,626],{"class":447},[376,1080,596],{"class":434},[376,1082,1083,1085],{"class":378,"line":393},[376,1084,633],{"class":434},[376,1086,636],{"class":386},[376,1088,1089,1091],{"class":378,"line":400},[376,1090,633],{"class":434},[376,1092,1093],{"class":386},"staging\n",[376,1095,1096,1098],{"class":378,"line":407},[376,1097,633],{"class":434},[376,1099,1100],{"class":386},"release\n",[376,1102,1103,1105],{"class":378,"line":412},[376,1104,633],{"class":434},[376,1106,1107],{"class":386},"version\n",[376,1109,1110,1112],{"class":378,"line":474},[376,1111,633],{"class":434},[376,1113,1031],{"class":386},[376,1115,1116],{"class":378,"line":480},[376,1117,397],{"emptyLinePlaceholder":396},[376,1119,1120,1123],{"class":378,"line":486},[376,1121,1122],{"class":447},"staging",[376,1124,596],{"class":434},[376,1126,1127,1129,1131],{"class":378,"line":492},[376,1128,760],{"class":447},[376,1130,604],{"class":434},[376,1132,1093],{"class":386},[376,1134,1135,1138],{"class":378,"line":502},[376,1136,1137],{"class":447},"  rules",[376,1139,596],{"class":434},[376,1141,1142,1144,1147,1149],{"class":378,"line":512},[376,1143,786],{"class":434},[376,1145,1146],{"class":447},"if",[376,1148,604],{"class":434},[376,1150,1151],{"class":386},"$CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n",[376,1153,1154,1156],{"class":378,"line":522},[376,1155,1019],{"class":447},[376,1157,596],{"class":434},[376,1159,1160,1162,1164],{"class":378,"line":528},[376,1161,1026],{"class":447},[376,1163,604],{"class":434},[376,1165,1093],{"class":386},[376,1167,1168,1170,1172],{"class":378,"line":537},[376,1169,1036],{"class":447},[376,1171,604],{"class":434},[376,1173,1174],{"class":386},"https://staging.your-app.com\n",[376,1176,1178],{"class":378,"line":1177},15,[376,1179,1180],{"class":403},"  # デプロイスクリプトを記述\n",[376,1182,1184],{"class":378,"line":1183},16,[376,1185,397],{"emptyLinePlaceholder":396},[376,1187,1189,1192],{"class":378,"line":1188},17,[376,1190,1191],{"class":447},"production",[376,1193,596],{"class":434},[376,1195,1197,1199,1201],{"class":378,"line":1196},18,[376,1198,760],{"class":447},[376,1200,604],{"class":434},[376,1202,1031],{"class":386},[376,1204,1206,1208],{"class":378,"line":1205},19,[376,1207,1137],{"class":447},[376,1209,596],{"class":434},[376,1211,1213,1215,1217,1219],{"class":378,"line":1212},20,[376,1214,786],{"class":434},[376,1216,1146],{"class":447},[376,1218,604],{"class":434},[376,1220,1221],{"class":386},"$CI_COMMIT_TAG\n",[376,1223,1225,1227],{"class":378,"line":1224},21,[376,1226,1019],{"class":447},[376,1228,596],{"class":434},[376,1230,1232,1234,1236],{"class":378,"line":1231},22,[376,1233,1026],{"class":447},[376,1235,604],{"class":434},[376,1237,1031],{"class":386},[376,1239,1241,1243,1245],{"class":378,"line":1240},23,[376,1242,1036],{"class":447},[376,1244,604],{"class":434},[376,1246,1247],{"class":386},"https://your-app.com\n",[376,1249,1251],{"class":378,"line":1250},24,[376,1252,1180],{"class":403},[13,1254,1255],{},"この設定は",[34,1257,1258,1261,1264],{},[37,1259,1260],{},"mainブランチからステージ環境へデプロイします",[37,1262,1263],{},"GitLabのタグを利用して本番環境へのデプロイをトリガーします",[37,1265,1266],{},"環境ごとに分けてデプロイの状況を管理できるようにします",[13,1268,1269,1270,1273],{},"このステップと次のステップでは、GitLabの非常に便利な機能であるタグを活用しています。GitLabの",[276,1271,1272],{},"コード >\nタグ","セクションで手動でタグを作成すると、'$ CI_COMMMIT_TAG\n`変数が設定され、本番環境へのデプロイジョブが適切にトリガーされるようになります。",[79,1275,1277],{"id":1276},"_8-自動リリースノートを作成する","8. 自動リリースノートを作成する",[13,1279,1280,1281,1283],{},"CI/CDパイプラインを通じてGitLabのリリース機能を使用します。まず、",[96,1282,580],{},"のstagesを更新 します：",[367,1285,1287],{"className":584,"code":1286,"language":586,"meta":372,"style":372},"stages:\n\n\n- publish\n\n- staging\n\n- release # New stage for releases\n\n- version\n\n- production\n",[96,1288,1289,1295,1299,1303,1310,1314,1320,1324,1334,1338,1344,1348],{"__ignoreMap":372},[376,1290,1291,1293],{"class":378,"line":379},[376,1292,626],{"class":447},[376,1294,596],{"class":434},[376,1296,1297],{"class":378,"line":393},[376,1298,397],{"emptyLinePlaceholder":396},[376,1300,1301],{"class":378,"line":400},[376,1302,397],{"emptyLinePlaceholder":396},[376,1304,1305,1308],{"class":378,"line":407},[376,1306,1307],{"class":434},"- ",[376,1309,636],{"class":386},[376,1311,1312],{"class":378,"line":412},[376,1313,397],{"emptyLinePlaceholder":396},[376,1315,1316,1318],{"class":378,"line":474},[376,1317,1307],{"class":434},[376,1319,1093],{"class":386},[376,1321,1322],{"class":378,"line":480},[376,1323,397],{"emptyLinePlaceholder":396},[376,1325,1326,1328,1331],{"class":378,"line":486},[376,1327,1307],{"class":434},[376,1329,1330],{"class":386},"release",[376,1332,1333],{"class":403}," # New stage for releases\n",[376,1335,1336],{"class":378,"line":492},[376,1337,397],{"emptyLinePlaceholder":396},[376,1339,1340,1342],{"class":378,"line":502},[376,1341,1307],{"class":434},[376,1343,1107],{"class":386},[376,1345,1346],{"class":378,"line":512},[376,1347,397],{"emptyLinePlaceholder":396},[376,1349,1350,1352],{"class":378,"line":522},[376,1351,1307],{"class":434},[376,1353,1031],{"class":386},[13,1355,1356],{},"次に、リリースジョブを追加します：",[367,1358,1360],{"className":584,"code":1359,"language":586,"meta":372,"style":372},"release_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  rules:\n    - if: $CI_COMMIT_TAG                  # タグが作成された場合のみ実行する\n  script:\n    - echo \"Creating release for $CI_COMMIT_TAG\"\n  release:                                # リリース設定\n    name: 'Release $CI_COMMIT_TAG'\n    description: 'Release created from $CI_COMMIT_TAG'\n    tag_name: '$CI_COMMIT_TAG'           # タグを作成する\n    ref: '$CI_COMMIT_TAG'                # リリースのベースとなるタグ\n\n",[96,1361,1362,1369,1377,1386,1392,1406,1412,1419,1430,1439,1449,1462],{"__ignoreMap":372},[376,1363,1364,1367],{"class":378,"line":379},[376,1365,1366],{"class":447},"release_job",[376,1368,596],{"class":434},[376,1370,1371,1373,1375],{"class":378,"line":393},[376,1372,760],{"class":447},[376,1374,604],{"class":434},[376,1376,1100],{"class":386},[376,1378,1379,1381,1383],{"class":378,"line":400},[376,1380,769],{"class":447},[376,1382,604],{"class":434},[376,1384,1385],{"class":386},"registry.gitlab.com/gitlab-org/release-cli:latest\n",[376,1387,1388,1390],{"class":378,"line":407},[376,1389,1137],{"class":447},[376,1391,596],{"class":434},[376,1393,1394,1396,1398,1400,1403],{"class":378,"line":412},[376,1395,786],{"class":434},[376,1397,1146],{"class":447},[376,1399,604],{"class":434},[376,1401,1402],{"class":386},"$CI_COMMIT_TAG",[376,1404,1405],{"class":403},"                  # タグが作成された場合のみ実行する\n",[376,1407,1408,1410],{"class":378,"line":474},[376,1409,794],{"class":447},[376,1411,596],{"class":434},[376,1413,1414,1416],{"class":378,"line":480},[376,1415,786],{"class":434},[376,1417,1418],{"class":386},"echo \"Creating release for $CI_COMMIT_TAG\"\n",[376,1420,1421,1424,1427],{"class":378,"line":486},[376,1422,1423],{"class":447},"  release",[376,1425,1426],{"class":434},":                                ",[376,1428,1429],{"class":403},"# リリース設定\n",[376,1431,1432,1434,1436],{"class":378,"line":492},[376,1433,1026],{"class":447},[376,1435,604],{"class":434},[376,1437,1438],{"class":386},"'Release $CI_COMMIT_TAG'\n",[376,1440,1441,1444,1446],{"class":378,"line":502},[376,1442,1443],{"class":447},"    description",[376,1445,604],{"class":434},[376,1447,1448],{"class":386},"'Release created from $CI_COMMIT_TAG'\n",[376,1450,1451,1454,1456,1459],{"class":378,"line":512},[376,1452,1453],{"class":447},"    tag_name",[376,1455,604],{"class":434},[376,1457,1458],{"class":386},"'$CI_COMMIT_TAG'",[376,1460,1461],{"class":403},"           # タグを作成する\n",[376,1463,1464,1467,1469,1471],{"class":378,"line":522},[376,1465,1466],{"class":447},"    ref",[376,1468,604],{"class":434},[376,1470,1458],{"class":386},[376,1472,1473],{"class":403},"                # リリースのベースとなるタグ\n",[13,1475,1476],{},"コンテナイメージのリンクを追加することで、さらに内容を充実させることができます：",[367,1478,1480],{"className":584,"code":1479,"language":586,"meta":372,"style":372},"release:\n  name: 'Release $CI_COMMIT_TAG'\n  description: 'Release created from $CI_COMMIT_TAG'\n  tag_name: '$CI_COMMIT_TAG'\n  ref: '$CI_COMMIT_TAG'\n  assets:\n    links:\n      - name: 'Container Image'\n        url: '$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG'\n        link_type: 'image'\n\n",[96,1481,1482,1488,1497,1506,1516,1525,1532,1539,1552,1562],{"__ignoreMap":372},[376,1483,1484,1486],{"class":378,"line":379},[376,1485,1330],{"class":447},[376,1487,596],{"class":434},[376,1489,1490,1493,1495],{"class":378,"line":393},[376,1491,1492],{"class":447},"  name",[376,1494,604],{"class":434},[376,1496,1438],{"class":386},[376,1498,1499,1502,1504],{"class":378,"line":400},[376,1500,1501],{"class":447},"  description",[376,1503,604],{"class":434},[376,1505,1448],{"class":386},[376,1507,1508,1511,1513],{"class":378,"line":407},[376,1509,1510],{"class":447},"  tag_name",[376,1512,604],{"class":434},[376,1514,1515],{"class":386},"'$CI_COMMIT_TAG'\n",[376,1517,1518,1521,1523],{"class":378,"line":412},[376,1519,1520],{"class":447},"  ref",[376,1522,604],{"class":434},[376,1524,1515],{"class":386},[376,1526,1527,1530],{"class":378,"line":474},[376,1528,1529],{"class":447},"  assets",[376,1531,596],{"class":434},[376,1533,1534,1537],{"class":378,"line":480},[376,1535,1536],{"class":447},"    links",[376,1538,596],{"class":434},[376,1540,1541,1544,1547,1549],{"class":378,"line":486},[376,1542,1543],{"class":434},"      - ",[376,1545,1546],{"class":447},"name",[376,1548,604],{"class":434},[376,1550,1551],{"class":386},"'Container Image'\n",[376,1553,1554,1557,1559],{"class":378,"line":492},[376,1555,1556],{"class":447},"        url",[376,1558,604],{"class":434},[376,1560,1561],{"class":386},"'$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG'\n",[376,1563,1564,1567,1569],{"class":378,"line":502},[376,1565,1566],{"class":447},"        link_type",[376,1568,604],{"class":434},[376,1570,1571],{"class":386},"'image'\n",[13,1573,1574],{},"コミットメッセージに基づいて自動リリースノートを生成する場合は次のようにします：",[367,1576,1578],{"className":584,"code":1577,"language":586,"meta":372,"style":372},"release:\n  name: 'Release $CI_COMMIT_TAG'\n  description: 'Release notes for version $CI_COMMIT_TAG'\n  tag_name: '$CI_COMMIT_TAG'\n  ref: '$CI_COMMIT_TAG'\n  auto_generate_release_notes: true    # Enables automatic notes\n\n",[96,1579,1580,1586,1594,1603,1611,1619],{"__ignoreMap":372},[376,1581,1582,1584],{"class":378,"line":379},[376,1583,1330],{"class":447},[376,1585,596],{"class":434},[376,1587,1588,1590,1592],{"class":378,"line":393},[376,1589,1492],{"class":447},[376,1591,604],{"class":434},[376,1593,1438],{"class":386},[376,1595,1596,1598,1600],{"class":378,"line":400},[376,1597,1501],{"class":447},[376,1599,604],{"class":434},[376,1601,1602],{"class":386},"'Release notes for version $CI_COMMIT_TAG'\n",[376,1604,1605,1607,1609],{"class":378,"line":407},[376,1606,1510],{"class":447},[376,1608,604],{"class":434},[376,1610,1515],{"class":386},[376,1612,1613,1615,1617],{"class":378,"line":412},[376,1614,1520],{"class":447},[376,1616,604],{"class":434},[376,1618,1515],{"class":386},[376,1620,1621,1624,1626,1629],{"class":378,"line":474},[376,1622,1623],{"class":447},"  auto_generate_release_notes",[376,1625,604],{"class":434},[376,1627,1628],{"class":888},"true",[376,1630,1631],{"class":403},"    # Enables automatic notes\n",[13,1633,1634],{},"自動リリースノートを充実させるには",[34,1636,1637,1640,1643],{},[37,1638,1639],{},"規則的なコミットメッセージを使用する（例：feat:, fix:）",[37,1641,1642],{},"イシュー番号を含める（例：#123）",[37,1644,1645],{},"件名と本文の間に空行を入れる",[13,1647,1648],{},"デプロイ時の情報をリリースノートに記載したい場合は、以下のように設定できます：",[367,1650,1653],{"className":1651,"code":1652,"language":557,"meta":372},[555],"release_job:\n  script:\n    - |\n      DEPLOY_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n      CHANGES=$(git log $(git describe --tags --abbrev=0 @^)..@ --pretty=format:\"- %s\")\n      cat > release_notes.md \u003C\u003C EOF\n      ## デプロイ情報\n      - デプロイ日時: $DEPLOY_TIME\n      - 環境: 本番環境\n      - バージョン: $CI_COMMIT_TAG\n\n      ## 変更内容\n      $CHANGES\n\n      ## アーティファクト\n      - コンテナイメージ: \\`$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\\`\n      EOF\n  release:\n    description: './release_notes.md'\n\n",[96,1654,1652],{"__ignoreMap":372},[13,1656,1657,1658,1661],{},"この設定を行うと、Gitタグの作成時に自動でリリースが作成されるようになります。作成されたリリースは、GitLabの",[276,1659,1660],{},"デプロイ >\nリリース","で確認できます。",[79,1663,1665],{"id":1664},"_9-すべてをまとめる","9. すべてをまとめる",[13,1667,1668],{},"最終的なYAMLファイルは以下のようになります：",[367,1670,1673],{"className":1671,"code":1672,"language":557,"meta":372},[555],"variables:\n  TAG_LATEST: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:latest\n  TAG_COMMIT: $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHA\n  STAGING_TARGET: $STAGING_TARGET    # CI/CD変数で設定\n  PRODUCTION_TARGET: $PRODUCTION_TARGET  # CI/CD変数で設定\n\nstages:\n  - publish\n  - staging\n  - release\n  - version\n  - production\n\n# ビルドとレジストリへの公開\n\npublish:\n  stage: publish\n  image: docker:latest\n  services:\n    - docker:dind\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  script:\n    - docker build -t $TAG_LATEST -t $TAG_COMMIT .\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $TAG_LATEST\n    - docker push $TAG_COMMIT\n\n# stagingへデプロイ\n\nstaging:\n  stage: staging\n  image: alpine:latest\n  rules:\n    - if: $CI_COMMIT_BRANCH == \"main\" && $CI_COMMIT_TAG == null\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$STAGING_TARGET \"\n        docker pull $TAG_COMMIT &&\n        docker rm -f myapp || true &&\n        docker run -d -p 80:80 --name myapp $TAG_COMMIT\"\n  environment:\n    name: staging\n    url: http://$STAGING_TARGET\n\n# リリースの作成\n\nrelease_job:\n  stage: release\n  image: registry.gitlab.com/gitlab-org/release-cli:latest\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - |\n      DEPLOY_TIME=$(date '+%Y-%m-%d %H:%M:%S')\n      CHANGES=$(git log $(git describe --tags --abbrev=0 @^)..@ --pretty=format:\"- %s\")\n      cat > release_notes.md \u003C\u003C EOF\n      ## デプロイ情報\n      - デプロイ日時：$DEPLOY_TIME\n      - 環境：本番環境\n      - バージョン：$CI_COMMIT_TAG\n\n      ## 変更内容\n      $CHANGES\n\n      ## アーティファクト\n      - コンテナイメージ：\\`$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\\`\n      EOF\n  release:\n    name: 'Release $CI_COMMIT_TAG'\n    description: './release_notes.md'\n    tag_name: '$CI_COMMIT_TAG'\n    ref: '$CI_COMMIT_TAG'\n    assets:\n      links:\n        - name: 'コンテナイメージ'\n          url: '$CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG'\n          link_type: 'image'\n\n# リリースタグ付きのバージョンを作成\n\nversion_job:\n  stage: version\n  image: docker:latest\n  services:\n    - docker:dind\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - docker pull $TAG_COMMIT\n    - docker tag $TAG_COMMIT $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\n\n# 本番環境へデプロイ\n\nproduction:\n  stage: production\n  image: alpine:latest\n  rules:\n    - if: $CI_COMMIT_TAG\n  script:\n    - chmod 400 $GITLAB_KEY\n    - apk add openssh-client\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - ssh -i $GITLAB_KEY -o StrictHostKeyChecking=no $USER@$PRODUCTION_TARGET \"\n        docker pull $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG &&\n        docker rm -f myapp || true &&\n        docker run -d -p 80:80 --name myapp $CI_REGISTRY_IMAGE/main:$CI_COMMIT_TAG\"\n  environment:\n    name: production\n    url: http://$PRODUCTION_TARGET\n\n",[96,1674,1672],{"__ignoreMap":372},[13,1676,1677],{},"完成したパイプラインは",[34,1679,1680,1683,1686,1689,1692],{},[37,1681,1682],{},"mainブランチでの変更をレジストリに公開します",[37,1684,1685],{},"mainブランチでの変更をstagingへデプロイします",[37,1687,1688],{},"タグが作成された際にリリースを作成します",[37,1690,1691],{},"リリースタグを付けたイメージを作成します",[37,1693,1694],{},"タグを基に本番環境へデプロイします",[13,1696,1697],{},"主なメリット：",[34,1699,1700,1703,1706,1709,1712],{},[37,1701,1702],{},"クリーンで再現性のあるローカル開発およびテスト環境が完成します",[37,1704,1705],{},"構造化された本番環境へのデプロイフローにより、信頼性の高いデプロイを実現できます",[37,1707,1708],{},"予期しない障害からの復旧パターンを確立します",[37,1710,1711],{},"より複雑なデプロイ戦略への拡張/導入に対応できます",[37,1713],{},[27,1715,1716],{"id":1716},"ベストプラクティス",[13,1718,1719],{},"実装の際は、以下の原則を守りましょう：",[34,1721,1722,1725,1728,1731,1734],{},[37,1723,1724],{},"変数の使用方法からデプロイ手順まで、すべてを文書化する",[37,1726,1727],{},"GitLabのビルトイン機能（環境管理、リリース、レジストリ）を活用する",[37,1729,1730],{},"適切なアクセス制御とセキュリティ対策を実施する",[37,1732,1733],{},"強固なロールバック手順を計画し、障害に備える",[37,1735,1736],{},"パイプラインの設定はDRY（Don't Repeat Yourself：重複を避ける）を意識する",[20,1738,1739],{"id":1739},"デプロイ戦略をスケールさせる",[13,1741,1742],{},"次は何をすべきでしょうか？ここでは、継続的デプロイ戦略をさらに成熟させるために、検討すべきポイントを紹介します。",[27,1744,1745],{"id":1745},"高度なセキュリティ対策",[13,1747,1748],{},"以下の方法でセキュリティを強化しましょう：",[34,1750,1751,1754,1757,1760,1763],{},[37,1752,1753],{},"アクセスを制限した保護環境を設定する",[37,1755,1756],{},"本番環境へのデプロイに承認を必須とする",[37,1758,1759],{},"セキュリティスキャンをパイプラインに統合する",[37,1761,1762],{},"自動脆弱性評価を導入する",[37,1764,1765],{},"デプロイ関連の変更に対するブランチ保護ルールを適用する",[27,1767,1768],{"id":1768},"段階的なデリバリー戦略",[13,1770,1771],{},"以下のような高度なデプロイ戦略を実装しましょう。",[34,1773,1774,1777,1780,1783,1786],{},[37,1775,1776],{},"機能フラグを活用して制御されたロールアウトを行う",[37,1778,1779],{},"リスクを軽減するためにカナリアデプロイを実施する",[37,1781,1782],{},"ブルーグリーンデプロイ戦略を導入する",[37,1784,1785],{},"A/Bテストを実施する",[37,1787,1788],{},"動的環境管理を行う",[27,1790,1791],{"id":1791},"モニタリングと最適化",[13,1793,1794],{},"強固なモニタリング体制を確立しましょう：",[34,1796,1797,1800,1803,1806,1809],{},[37,1798,1799],{},"デプロイ指標を追跡する",[37,1801,1802],{},"パフォーマンスモニタリングをセットアップする",[37,1804,1805],{},"デプロイアラートを設定する",[37,1807,1808],{},"デプロイのサービスレベル目標（SLO）を確立する",[37,1810,1811],{},"定期的にパイプラインを最適化する",[20,1813,1815],{"id":1814},"gitlabが選ばれる理由","GitLabが選ばれる理由",[13,1817,1818],{},"GitLabの継続的デプロイ機能は、現代のデプロイワークフローに最適です。GitLabは、コンテナレジストリ、環境管理、デプロイ追跡などの機能が1つのインターフェースに集約されており、コードから本番環境へのプロセスを効率化します。また、環境ごとの変数、デプロイ承認ゲート、ロールバック機能を備えており、本番環境へのデプロイ時に求められるセキュリティと管理を実現します。さらに、Review\nApps（レビューアプリ）や機能フラグを活用することで、段階的なデリバリー（プログレッシブデリバリー）戦略も可能です。GitLabのDevSecOpsプラットフォームの一部として、これらのCD機能はソフトウェアライフサイクル全体とシームレスに連携します。",[20,1820,1822],{"id":1821},"無料トライアルで今すぐスタート","無料トライアルで今すぐスタート！",[13,1824,1825],{},"継続的デプロイへの道のりは、革命ではなく進化のプロセスです。まずは基本を押さえ、しっかりとした基盤を築き、チームの成長に応じて徐々に高度な機能を取り入れていきましょう。GitLabは、最初の自動デプロイから、複数環境にまたがる複雑なデリバリーパイプラインまで、あらゆる段階でサポートするためのツールと柔軟性を提供します。",[853,1827,1828],{},[13,1829,1830,1835],{},[241,1831,1834],{"href":1832,"rel":1833},"https://about.gitlab.com/ja-jp/free-trial/devsecops/",[],"GitLab\nUltimateの無料トライアル","で、今日から継続的デプロイメントを始めましょう。",[13,1837,1838,1841],{},[1839,1840],"br",{},[1839,1842],{},[13,1844,1845,1846,1851],{},"*監修：川瀬 洋平 ",[241,1847,1850],{"href":1848,"rel":1849},"https://gitlab.com/ykawase",[],"@ykawase",[1839,1852],{},[13,1854,1855],{},"（GitLab合同会社 カスタマーサクセス本部 シニアカスタマーサクセスマネージャー）*",[469,1857,1858],{},"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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":372,"searchDepth":393,"depth":393,"links":1860},[1861,1866,1870,1875,1876],{"id":22,"depth":393,"text":22,"children":1862},[1863,1864,1865],{"id":29,"depth":400,"text":29},{"id":179,"depth":400,"text":179},{"id":199,"depth":400,"text":199},{"id":222,"depth":393,"text":223,"children":1867},[1868,1869],{"id":226,"depth":400,"text":226},{"id":1716,"depth":400,"text":1716},{"id":1739,"depth":393,"text":1739,"children":1871},[1872,1873,1874],{"id":1745,"depth":400,"text":1745},{"id":1768,"depth":400,"text":1768},{"id":1791,"depth":400,"text":1791},{"id":1814,"depth":393,"text":1815},{"id":1821,"depth":393,"text":1822},"product","2025-01-28","GitLabを活用して堅牢な継続的デプロイパイプラインを構築する方法をご紹介します。具体的な手順や例、ベストプラクティスを通して段階的にプロセスを理解できます。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659478/Blog/Hero%20Images/REFERENCE_-_Use_this_page_as_a_reference_for_thumbnail_sizes.png",{},"/ja-jp/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab",{"ogTitle":5,"ogImage":1883,"ogDescription":1879,"ogSiteName":1887,"noIndex":1882,"ogType":1888,"ogUrl":1889,"title":5,"canonicalUrls":1889,"description":1879},"https://about.gitlab.com","article","https://about.gitlab.com/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab","from-code-to-production-a-guide-to-continuous-deployment-with-gitlab","ja-jp/blog/from-code-to-production-a-guide-to-continuous-deployment-with-gitlab",[1893,1894,1895,1877,1896],"CD","CI/CD","features","tutorial","BlogPost","2025-06-11","jIv58qcJDBUSOr9VPVLKegvXCEV6uKM1G0JIL_YEx-s",{"logo":1901,"freeTrial":1906,"sales":1911,"login":1916,"items":1921,"search":2248,"minimal":2281,"duo":2298,"switchNav":2307,"pricingDeployment":2318},{"config":1902},{"href":1903,"dataGaName":1904,"dataGaLocation":1905},"/ja-jp/","gitlab logo","header",{"text":1907,"config":1908},"無料トライアルを開始",{"href":1909,"dataGaName":1910,"dataGaLocation":1905},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1912,"config":1913},"デモをリクエスト",{"href":1914,"dataGaName":1915,"dataGaLocation":1905},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":1917,"config":1918},"サインイン",{"href":1919,"dataGaName":1920,"dataGaLocation":1905},"https://gitlab.com/users/sign_in/","sign in",[1922,1950,2051,2056,2170,2226],{"text":1923,"config":1924,"menu":1926},"プラットフォーム",{"dataNavLevelOne":1925},"platform",{"type":1927,"columns":1928},"cards",[1929,1935,1943],{"title":1923,"description":1930,"link":1931},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":1932,"config":1933},"プラットフォームの詳細はこちら",{"href":1934,"dataGaName":1925,"dataGaLocation":1905},"/ja-jp/platform/",{"title":1936,"description":1937,"link":1938},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":1939,"config":1940},"GitLab Duoのご紹介",{"href":1941,"dataGaName":1942,"dataGaLocation":1905},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1815,"description":1944,"link":1945},"エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":1946,"config":1947},"詳細はこちら",{"href":1948,"dataGaName":1949,"dataGaLocation":1905},"/ja-jp/why-gitlab/","why gitlab",{"text":1951,"left":396,"config":1952,"menu":1954},"製品",{"dataNavLevelOne":1953},"solutions",{"type":1955,"link":1956,"columns":1960,"feature":2030},"lists",{"text":1957,"config":1958},"すべてのソリューションを表示",{"href":1959,"dataGaName":1953,"dataGaLocation":1905},"/ja-jp/solutions/",[1961,1985,2008],{"title":1962,"description":1963,"link":1964,"items":1969},"自動化","CI/CDと自動化でデプロイを加速",{"config":1965},{"icon":1966,"href":1967,"dataGaName":1968,"dataGaLocation":1905},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[1970,1973,1976,1981],{"text":1894,"config":1971},{"href":1972,"dataGaLocation":1905,"dataGaName":1894},"/ja-jp/solutions/continuous-integration/",{"text":1936,"config":1974},{"href":1941,"dataGaLocation":1905,"dataGaName":1975},"gitlab duo agent platform - product menu",{"text":1977,"config":1978},"ソースコード管理",{"href":1979,"dataGaLocation":1905,"dataGaName":1980},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":1982,"config":1983},"自動化されたソフトウェアデリバリー",{"href":1967,"dataGaLocation":1905,"dataGaName":1984},"Automated software delivery",{"title":1986,"description":1987,"link":1988,"items":1993},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":1989},{"href":1990,"dataGaName":1991,"dataGaLocation":1905,"icon":1992},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1994,1998,2003],{"text":1995,"config":1996},"アプリケーションセキュリティテスト",{"href":1990,"dataGaName":1997,"dataGaLocation":1905},"Application security testing",{"text":1999,"config":2000},"ソフトウェアサプライチェーンセキュリティ",{"href":2001,"dataGaLocation":1905,"dataGaName":2002},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":2004,"config":2005},"ソフトウェアコンプライアンス",{"href":2006,"dataGaName":2007,"dataGaLocation":1905},"/ja-jp/solutions/software-compliance/","software compliance",{"title":2009,"link":2010,"items":2015},"測定",{"config":2011},{"icon":2012,"href":2013,"dataGaName":2014,"dataGaLocation":1905},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[2016,2020,2025],{"text":2017,"config":2018},"可視性と測定",{"href":2013,"dataGaLocation":1905,"dataGaName":2019},"Visibility and Measurement",{"text":2021,"config":2022},"バリューストリーム管理",{"href":2023,"dataGaLocation":1905,"dataGaName":2024},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":2026,"config":2027},"分析とインサイト",{"href":2028,"dataGaLocation":1905,"dataGaName":2029},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":2031,"type":1955,"items":2032},"GitLabが活躍する場所",[2033,2039,2045],{"text":2034,"config":2035},"大企業",{"icon":2036,"href":2037,"dataGaLocation":1905,"dataGaName":2038},"Building","/ja-jp/enterprise/","enterprise",{"text":2040,"config":2041},"スモールビジネス",{"icon":2042,"href":2043,"dataGaLocation":1905,"dataGaName":2044},"Work","/ja-jp/small-business/","small business",{"text":2046,"config":2047},"公共部門",{"icon":2048,"href":2049,"dataGaLocation":1905,"dataGaName":2050},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":2052,"config":2053},"価格",{"href":2054,"dataGaName":2055,"dataGaLocation":1905,"dataNavLevelOne":2055},"/ja-jp/pricing/","pricing",{"text":2057,"config":2058,"menu":2060},"関連リソース",{"dataNavLevelOne":2059},"resources",{"type":1955,"link":2061,"columns":2065,"feature":2159},{"text":2062,"config":2063},"すべてのリソースを表示",{"href":2064,"dataGaName":2059,"dataGaLocation":1905},"/ja-jp/resources/",[2066,2099,2126],{"title":2067,"items":2068},"はじめに",[2069,2074,2079,2084,2089,2094],{"text":2070,"config":2071},"インストール",{"href":2072,"dataGaName":2073,"dataGaLocation":1905},"/ja-jp/install/","install",{"text":2075,"config":2076},"クイックスタートガイド",{"href":2077,"dataGaName":2078,"dataGaLocation":1905},"/ja-jp/get-started/","quick setup checklists",{"text":2080,"config":2081},"学ぶ",{"href":2082,"dataGaLocation":1905,"dataGaName":2083},"https://university.gitlab.com/","learn",{"text":2085,"config":2086},"製品ドキュメント",{"href":2087,"dataGaName":2088,"dataGaLocation":1905},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":2090,"config":2091},"ベストプラクティスビデオ",{"href":2092,"dataGaName":2093,"dataGaLocation":1905},"/ja-jp/getting-started-videos/","best practice videos",{"text":2095,"config":2096},"インテグレーション",{"href":2097,"dataGaName":2098,"dataGaLocation":1905},"/ja-jp/integrations/","integrations",{"title":2100,"items":2101},"検索する",[2102,2107,2112,2117,2121],{"text":2103,"config":2104},"お客様成功事例",{"href":2105,"dataGaName":2106,"dataGaLocation":1905},"/ja-jp/customers/","customer success stories",{"text":2108,"config":2109},"ブログ",{"href":2110,"dataGaName":2111,"dataGaLocation":1905},"/ja-jp/blog/","blog",{"text":2113,"config":2114},"Demo Hub",{"href":2115,"dataGaName":2116,"dataGaLocation":1905},"/ja-jp/demo-hub/","demo hub",{"text":2118,"config":2119},"The Source",{"href":2120,"dataGaName":2111,"dataGaLocation":1905},"/ja-jp/the-source/",{"text":2122,"config":2123},"リモート",{"href":2124,"dataGaName":2125,"dataGaLocation":1905},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2127,"items":2128},"つなげる",[2129,2134,2139,2144,2149,2154],{"text":2130,"config":2131},"GitLabサービス",{"href":2132,"dataGaName":2133,"dataGaLocation":1905},"/ja-jp/services/","services",{"text":2135,"config":2136},"コントリビュート",{"href":2137,"dataGaName":2138,"dataGaLocation":1905},"https://contributors.gitlab.com","contribute",{"text":2140,"config":2141},"コミュニティ",{"href":2142,"dataGaName":2143,"dataGaLocation":1905},"/community/","community",{"text":2145,"config":2146},"フォーラム",{"href":2147,"dataGaName":2148,"dataGaLocation":1905},"https://forum.gitlab.com/","forum",{"text":2150,"config":2151},"イベント",{"href":2152,"dataGaName":2153,"dataGaLocation":1905},"/events/","events",{"text":2155,"config":2156},"パートナー",{"href":2157,"dataGaName":2158,"dataGaLocation":1905},"/ja-jp/partners/","partners",{"config":2160,"title":2163,"text":2164,"link":2165},{"background":2161,"textColor":2162},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":2166,"config":2167},"最新情報を読む",{"href":2168,"dataGaName":2169,"dataGaLocation":1905},"/ja-jp/whats-new/","whats new",{"text":2171,"config":2172,"menu":2174},"企業情報",{"dataNavLevelOne":2173},"company",{"type":1955,"columns":2175},[2176],{"items":2177},[2178,2183,2189,2191,2196,2201,2206,2211,2216,2221],{"text":2179,"config":2180},"GitLabについて",{"href":2181,"dataGaName":2182,"dataGaLocation":1905},"/ja-jp/company/","about",{"text":2184,"config":2185,"footerGa":2188},"採用情報",{"href":2186,"dataGaName":2187,"dataGaLocation":1905},"/jobs/","jobs",{"dataGaName":2187},{"text":2150,"config":2190},{"href":2152,"dataGaName":2153,"dataGaLocation":1905},{"text":2192,"config":2193},"経営陣",{"href":2194,"dataGaName":2195,"dataGaLocation":1905},"/company/team/e-group/","leadership",{"text":2197,"config":2198},"ハンドブック",{"href":2199,"dataGaName":2200,"dataGaLocation":1905},"https://handbook.gitlab.com/","handbook",{"text":2202,"config":2203},"投資家向け情報",{"href":2204,"dataGaName":2205,"dataGaLocation":1905},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2207,"config":2208},"トラストセンター",{"href":2209,"dataGaName":2210,"dataGaLocation":1905},"/ja-jp/security/","trust center",{"text":2212,"config":2213},"AI Transparency Center",{"href":2214,"dataGaName":2215,"dataGaLocation":1905},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":2217,"config":2218},"ニュースレター",{"href":2219,"dataGaName":2220,"dataGaLocation":1905},"/company/contact/#contact-forms","newsletter",{"text":2222,"config":2223},"プレス",{"href":2224,"dataGaName":2225,"dataGaLocation":1905},"/press/","press",{"text":2227,"config":2228,"menu":2229},"お問い合わせ",{"dataNavLevelOne":2173},{"type":1955,"columns":2230},[2231],{"items":2232},[2233,2238,2243],{"text":2234,"config":2235},"お問い合わせはこちら",{"href":2236,"dataGaName":2237,"dataGaLocation":1905},"/ja-jp/sales/","talk to sales",{"text":2239,"config":2240},"サポートを受ける",{"href":2241,"dataGaName":2242,"dataGaLocation":1905},"https://support.gitlab.com/hc/en-us","support portal",{"text":2244,"config":2245},"カスタマーポータル",{"href":2246,"dataGaName":2247,"dataGaLocation":1905},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2249,"login":2250,"suggestions":2257},"閉じる",{"text":2251,"link":2252},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":2253,"config":2254},"GitLab.com",{"href":1919,"dataGaName":2255,"dataGaLocation":2256},"search login","search",{"text":2258,"default":2259},"提案",[2260,2262,2267,2269,2273,2277],{"text":1936,"config":2261},{"href":1941,"dataGaName":1936,"dataGaLocation":2256},{"text":2263,"config":2264},"コード提案（AI）",{"href":2265,"dataGaName":2266,"dataGaLocation":2256},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1894,"config":2268},{"href":1972,"dataGaName":1894,"dataGaLocation":2256},{"text":2270,"config":2271},"GitLab on AWS",{"href":2272,"dataGaName":2270,"dataGaLocation":2256},"/ja-jp/partners/technology-partners/aws/",{"text":2274,"config":2275},"GitLab on Google Cloud",{"href":2276,"dataGaName":2274,"dataGaLocation":2256},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":2278,"config":2279},"GitLabを選ぶ理由",{"href":1948,"dataGaName":2280,"dataGaLocation":2256},"Why GitLab?",{"freeTrial":2282,"mobileIcon":2286,"desktopIcon":2291,"secondaryButton":2294},{"text":1907,"config":2283},{"href":2284,"dataGaName":1910,"dataGaLocation":2285},"https://gitlab.com/-/trials/new/","nav",{"altText":2287,"config":2288},"GitLabアイコン",{"src":2289,"dataGaName":2290,"dataGaLocation":2285},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2287,"config":2292},{"src":2293,"dataGaName":2290,"dataGaLocation":2285},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2067,"config":2295},{"href":2296,"dataGaName":2297,"dataGaLocation":2285},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":2299,"mobileIcon":2303,"desktopIcon":2305},{"text":2300,"config":2301},"GitLab Duoの詳細について",{"href":1941,"dataGaName":2302,"dataGaLocation":2285},"gitlab duo",{"altText":2287,"config":2304},{"src":2289,"dataGaName":2290,"dataGaLocation":2285},{"altText":2287,"config":2306},{"src":2293,"dataGaName":2290,"dataGaLocation":2285},{"button":2308,"mobileIcon":2313,"desktopIcon":2315},{"text":2309,"config":2310},"/switch",{"href":2311,"dataGaName":2312,"dataGaLocation":2285},"#contact","switch",{"altText":2287,"config":2314},{"src":2289,"dataGaName":2290,"dataGaLocation":2285},{"altText":2287,"config":2316},{"src":2317,"dataGaName":2290,"dataGaLocation":2285},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2319,"mobileIcon":2324,"desktopIcon":2326},{"text":2320,"config":2321},"料金ページに戻る",{"href":2054,"dataGaName":2322,"dataGaLocation":2285,"icon":2323},"back to pricing","GoBack",{"altText":2287,"config":2325},{"src":2289,"dataGaName":2290,"dataGaLocation":2285},{"altText":2287,"config":2327},{"src":2293,"dataGaName":2290,"dataGaLocation":2285},{"title":2329,"button":2330,"config":2334},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":1946,"config":2331},{"href":2332,"dataGaName":2333,"dataGaLocation":1905},"/ja-jp/gitlab-orbit/","orbit",{"layout":1330,"disabled":1882},{"data":2336},{"text":2337,"source":2338,"edit":2344,"contribute":2349,"config":2354,"items":2359,"minimal":2568},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":2339,"config":2340},"ページのソースを表示",{"href":2341,"dataGaName":2342,"dataGaLocation":2343},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2345,"config":2346},"このページを編集",{"href":2347,"dataGaName":2348,"dataGaLocation":2343},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2350,"config":2351},"ご協力をお願いします",{"href":2352,"dataGaName":2353,"dataGaLocation":2343},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2355,"facebook":2356,"youtube":2357,"linkedin":2358},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2360,2405,2458,2501,2535],{"title":2052,"links":2361,"subMenu":2376},[2362,2366,2371],{"text":2363,"config":2364},"プランの表示",{"href":2054,"dataGaName":2365,"dataGaLocation":2343},"view plans",{"text":2367,"config":2368},"Premiumを選ぶ理由",{"href":2369,"dataGaName":2370,"dataGaLocation":2343},"/ja-jp/pricing/premium/","why premium",{"text":2372,"config":2373},"Ultimateを選ぶ理由",{"href":2374,"dataGaName":2375,"dataGaLocation":2343},"/ja-jp/pricing/ultimate/","why ultimate",[2377],{"title":2227,"links":2378},[2379,2381,2383,2385,2390,2395,2400],{"text":2227,"config":2380},{"href":2236,"dataGaName":1915,"dataGaLocation":2343},{"text":2239,"config":2382},{"href":2241,"dataGaName":2242,"dataGaLocation":2343},{"text":2244,"config":2384},{"href":2246,"dataGaName":2247,"dataGaLocation":2343},{"text":2386,"config":2387},"ステータス",{"href":2388,"dataGaName":2389,"dataGaLocation":2343},"https://status.gitlab.com/","status",{"text":2391,"config":2392},"利用規約",{"href":2393,"dataGaName":2394,"dataGaLocation":2343},"/terms/","terms of use",{"text":2396,"config":2397},"プライバシーに関する声明",{"href":2398,"dataGaName":2399,"dataGaLocation":2343},"/ja-jp/privacy/","privacy statement",{"text":2401,"config":2402},"Cookie 優先設定",{"dataGaName":2403,"dataGaLocation":2343,"id":2404,"isOneTrustButton":396},"cookie preferences","ot-sdk-btn",{"title":1951,"links":2406,"subMenu":2415},[2407,2411],{"text":2408,"config":2409},"DevSecOpsプラットフォーム",{"href":1934,"dataGaName":2410,"dataGaLocation":2343},"devsecops platform",{"text":2412,"config":2413},"AI支援開発",{"href":1941,"dataGaName":2414,"dataGaLocation":2343},"ai-assisted development",[2416],{"title":2417,"links":2418},"トピック",[2419,2423,2428,2433,2438,2443,2448,2453],{"text":1894,"config":2420},{"href":2421,"dataGaName":2422,"dataGaLocation":2343},"/ja-jp/topics/ci-cd/","cicd",{"text":2424,"config":2425},"GitOps",{"href":2426,"dataGaName":2427,"dataGaLocation":2343},"/ja-jp/topics/gitops/","gitops",{"text":2429,"config":2430},"DevOps",{"href":2431,"dataGaName":2432,"dataGaLocation":2343},"/ja-jp/topics/devops/","devops",{"text":2434,"config":2435},"バージョン管理",{"href":2436,"dataGaName":2437,"dataGaLocation":2343},"/ja-jp/topics/version-control/","version control",{"text":2439,"config":2440},"DevSecOps",{"href":2441,"dataGaName":2442,"dataGaLocation":2343},"/ja-jp/topics/devsecops/","devsecops",{"text":2444,"config":2445},"クラウドネイティブ",{"href":2446,"dataGaName":2447,"dataGaLocation":2343},"/ja-jp/topics/cloud-native/","cloud native",{"text":2449,"config":2450},"コーディングのためのAI",{"href":2451,"dataGaName":2452,"dataGaLocation":2343},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":2454,"config":2455},"エージェント型AI",{"href":2456,"dataGaName":2457,"dataGaLocation":2343},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":2459,"links":2460},"ソリューション",[2461,2464,2466,2471,2475,2478,2481,2484,2486,2488,2491,2496],{"text":1995,"config":2462},{"href":1990,"dataGaName":2463,"dataGaLocation":2343},"Application Security Testing",{"text":1982,"config":2465},{"href":1967,"dataGaName":1968,"dataGaLocation":2343},{"text":2467,"config":2468},"アジャイル開発",{"href":2469,"dataGaName":2470,"dataGaLocation":2343},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":2472,"config":2473},"SCM",{"href":1979,"dataGaName":2474,"dataGaLocation":2343},"source code management",{"text":1894,"config":2476},{"href":1972,"dataGaName":2477,"dataGaLocation":2343},"continuous integration & delivery",{"text":2021,"config":2479},{"href":2023,"dataGaName":2480,"dataGaLocation":2343},"value stream management",{"text":2424,"config":2482},{"href":2483,"dataGaName":2427,"dataGaLocation":2343},"/ja-jp/solutions/gitops/",{"text":2034,"config":2485},{"href":2037,"dataGaName":2038,"dataGaLocation":2343},{"text":2040,"config":2487},{"href":2043,"dataGaName":2044,"dataGaLocation":2343},{"text":2489,"config":2490},"公共機関",{"href":2049,"dataGaName":2050,"dataGaLocation":2343},{"text":2492,"config":2493},"教育",{"href":2494,"dataGaName":2495,"dataGaLocation":2343},"/ja-jp/solutions/education/","education",{"text":2497,"config":2498},"金融サービス",{"href":2499,"dataGaName":2500,"dataGaLocation":2343},"/ja-jp/solutions/finance/","financial services",{"title":2502,"links":2503},"リソース",[2504,2506,2508,2510,2514,2516,2519,2521,2523,2525,2527,2529,2531,2533],{"text":2070,"config":2505},{"href":2072,"dataGaName":2073,"dataGaLocation":2343},{"text":2075,"config":2507},{"href":2077,"dataGaName":2078,"dataGaLocation":2343},{"text":2080,"config":2509},{"href":2082,"dataGaName":2083,"dataGaLocation":2343},{"text":2085,"config":2511},{"href":2512,"dataGaName":2513,"dataGaLocation":2343},"https://docs.gitlab.com/ja-jp","docs",{"text":2108,"config":2515},{"href":2110,"dataGaName":2111,"dataGaLocation":2343},{"text":2517,"config":2518},"最新リリース",{"href":2168,"dataGaName":2169,"dataGaLocation":2343},{"text":2103,"config":2520},{"href":2105,"dataGaName":2106,"dataGaLocation":2343},{"text":2122,"config":2522},{"href":2124,"dataGaName":2125,"dataGaLocation":2343},{"text":2130,"config":2524},{"href":2132,"dataGaName":2133,"dataGaLocation":2343},{"text":2135,"config":2526},{"href":2137,"dataGaName":2138,"dataGaLocation":2343},{"text":2140,"config":2528},{"href":2142,"dataGaName":2143,"dataGaLocation":2343},{"text":2145,"config":2530},{"href":2147,"dataGaName":2148,"dataGaLocation":2343},{"text":2150,"config":2532},{"href":2152,"dataGaName":2153,"dataGaLocation":2343},{"text":2155,"config":2534},{"href":2157,"dataGaName":2158,"dataGaLocation":2343},{"title":2536,"links":2537},"会社情報",[2538,2540,2542,2544,2546,2548,2552,2557,2559,2561,2563],{"text":2179,"config":2539},{"href":2181,"dataGaName":2173,"dataGaLocation":2343},{"text":2184,"config":2541},{"href":2186,"dataGaName":2187,"dataGaLocation":2343},{"text":2192,"config":2543},{"href":2194,"dataGaName":2195,"dataGaLocation":2343},{"text":2197,"config":2545},{"href":2199,"dataGaName":2200,"dataGaLocation":2343},{"text":2202,"config":2547},{"href":2204,"dataGaName":2205,"dataGaLocation":2343},{"text":2549,"config":2550},"Sustainability",{"href":2551,"dataGaName":2549,"dataGaLocation":2343},"/sustainability/",{"text":2553,"config":2554},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":2555,"dataGaName":2556,"dataGaLocation":2343},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2207,"config":2558},{"href":2209,"dataGaName":2210,"dataGaLocation":2343},{"text":2217,"config":2560},{"href":2219,"dataGaName":2220,"dataGaLocation":2343},{"text":2222,"config":2562},{"href":2224,"dataGaName":2225,"dataGaLocation":2343},{"text":2564,"config":2565},"現代奴隷制の透明性に関する声明",{"href":2566,"dataGaName":2567,"dataGaLocation":2343},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2569},[2570,2572,2575],{"text":2391,"config":2571},{"href":2393,"dataGaName":2394,"dataGaLocation":2343},{"text":2573,"config":2574},"Cookieの設定",{"dataGaName":2403,"dataGaLocation":2343,"id":2404,"isOneTrustButton":396},{"text":2396,"config":2576},{"href":2398,"dataGaName":2399,"dataGaLocation":2343},[2578,2592],{"id":2579,"title":7,"body":1881,"config":2580,"content":2582,"description":1881,"extension":2586,"meta":2587,"navigation":396,"path":2588,"seo":2589,"stem":2590,"__hash__":2591},"blogAuthors/en-us/blog/authors/benjamin-skierlak.yml",{"template":2581},"BlogAuthor",{"name":7,"config":2583},{"headshot":2584,"ctfId":2585},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659471/Blog/Author%20Headshots/Benjamin_Skierlak_headshot.png","Kzp6pkUjPORYYMoeLFPRf","yml",{},"/en-us/blog/authors/benjamin-skierlak",{},"en-us/blog/authors/benjamin-skierlak","RbLU9KGFtah9Juo58JyxfHHYNIU4fyzzOUb5p7-fubo",{"id":2593,"title":8,"body":1881,"config":2594,"content":2595,"description":1881,"extension":2586,"meta":2599,"navigation":396,"path":2600,"seo":2601,"stem":2602,"__hash__":2603},"blogAuthors/en-us/blog/authors/james-wormwell.yml",{"template":2581},{"name":8,"config":2596},{"headshot":2597,"ctfId":2598},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659474/Blog/Author%20Headshots/james_wormwell_headshot.png","CPPijHb0Op5C5aVcvsOEf",{},"/en-us/blog/authors/james-wormwell",{},"en-us/blog/authors/james-wormwell","n6G4XENUWxgqOdCgfG0ECu0Uqj7qOS9zr3Rl8ouF49M",[2605,2613,2621],{"title":2606,"description":2607,"heroImage":2608,"category":1877,"date":2609,"authors":2610,"slug":2612,"externalUrl":1881},"「作業アイテム作成」トリガーで割り当てを自動化する方法","作業アイテムの割り当てを手作業なしで瞬時に行うAI機能について、順を追って解説するガイドです。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-07-20",[2611],"Cesar Saavedra","how-to-use-a-work-item-created-trigger",{"title":2614,"description":2615,"heroImage":2616,"category":1877,"date":2617,"authors":2618,"slug":2620,"externalUrl":1881},"GitLab 19.2リリース","GitLab 19.2でリリースした最新機能を公開します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1783980535/t3gez0gpayfndrhncunf.png","2026-07-16",[2619],"GitLab Japan Team","gitlab-19-2-release",{"title":2622,"description":2623,"heroImage":2624,"category":1877,"date":2625,"authors":2626,"slug":2629,"externalUrl":1881},"GitLabの制限付きアクセスが進化。シート超過を防ぎ、コストを予測可能に","GitLabの制限付きアクセス機能が、シートの超過を防ぎ、ID プロバイダーと連携し、 ライセンスコストを予測しやすくする仕組みについて解説します。\n","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774375772/kpaaaiqhokevxxeoxvu0.png","2026-07-06",[2627,2628],"Magdalena Frankiewicz","Priyanka Palanikumar","gitlab-restricted-access-improvements",{"promotions":2631},[2632,2646,2657,2669],{"id":2633,"categories":2634,"header":2636,"text":2637,"button":2638,"image":2643},"ai-modernization",[2635],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":2639,"config":2640},"AI成熟度スコアを確認する",{"href":2641,"dataGaName":2642,"dataGaLocation":2111},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":2644},{"src":2645},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2647,"categories":2648,"header":2649,"text":2637,"button":2650,"image":2654},"devops-modernization",[1877,2442],"単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":2651,"config":2652},"DevOps成熟度スコアを確認しましょう",{"href":2653,"dataGaName":2642,"dataGaLocation":2111},"/ja-jp/assessments/devops-modernization-assessment/",{"config":2655},{"src":2656},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2658,"categories":2659,"header":2661,"text":2637,"button":2662,"image":2666},"security-modernization",[2660],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":2663,"config":2664},"セキュリティ成熟度スコアを確認しましょう",{"href":2665,"dataGaName":2642,"dataGaLocation":2111},"/ja-jp/assessments/security-modernization-assessment/",{"config":2667},{"src":2668},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2670,"paths":2671,"header":2674,"text":2675,"button":2676,"image":2681},"github-azure-migration",[2672,2673],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":2677,"config":2678},"GitLabとGitHubの比較を見る",{"href":2679,"dataGaName":2680,"dataGaLocation":2111},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2682},{"src":2656},{"header":2684,"blurb":2685,"button":2686,"secondaryButton":2690},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1907,"config":2687},{"href":2688,"dataGaName":1910,"dataGaLocation":2689},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":2227,"config":2691},{"href":2236,"dataGaName":1915,"dataGaLocation":2689},1786803770299]