[{"data":1,"prerenderedAt":2004},["ShallowReactive",2],{"/ja-jp/blog/getting-started-with-gitlab-feature-flags-in-python":3,"navigation-ja-jp":1238,"banner-ja-jp":1656,"footer-ja-jp":1665,"blog-post-authors-ja-jp-Omid Khan":1905,"blog-related-posts-ja-jp-getting-started-with-gitlab-feature-flags-in-python":1920,"blog-promotions-ja-jp":1942,"next-steps-ja-jp":1995},{"id":4,"title":5,"authors":6,"body":8,"category":1219,"date":1220,"description":1221,"extension":1222,"externalUrl":1223,"featured":667,"heroImage":1224,"meta":1225,"navigation":667,"path":1226,"seo":1227,"slug":1231,"stem":1232,"tags":1233,"template":1235,"updatedDate":1236,"__hash__":1237},"blogPosts/ja-jp/blog/getting-started-with-gitlab-feature-flags-in-python.md","PythonでGitLab機能フラグを活用する：入門ガイド",[7],"Omid Khan",{"type":9,"value":10,"toc":1197},"minimark",[11,21,24,34,37,41,64,68,77,85,88,92,95,103,107,113,165,168,176,180,199,225,232,238,241,244,275,278,282,289,306,309,315,319,322,341,344,349,356,372,379,385,388,422,427,470,479,482,556,562,566,573,578,675,678,683,707,713,718,721,807,820,827,832,838,875,878,882,895,901,907,911,926,929,935,940,944,947,1028,1031,1087,1090,1093,1096,1139,1142,1145,1154,1161,1164,1193],[12,13,14,15,18,20],"p",{},"あなたならこんな経験があるかもしれません。",[16,17],"br",{},[16,19],{},"\n新機能の開発に数週間かけてきました。すべてのテストをパスし、コードレビューも完了して、リリース準備が整いました。いざデプロイしたところ、1時間もしないうちに受信トレイがバグ報告で埋め尽くされます。機能自体はほとんどのユーザーで問題なく動作するのに、想定していなかった本番トラフィックの何かが、一部のユーザーで障害を引き起こしているのです。そこからロールバック対応、インシデントレポートの作成、PR対応に追われることになります。",[12,22,23],{},"機能フラグはまさにこうした事態を防ぐものです。デプロイとリリースを切り離すことができます。コードの準備ができたときに本番環境へプッシュしておき、GitLabでトグルを切り替えることで、実際に新機能を見るユーザーをコントロールできます。まず「ユーザーID」戦略でQAチームから始め、「10%ロールアウト」に切り替え、確信が持てたら「全ユーザー」へと移行できます。途中で問題が起きても、数秒でオフにできます。再デプロイも、ホットフィックスも、悪評も防げます。",[12,25,26,27,33],{},"このチュートリアルでは、Unleash Python SDKを通じてGitLabの機能フラグを読み取る、動作するFlaskアプリケーションを解説します。完全なサンプルコードは ",[28,29,32],"a",{"href":30,"rel":31},"https://gitlab.com/omid-blogs/gitlab-feature-flags-demo",[],"gitlab.com/omid-blogs/gitlab-feature-flags-demo"," で公開されています。自分のグループまたはワークスペースにクローンすれば、数分でライブの機能フラグ制御を体験できます。",[12,35,36],{},"このチュートリアルを終えると、インテグレーションの仕組みを理解し、自分のプロジェクトにそのまま流用できるテンプレートが完成します。",[38,39,40],"h2",{"id":40},"必要なもの",[42,43,44,57],"ul",{},[45,46,47,48,52,53,56],"li",{},"機能フラグが有効になったGitLabプロジェクト（Free、Premium、またはUltimate）。フラグの作成と管理はここで行います。有効にするには、プロジェクトの ",[49,50,51],"strong",{},"設定 > 一般 > 公開設定、プロジェクト機能、権限"," に移動し、",[49,54,55],{},"機能フラグ"," のトグルがオンになっていることを確認してください。",[45,58,59,63],{},[28,60,62],{"href":30,"rel":61},[],"デモリポジトリ"," を自分のGitLab名前空間にフォークし、ローカルにクローンしたもの",[38,65,67],{"id":66},"gitlabの機能フラグの仕組み","GitLabの機能フラグの仕組み",[12,69,70,71,76],{},"GitLabはすべてのプロジェクトに対して ",[28,72,75],{"href":73,"rel":74},"https://github.com/Unleash/unleash",[],"Unleash"," 互換のAPIを公開しています。つまり、UnleashのクライアントSDK（Go、Ruby、Python、JavaScriptなど）は、独立したUnleashサーバーなしでGitLabに直接接続できます。",[12,78,79,80,84],{},"起動時にSDKがすべてのフラグ定義を取得し、設定可能なインターバルで再取得します（デモでは15秒）。",[81,82,83],"code",{},"is_enabled()"," を呼び出すたびに、キャッシュされた設定に基づいてローカルで評価が行われ、フラグチェックごとのネットワーク呼び出しは発生しません。これにより、フラグ評価はほぼ瞬時に行われ、一時的なネットワーク障害にも強くなります。",[12,86,87],{},"GitLabの機能フラグをPython FlaskアプリにUnleash SDKで統合する手順を説明します。",[38,89,91],{"id":90},"_1-gitlabプロジェクトのセットアップとデモのクローン","1. GitLabプロジェクトのセットアップとデモのクローン",[12,93,94],{},"必要なもの：",[42,96,97,100],{},[45,98,99],{},"機能フラグをホストするための自分のGitLabプロジェクト",[45,101,102],{},"アプリを実行するためにローカルにクローンしたデモリポジトリ",[104,105,106],"h3",{"id":106},"デモリポジトリをフォークまたはクローンする",[12,108,109,112],{},[28,110,32],{"href":30,"rel":111},[]," にアクセスして、自分のGitLab名前空間にフォークしてください。これにより、独自の機能フラグを管理できるプロジェクトのコピーが作成されます。次にローカルにクローンして、お気に入りのIDEで開きます。",[114,115,120],"pre",{"className":116,"code":117,"language":118,"meta":119,"style":119},"language-shell shiki shiki-themes github-light","git clone https://gitlab.com/\u003Cyour-namespace>/gitlab-feature-flags-demo.git\ncd gitlab-feature-flags-demo\n","shell","",[81,121,122,155],{"__ignoreMap":119},[123,124,127,131,135,138,142,145,149,152],"span",{"class":125,"line":126},"line",1,[123,128,130],{"class":129},"s7eDp","git",[123,132,134],{"class":133},"sYBdl"," clone",[123,136,137],{"class":133}," https://gitlab.com/",[123,139,141],{"class":140},"sD7c4","\u003C",[123,143,144],{"class":133},"your-namespac",[123,146,148],{"class":147},"sgsFI","e",[123,150,151],{"class":140},">",[123,153,154],{"class":133},"/gitlab-feature-flags-demo.git\n",[123,156,158,162],{"class":125,"line":157},2,[123,159,161],{"class":160},"sYu0t","cd",[123,163,164],{"class":133}," gitlab-feature-flags-demo\n",[104,166,167],{"id":167},"リポジトリの構成",[114,169,174],{"className":170,"code":172,"language":173},[171],"language-text",".\n├── app.py                # FlaskアプリとUnleash SDKの統合\n├── requirements.txt      # Pythonの依存関係\n├── .env.example          # 必要な環境変数のテンプレート\n├── .gitignore\n├── templates/\n│   └── index.html        # WebUIテンプレート\n└── static/\n    └── styles.css        # スタイリング\n","text",[81,175,172],{"__ignoreMap":119},[38,177,179],{"id":178},"_2-gitlabで機能フラグを作成する","2. GitLabで機能フラグを作成する",[12,181,182,183,186,187,190,191,194,195,198],{},"自分のGitLabプロジェクトを開き、",[49,184,185],{},"デプロイ > 機能フラグ"," に移動して、",[49,188,189],{},"新しい機能フラグ"," をクリックします。以下の4つのフラグを作成し、それぞれのステータスを ",[49,192,193],{},"アクティブ"," に、戦略を ",[49,196,197],{},"全ユーザー"," に設定します。",[42,200,201,207,213,219],{},[45,202,203,206],{},[49,204,205],{},"dark_mode"," — ページをダークカラースキームに切り替えます。",[45,208,209,212],{},[49,210,211],{},"holiday_banner"," — ページ上部にフェスティブなバナーを表示します。",[45,214,215,218],{},[49,216,217],{},"new_layout"," — カードグリッドを1カラムレイアウトに切り替えます。",[45,220,221,224],{},[49,222,223],{},"fun_fonts"," — ボディフォントを遊び心のある手書き風スタイルに変更します。",[12,226,227],{},[228,229],"img",{"alt":230,"src":231,"title":230},"GitLab UIに表示された4つの機能フラグ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/pifymwd6senqz3nzcyxa.png",[12,233,234,237],{},[49,235,236],{},"ヒント："," フラグが有効として評価されるには、アクティブ状態で少なくとも1つの戦略が設定されている必要があります。戦略がない場合、SDKはフラグが「アクティブ」とマークされていても無効として扱います。",[104,239,240],{"id":240},"各戦略の概要",[12,242,243],{},"「全ユーザー」はシンプルなオン/オフのトグルですが、GitLabにはすぐに使える戦略が他にもいくつかあります。",[42,245,246,252,258,264,270],{},[45,247,248,251],{},[49,249,250],{},"パーセントロールアウト","（推奨）：ユーザーID、セッションID、またはランダムに基づいて、一定割合のユーザーに段階的に展開します。最も柔軟なオプションで、最初に選ぶべき戦略です。",[45,253,254,257],{},[49,255,256],{},"ユーザーのパーセント","：認証済みユーザーの一定割合に対して有効にします。ログインユーザーにのみ機能するため、パーセントロールアウトほど柔軟ではありません。",[45,259,260,263],{},[49,261,262],{},"ユーザーID","：特定のユーザーIDのみに対して有効にします。指定グループによる内部テストに最適です。",[45,265,266,269],{},[49,267,268],{},"ユーザーリスト","：事前に定義されたユーザーリストに対して有効にします。",[45,271,272,274],{},[49,273,197],{},"：すべてのユーザーに対して有効にします。",[12,276,277],{},"戦略こそが機能フラグを非常に強力にしている部分です。ユーザーID戦略でQAチームから始め、10%のパーセントロールアウトに切り替え、確信が持てたら全ユーザーへ。GitLab UIから操作するだけで、コード変更は一切不要です。",[38,279,281],{"id":280},"_3-unleash認証情報を取得する","3. Unleash認証情報を取得する",[12,283,284,285,288],{},"機能フラグのページで、右上の ",[49,286,287],{},"設定"," をクリックします。以下の2つの値が表示されます。",[42,290,291,300],{},[45,292,293,296,297],{},[49,294,295],{},"API URL",": ",[81,298,299],{},"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>",[45,301,302,305],{},[49,303,304],{},"インスタンスID",": プロジェクトにスコープされた一意のトークン",[12,307,308],{},"両方の値をコピーしてください。アプリに環境変数として渡します。インスタンスIDは読み取り専用であることに注意してください。フラグの状態を取得するだけで、変更はできません。ただし、情報漏洩を防ぐためにインスタンスIDはシークレットとして扱ってください。",[12,310,311],{},[228,312],{"alt":313,"src":314,"title":313},"設定パネルにAPI URLとインスタンスIDが表示されている","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/bxkn0xkpe4xude0es4zx.png",[38,316,318],{"id":317},"_4-プロジェクトをローカルにセットアップする","4. プロジェクトをローカルにセットアップする",[12,320,321],{},"READMEに完全なセットアップ手順がありますが、簡単にまとめると次のとおりです。",[114,323,325],{"className":116,"code":324,"language":118,"meta":119,"style":119},"pip install -r requirements.txt\n",[81,326,327],{"__ignoreMap":119},[123,328,329,332,335,338],{"class":125,"line":126},[123,330,331],{"class":129},"pip",[123,333,334],{"class":133}," install",[123,336,337],{"class":160}," -r",[123,339,340],{"class":133}," requirements.txt\n",[12,342,343],{},"次に認証情報を設定します。2つの方法があります。",[12,345,346],{},[49,347,348],{},"方法A：.envファイルを使う（推奨）",[12,350,351,352,355],{},"リポジトリには ",[81,353,354],{},".env.example"," ファイルが含まれています。これをコピーして値を入力します。",[114,357,359],{"className":116,"code":358,"language":118,"meta":119,"style":119},"cp .env.example .env\n",[81,360,361],{"__ignoreMap":119},[123,362,363,366,369],{"class":125,"line":126},[123,364,365],{"class":129},"cp",[123,367,368],{"class":133}," .env.example",[123,370,371],{"class":133}," .env\n",[12,373,374,375,378],{},"エディターで ",[81,376,377],{},".env"," を開き、ステップ3で取得した認証情報でプレースホルダーを置き換えます。",[114,380,383],{"className":381,"code":382,"language":173},[171],"UNLEASH_URL=https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\nUNLEASH_INSTANCE_ID=\u003Cyour-instance-id>\nUNLEASH_APP_NAME=production\n",[81,384,382],{"__ignoreMap":119},[12,386,387],{},"次にエクスポートします。",[114,389,391],{"className":116,"code":390,"language":118,"meta":119,"style":119},"export $(grep -v '^#' .env | xargs)\n",[81,392,393],{"__ignoreMap":119},[123,394,395,398,401,404,407,410,413,416,419],{"class":125,"line":126},[123,396,397],{"class":140},"export",[123,399,400],{"class":147}," $(",[123,402,403],{"class":129},"grep",[123,405,406],{"class":160}," -v",[123,408,409],{"class":133}," '^#'",[123,411,412],{"class":133}," .env",[123,414,415],{"class":140}," |",[123,417,418],{"class":129}," xargs",[123,420,421],{"class":147},")\n",[12,423,424],{},[49,425,426],{},"方法B：ターミナルで直接エクスポートする",[114,428,430],{"className":116,"code":429,"language":118,"meta":119,"style":119},"export UNLEASH_URL=\"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\"\nexport UNLEASH_INSTANCE_ID=\"\u003Cyour-instance-id>\"\nexport UNLEASH_APP_NAME=\"production\"\n",[81,431,432,445,457],{"__ignoreMap":119},[123,433,434,436,439,442],{"class":125,"line":126},[123,435,397],{"class":140},[123,437,438],{"class":147}," UNLEASH_URL",[123,440,441],{"class":140},"=",[123,443,444],{"class":133},"\"https://gitlab.com/api/v4/feature_flags/unleash/\u003Cyour-project-id>\"\n",[123,446,447,449,452,454],{"class":125,"line":157},[123,448,397],{"class":140},[123,450,451],{"class":147}," UNLEASH_INSTANCE_ID",[123,453,441],{"class":140},[123,455,456],{"class":133},"\"\u003Cyour-instance-id>\"\n",[123,458,460,462,465,467],{"class":125,"line":459},3,[123,461,397],{"class":140},[123,463,464],{"class":147}," UNLEASH_APP_NAME",[123,466,441],{"class":140},[123,468,469],{"class":133},"\"production\"\n",[12,471,472,474,475,478],{},[81,473,377],{}," ファイルはバージョン管理にコミットしないでください。リポジトリの ",[81,476,477],{},".gitignore"," ですでに除外されていますが、理由を知っておく価値があります。インスタンスIDはシークレットであり、gitの履歴に残すべきではありません。",[12,480,481],{},"インテグレーション全体を動かす環境変数は3つです。",[483,484,485,504],"table",{},[486,487,488],"thead",{},[489,490,491,495,498,501],"tr",{},[492,493,494],"th",{},"変数",[492,496,497],{},"必須",[492,499,500],{},"説明",[492,502,503],{},"デフォルト",[505,506,507,524,538],"tbody",{},[489,508,509,515,518,521],{},[510,511,512],"td",{},[81,513,514],{},"UNLEASH_URL",[510,516,517],{},"はい",[510,519,520],{},"プロジェクトのGitLab Unleash API URL",[510,522,523],{},"—",[489,525,526,531,533,536],{},[510,527,528],{},[81,529,530],{},"UNLEASH_INSTANCE_ID",[510,532,517],{},[510,534,535],{},"設定パネルのインスタンスID",[510,537,523],{},[489,539,540,545,548,551],{},[510,541,542],{},[81,543,544],{},"UNLEASH_APP_NAME",[510,546,547],{},"いいえ",[510,549,550],{},"環境名。フラグ戦略と一致させます",[510,552,553],{},[81,554,555],{},"production",[12,557,558,561],{},[81,559,560],{},"UnleashClient"," が主要な依存関係です。ポーリング、キャッシュ、ローカルでのフラグ評価を処理する公式のUnleash Python SDKであり、これらを自前で構築する必要がなくなります。",[38,563,565],{"id":564},"_5-アプリケーションを理解する","5. アプリケーションを理解する",[12,567,568,569,572],{},"実行する前に ",[81,570,571],{},"app.py"," を読んでください。自分のプロジェクトで再現できるよう、理解しておく価値のある主要なパターンを説明します。",[12,574,575],{},[49,576,577],{},"SDKの初期化",[114,579,583],{"className":580,"code":581,"language":582,"meta":119,"style":119},"language-py shiki shiki-themes github-light","unleash_client = UnleashClient(\n    url=UNLEASH_URL,\n    app_name=UNLEASH_APP_NAME,\n    instance_id=UNLEASH_INSTANCE_ID,\n    refresh_interval=15,\n    metrics_interval=60,\n)\n\nunleash_client.initialize_client()\n","py",[81,584,585,595,608,619,631,644,657,662,669],{"__ignoreMap":119},[123,586,587,590,592],{"class":125,"line":126},[123,588,589],{"class":147},"unleash_client ",[123,591,441],{"class":140},[123,593,594],{"class":147}," UnleashClient(\n",[123,596,597,601,603,605],{"class":125,"line":157},[123,598,600],{"class":599},"sqxcx","    url",[123,602,441],{"class":140},[123,604,514],{"class":160},[123,606,607],{"class":147},",\n",[123,609,610,613,615,617],{"class":125,"line":459},[123,611,612],{"class":599},"    app_name",[123,614,441],{"class":140},[123,616,544],{"class":160},[123,618,607],{"class":147},[123,620,622,625,627,629],{"class":125,"line":621},4,[123,623,624],{"class":599},"    instance_id",[123,626,441],{"class":140},[123,628,530],{"class":160},[123,630,607],{"class":147},[123,632,634,637,639,642],{"class":125,"line":633},5,[123,635,636],{"class":599},"    refresh_interval",[123,638,441],{"class":140},[123,640,641],{"class":160},"15",[123,643,607],{"class":147},[123,645,647,650,652,655],{"class":125,"line":646},6,[123,648,649],{"class":599},"    metrics_interval",[123,651,441],{"class":140},[123,653,654],{"class":160},"60",[123,656,607],{"class":147},[123,658,660],{"class":125,"line":659},7,[123,661,421],{"class":147},[123,663,665],{"class":125,"line":664},8,[123,666,668],{"emptyLinePlaceholder":667},true,"\n",[123,670,672],{"class":125,"line":671},9,[123,673,674],{"class":147},"unleash_client.initialize_client()\n",[12,676,677],{},"パーソナルアクセストークンも、ソースにハードコードされた認証情報も不要です。必要な変数のいずれかが欠けている場合、アプリは即座に明確なエラーメッセージを出力して終了します。",[12,679,680],{},[49,681,682],{},"フラグの確認",[114,684,686],{"className":580,"code":685,"language":582,"meta":119,"style":119},"def is_flag_enabled(flag_name):\n    return unleash_client.is_enabled(flag_name)\n",[81,687,688,699],{"__ignoreMap":119},[123,689,690,693,696],{"class":125,"line":126},[123,691,692],{"class":140},"def",[123,694,695],{"class":129}," is_flag_enabled",[123,697,698],{"class":147},"(flag_name):\n",[123,700,701,704],{"class":125,"line":157},[123,702,703],{"class":140},"    return",[123,705,706],{"class":147}," unleash_client.is_enabled(flag_name)\n",[12,708,709,710,712],{},"SDKがフラグ定義をメモリにキャッシュするため、",[81,711,83],{}," はネットワーク往復なしに即座に結果を返します。",[12,714,715],{},[49,716,717],{},"フラグでの実際の動作の制御",[12,719,720],{},"インデックスルートはフィーチャーディクショナリを構築し、各フラグを評価してテンプレートに結果を渡します。",[114,722,724],{"className":580,"code":723,"language":582,"meta":119,"style":119},"features = {}\nfor flag_name, config in feature_configs.items():\n    features[flag_name] = {\n        **config,\n        'enabled': is_flag_enabled(flag_name)\n    }\n\nreturn render_template('index.html', features=features)\n",[81,725,726,736,750,760,768,776,781,785],{"__ignoreMap":119},[123,727,728,731,733],{"class":125,"line":126},[123,729,730],{"class":147},"features ",[123,732,441],{"class":140},[123,734,735],{"class":147}," {}\n",[123,737,738,741,744,747],{"class":125,"line":157},[123,739,740],{"class":140},"for",[123,742,743],{"class":147}," flag_name, config ",[123,745,746],{"class":140},"in",[123,748,749],{"class":147}," feature_configs.items():\n",[123,751,752,755,757],{"class":125,"line":459},[123,753,754],{"class":147},"    features[flag_name] ",[123,756,441],{"class":140},[123,758,759],{"class":147}," {\n",[123,761,762,765],{"class":125,"line":621},[123,763,764],{"class":140},"        **",[123,766,767],{"class":147},"config,\n",[123,769,770,773],{"class":125,"line":633},[123,771,772],{"class":133},"        'enabled'",[123,774,775],{"class":147},": is_flag_enabled(flag_name)\n",[123,777,778],{"class":125,"line":646},[123,779,780],{"class":147},"    }\n",[123,782,783],{"class":125,"line":659},[123,784,668],{"emptyLinePlaceholder":667},[123,786,787,790,793,796,799,802,804],{"class":125,"line":664},[123,788,789],{"class":140},"return",[123,791,792],{"class":147}," render_template(",[123,794,795],{"class":133},"'index.html'",[123,797,798],{"class":147},", ",[123,800,801],{"class":599},"features",[123,803,441],{"class":140},[123,805,806],{"class":147},"features)\n",[12,808,809,810,812,813,815,816,819],{},"テンプレートはこれらの値を使用して、CSSクラスを条件付きで適用し、UI要素をレンダリングします。",[81,811,205],{}," はbodyクラスを切り替え、",[81,814,211],{}," はバナー要素の表示/非表示を完全に制御します。",[81,817,818],{},"templates/index.html"," を開いて、どのように接続されているか確認してください。",[12,821,822,823,826],{},"なお、",[81,824,825],{},"index.html"," は小さなJavaScriptスニペットによって30秒ごとに自動更新されるため、手動でリロードしなくても機能フラグの変更が反映されるのを確認できます。",[12,828,829],{},[49,830,831],{},"ターゲット戦略のためのユーザーコンテキストの渡し方",[12,833,834,835,837],{},"全ユーザーを超えてパーセントロールアウトやユーザーターゲティングを使用する準備ができたら、",[81,836,83],{}," にコンテキストオブジェクトを渡します。",[114,839,841],{"className":580,"code":840,"language":582,"meta":119,"style":119},"unleash_client.is_enabled(\n    'new_layout',\n    context={'userId': current_user.id}\n)\n",[81,842,843,848,855,871],{"__ignoreMap":119},[123,844,845],{"class":125,"line":126},[123,846,847],{"class":147},"unleash_client.is_enabled(\n",[123,849,850,853],{"class":125,"line":157},[123,851,852],{"class":133},"    'new_layout'",[123,854,607],{"class":147},[123,856,857,860,862,865,868],{"class":125,"line":459},[123,858,859],{"class":599},"    context",[123,861,441],{"class":140},[123,863,864],{"class":147},"{",[123,866,867],{"class":133},"'userId'",[123,869,870],{"class":147},": current_user.id}\n",[123,872,873],{"class":125,"line":621},[123,874,421],{"class":147},[12,876,877],{},"SDKはパーセントロールアウトの一貫したハッシュ処理を自動的に行います。計算は一切不要です。",[38,879,881],{"id":880},"_6-アプリを実行する","6. アプリを実行する",[114,883,885],{"className":116,"code":884,"language":118,"meta":119,"style":119},"python3 app.py\n",[81,886,887],{"__ignoreMap":119},[123,888,889,892],{"class":125,"line":126},[123,890,891],{"class":129},"python3",[123,893,894],{"class":133}," app.py\n",[12,896,897,900],{},[81,898,899],{},"http://localhost:8080"," にアクセスしてください。4つの機能カードが現在の有効/無効の状態で表示されるはずです。",[12,902,903],{},[228,904],{"alt":905,"src":906,"title":905},"すべての機能フラグが無効になっているデモアプリ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466322/bjc0rp7h43wetefny8cw.png",[38,908,910],{"id":909},"_7-リアルタイムでフラグを切り替える","7. リアルタイムでフラグを切り替える",[12,912,913,914,916,917,919,920,922,923,925],{},"GitLabの ",[49,915,185],{}," に戻り、いずれかのフラグを切り替えてみてください。最も視覚的な効果が得られる ",[81,918,205],{}," または ",[81,921,211],{}," を試してみましょう。約15秒待ってからページをリロードすると、カードが新しい状態を反映して更新されます。",[81,924,205],{}," をオンにした場合、ページ全体がダークテーマに切り替わります。オフに戻して待ち、リロードすると即座に元に戻ります。",[12,927,928],{},"これが機能フラグのコアバリューです。コードに触れることなく、再デプロイすることなく、GitLabからアプリケーションの動作を制御できます。",[12,930,931],{},[228,932],{"alt":933,"src":934},"2つの機能フラグがオフになっているデモアプリ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466321/kfbvvazflpta4pt8vtoj.png",[12,936,937],{},[228,938],{"alt":933,"src":939,"title":933},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774466321/rslzfdcpronixcfokfbk.png",[38,941,943],{"id":942},"gitlab-rest-apiではなくunleash-sdkを使う理由","GitLab REST APIではなくUnleash SDKを使う理由",[12,945,946],{},"すべてのリクエストでフラグを評価するアプリには、SDKが明らかに優れています。より高速で、よりシンプルで、SDKが使用するインスタンスIDはフラグ状態の読み取り以外の権限を持ちません。これはPATよりもはるかに小さなセキュリティフットプリントです。",[483,948,949,961],{},[486,950,951],{},[489,952,953,955,958],{},[492,954],{},[492,956,957],{},"REST API",[492,959,960],{},"Unleash SDK",[505,962,963,976,989,1002,1015],{},[489,964,965,970,973],{},[510,966,967],{},[49,968,969],{},"認証",[510,971,972],{},"より広いプロジェクト権限を持つパーソナルアクセストークンが必要",[510,974,975],{},"インスタンスIDのみを使用。読み取り専用でフラグ状態にスコープされ、PATは不要",[489,977,978,983,986],{},[510,979,980],{},[49,981,982],{},"フラグ評価",[510,984,985],{},"チェックごとにネットワーク呼び出し",[510,987,988],{},"キャッシュされた設定からローカルで評価",[489,990,991,996,999],{},[510,992,993],{},[49,994,995],{},"チェックあたりのレイテンシー",[510,997,998],{},"ネットワーク往復",[510,1000,1001],{},"ほぼゼロ（インメモリ）",[489,1003,1004,1009,1012],{},[510,1005,1006],{},[49,1007,1008],{},"戦略サポート",[510,1010,1011],{},"手動解析が必要",[510,1013,1014],{},"パーセントロールアウトとユーザーIDターゲティングのビルトインサポート",[489,1016,1017,1022,1025],{},[510,1018,1019],{},[49,1020,1021],{},"レート制限",[510,1023,1024],{},"GitLab.com APIレート制限の対象",[510,1026,1027],{},"アプリインスタンスごとに単一のポーリング接続",[38,1029,1030],{"id":1030},"トラブルシューティング",[483,1032,1033,1043],{},[486,1034,1035],{},[489,1036,1037,1040],{},[492,1038,1039],{},"問題",[492,1041,1042],{},"対処法",[505,1044,1045,1059,1067,1075],{},[489,1046,1047,1053],{},[510,1048,1049,1052],{},[81,1050,1051],{},"ERROR: UNLEASH_URL and UNLEASH_INSTANCE_ID..."," でアプリが終了する",[510,1054,1055,1056,1058],{},"両方の環境変数を設定してください。",[81,1057,354],{}," を参照。",[489,1060,1061,1064],{},[510,1062,1063],{},"すべてのフラグが無効として表示される",[510,1065,1066],{},"GitLabにフラグが存在し、アクティブな戦略が設定されていることを確認してください。その後、SDKが更新されるまで15秒待ちます。",[489,1068,1069,1072],{},[510,1070,1071],{},"GitLabでの変更が反映されない",[510,1073,1074],{},"SDKは15秒ごとにポーリングします。少し待ってからページをリロードしてください。",[489,1076,1077,1080],{},[510,1078,1079],{},"ローカルIPアドレスが機能しない",[510,1081,1082,1083,1086],{},"OSのファイアウォールがポート8080をブロックしている可能性があります。代わりに ",[81,1084,1085],{},"localhost:8080"," を使用してください。",[38,1088,1089],{"id":1089},"本番環境でのレート制限について",[12,1091,1092],{},"15秒のポーリングインターバルは、開発環境や小規模なデプロイには適しています。すべてのクライアントが同じIPからポーリングする場合、GitLab.comは15秒インターバルで約125クライアントをサポートできます。それを超えるとレート制限に達します。より大規模な本番アプリを構築する場合は、クライアントの前にUnleash Proxyを実行することを検討してください。すべてのインスタンスに代わってGitLabへのリクエストをバッチ処理し、上流のトラフィックを大幅に削減します。",[38,1094,1095],{"id":1095},"セキュリティに関する考慮事項",[1097,1098,1099,1108,1124,1133],"ol",{},[45,1100,1101,1107],{},[49,1102,1103,1106],{},[81,1104,1105],{},"debug=False"," はデモですでに設定されています："," このままにしておいてください。Flaskのデバッグモードはリモートコード実行を可能にする対話型デバッガーを公開します。",[45,1109,1110,1113,1114,1117,1118,1123],{},[49,1111,1112],{},"依存関係を最新の状態に保つ","：",[81,1115,1116],{},"requirements.txt"," には特定のバージョンが指定されています。CI/CDパイプラインでGitLabの",[28,1119,1122],{"href":1120,"rel":1121},"https://docs.gitlab.com/ja-jp/user/application_security/dependency_scanning/",[],"Dependency Scanning","を有効にして、脆弱性を把握し続けましょう。",[45,1125,1126,1129,1130,1132],{},[49,1127,1128],{},"認証情報には環境変数を使う","：ソースコードにインスタンスIDやトークンをハードコードしないでください。デモの ",[81,1131,354],{}," が正しいパターンを示しています。",[45,1134,1135,1138],{},[49,1136,1137],{},"インスタンスIDは読み取り専用です","：フラグの状態を取得するだけで、変更はできません。それでもシークレットとして扱ってください。",[38,1140,1141],{"id":1141},"まとめ",[12,1143,1144],{},"このチュートリアルでは、GitLabの機能フラグをPythonアプリケーションに統合する全ライフサイクルを説明しました。適切な戦略でフラグを作成すること、Unleash認証情報の取得、SDKの初期化、Flaskでのフラグのローカル評価、そして再デプロイなしにリアルタイムで動作を切り替えることまでをカバーしました。",[12,1146,1147,1148,1150,1151,1153],{},"インテグレーション全体に必要なのは、1つの依存関係（",[81,1149,560],{},"）、3つの環境変数、そして1つのメソッド呼び出し（",[81,1152,83],{},"）だけです。独立したUnleashサーバーも、パーソナルアクセストークンも、複雑なインフラも不要です。",[12,1155,1156,1157,1160],{},"機能フラグは、デプロイリスクを軽減するための最も実践的なツールの1つです。壊れた機能を即座に無効化したり、ターゲットユーザーグループから一定割合、そして全ユーザーへと段階的に展開したりする能力は、デプロイパイプラインに一切触れることなく、最小限のセットアップで大きな価値をもたらします。",[28,1158,62],{"href":30,"rel":1159},[]," は、あらゆるプロジェクトにフォークして応用できる、動作するベースを提供しています。",[38,1162,1163],{"id":1163},"リソース",[42,1165,1166,1172,1179,1186],{},[45,1167,1168],{},[28,1169,1171],{"href":30,"rel":1170},[],"GitLabのデモプロジェクト",[45,1173,1174],{},[28,1175,1178],{"href":1176,"rel":1177},"https://docs.gitlab.com/ja-jp/operations/feature_flags/",[],"GitLab 機能フラグドキュメント",[45,1180,1181],{},[28,1182,1185],{"href":1183,"rel":1184},"https://github.com/Unleash/unleash-python-sdk",[],"Unleash Python SDK（GitHub）",[45,1187,1188],{},[28,1189,1192],{"href":1190,"rel":1191},"https://github.com/Unleash/unleash#unleash-sdks",[],"Unleash SDK（全言語）",[1194,1195,1196],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}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 .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}",{"title":119,"searchDepth":157,"depth":157,"links":1198},[1199,1200,1201,1205,1208,1209,1210,1211,1212,1213,1214,1215,1216,1217,1218],{"id":40,"depth":157,"text":40},{"id":66,"depth":157,"text":67},{"id":90,"depth":157,"text":91,"children":1202},[1203,1204],{"id":106,"depth":459,"text":106},{"id":167,"depth":459,"text":167},{"id":178,"depth":157,"text":179,"children":1206},[1207],{"id":240,"depth":459,"text":240},{"id":280,"depth":157,"text":281},{"id":317,"depth":157,"text":318},{"id":564,"depth":157,"text":565},{"id":880,"depth":157,"text":881},{"id":909,"depth":157,"text":910},{"id":942,"depth":157,"text":943},{"id":1030,"depth":157,"text":1030},{"id":1089,"depth":157,"text":1089},{"id":1095,"depth":157,"text":1095},{"id":1141,"depth":157,"text":1141},{"id":1163,"depth":157,"text":1163},"product","2026-03-26","Unleash SDKを使ってPython FlaskアプリにGitLabの機能フラグを統合し、再デプロイなしでフィーチャーロールアウトを制御する方法を解説します。","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png",{},"/ja-jp/blog/getting-started-with-gitlab-feature-flags-in-python",{"config":1228,"title":5,"description":1230},{"noIndex":1229},false,"Unleash SDKを使ってPython FlaskアプリにGitLabの機能フラグを統合する具体的な方法をステップごとに解説します。再デプロイなしでフィーチャーロールアウトを制御し、段階的なリリース戦略でデプロイリスクを大幅に低減できます。","getting-started-with-gitlab-feature-flags-in-python","ja-jp/blog/getting-started-with-gitlab-feature-flags-in-python",[801,1234,1219],"tutorial","BlogPost","2026-06-23","0AsvcNK_xQeOkipgnSl6YEzLwXA06d4sJlIaznzUHto",{"logo":1239,"freeTrial":1244,"sales":1249,"login":1254,"items":1259,"search":1576,"minimal":1609,"duo":1626,"switchNav":1635,"pricingDeployment":1646},{"config":1240},{"href":1241,"dataGaName":1242,"dataGaLocation":1243},"/ja-jp/","gitlab logo","header",{"text":1245,"config":1246},"無料トライアルを開始",{"href":1247,"dataGaName":1248,"dataGaLocation":1243},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1250,"config":1251},"お問い合わせはこちら",{"href":1252,"dataGaName":1253,"dataGaLocation":1243},"/ja-jp/sales/","sales",{"text":1255,"config":1256},"サインイン",{"href":1257,"dataGaName":1258,"dataGaLocation":1243},"https://gitlab.com/users/sign_in/","sign in",[1260,1289,1391,1396,1500,1556],{"text":1261,"config":1262,"menu":1264},"プラットフォーム",{"dataNavLevelOne":1263},"platform",{"type":1265,"columns":1266},"cards",[1267,1273,1281],{"title":1261,"description":1268,"link":1269},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":1270,"config":1271},"プラットフォームの詳細はこちら",{"href":1272,"dataGaName":1263,"dataGaLocation":1243},"/ja-jp/platform/",{"title":1274,"description":1275,"link":1276},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":1277,"config":1278},"GitLab Duoのご紹介",{"href":1279,"dataGaName":1280,"dataGaLocation":1243},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1282,"description":1283,"link":1284},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":1285,"config":1286},"詳細はこちら",{"href":1287,"dataGaName":1288,"dataGaLocation":1243},"/ja-jp/why-gitlab/","why gitlab",{"text":1290,"left":667,"config":1291,"menu":1293},"製品",{"dataNavLevelOne":1292},"solutions",{"type":1294,"link":1295,"columns":1299,"feature":1370},"lists",{"text":1296,"config":1297},"すべてのソリューションを表示",{"href":1298,"dataGaName":1292,"dataGaLocation":1243},"/ja-jp/solutions/",[1300,1325,1348],{"title":1301,"description":1302,"link":1303,"items":1308},"自動化","CI/CDと自動化でデプロイを加速",{"config":1304},{"icon":1305,"href":1306,"dataGaName":1307,"dataGaLocation":1243},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[1309,1313,1316,1321],{"text":1310,"config":1311},"CI/CD",{"href":1312,"dataGaLocation":1243,"dataGaName":1310},"/ja-jp/solutions/continuous-integration/",{"text":1274,"config":1314},{"href":1279,"dataGaLocation":1243,"dataGaName":1315},"gitlab duo agent platform - product menu",{"text":1317,"config":1318},"ソースコード管理",{"href":1319,"dataGaLocation":1243,"dataGaName":1320},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":1322,"config":1323},"自動化されたソフトウェアデリバリー",{"href":1306,"dataGaLocation":1243,"dataGaName":1324},"Automated software delivery",{"title":1326,"description":1327,"link":1328,"items":1333},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":1329},{"href":1330,"dataGaName":1331,"dataGaLocation":1243,"icon":1332},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1334,1338,1343],{"text":1335,"config":1336},"アプリケーションセキュリティテスト",{"href":1330,"dataGaName":1337,"dataGaLocation":1243},"Application security testing",{"text":1339,"config":1340},"ソフトウェアサプライチェーンセキュリティ",{"href":1341,"dataGaLocation":1243,"dataGaName":1342},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":1344,"config":1345},"ソフトウェアコンプライアンス",{"href":1346,"dataGaName":1347,"dataGaLocation":1243},"/ja-jp/solutions/software-compliance/","software compliance",{"title":1349,"link":1350,"items":1355},"測定",{"config":1351},{"icon":1352,"href":1353,"dataGaName":1354,"dataGaLocation":1243},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[1356,1360,1365],{"text":1357,"config":1358},"可視性と測定",{"href":1353,"dataGaLocation":1243,"dataGaName":1359},"Visibility and Measurement",{"text":1361,"config":1362},"バリューストリーム管理",{"href":1363,"dataGaLocation":1243,"dataGaName":1364},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":1366,"config":1367},"分析とインサイト",{"href":1368,"dataGaLocation":1243,"dataGaName":1369},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":1371,"type":1294,"items":1372},"GitLabが活躍する場所",[1373,1379,1385],{"text":1374,"config":1375},"大企業",{"icon":1376,"href":1377,"dataGaLocation":1243,"dataGaName":1378},"Building","/ja-jp/enterprise/","enterprise",{"text":1380,"config":1381},"スモールビジネス",{"icon":1382,"href":1383,"dataGaLocation":1243,"dataGaName":1384},"Work","/ja-jp/small-business/","small business",{"text":1386,"config":1387},"公共部門",{"icon":1388,"href":1389,"dataGaLocation":1243,"dataGaName":1390},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":1392,"config":1393},"価格",{"href":1394,"dataGaName":1395,"dataGaLocation":1243,"dataNavLevelOne":1395},"/ja-jp/pricing/","pricing",{"text":1397,"config":1398,"menu":1400},"関連リソース",{"dataNavLevelOne":1399},"resources",{"type":1294,"link":1401,"columns":1405,"feature":1489},{"text":1402,"config":1403},"すべてのリソースを表示",{"href":1404,"dataGaName":1399,"dataGaLocation":1243},"/ja-jp/resources/",[1406,1439,1461],{"title":1407,"items":1408},"はじめに",[1409,1414,1419,1424,1429,1434],{"text":1410,"config":1411},"インストール",{"href":1412,"dataGaName":1413,"dataGaLocation":1243},"/ja-jp/install/","install",{"text":1415,"config":1416},"クイックスタートガイド",{"href":1417,"dataGaName":1418,"dataGaLocation":1243},"/ja-jp/get-started/","quick setup checklists",{"text":1420,"config":1421},"学ぶ",{"href":1422,"dataGaLocation":1243,"dataGaName":1423},"https://university.gitlab.com/","learn",{"text":1425,"config":1426},"製品ドキュメント",{"href":1427,"dataGaName":1428,"dataGaLocation":1243},"https://docs.gitlab.com/","product documentation",{"text":1430,"config":1431},"ベストプラクティスビデオ",{"href":1432,"dataGaName":1433,"dataGaLocation":1243},"/ja-jp/getting-started-videos/","best practice videos",{"text":1435,"config":1436},"インテグレーション",{"href":1437,"dataGaName":1438,"dataGaLocation":1243},"/ja-jp/integrations/","integrations",{"title":1440,"items":1441},"検索する",[1442,1447,1452,1456],{"text":1443,"config":1444},"お客様成功事例",{"href":1445,"dataGaName":1446,"dataGaLocation":1243},"/ja-jp/customers/","customer success stories",{"text":1448,"config":1449},"ブログ",{"href":1450,"dataGaName":1451,"dataGaLocation":1243},"/ja-jp/blog/","blog",{"text":1453,"config":1454},"The Source",{"href":1455,"dataGaName":1451,"dataGaLocation":1243},"/ja-jp/the-source/",{"text":1457,"config":1458},"リモート",{"href":1459,"dataGaName":1460,"dataGaLocation":1243},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1462,"items":1463},"つなげる",[1464,1469,1474,1479,1484],{"text":1465,"config":1466},"GitLabサービス",{"href":1467,"dataGaName":1468,"dataGaLocation":1243},"/ja-jp/services/","services",{"text":1470,"config":1471},"コミュニティ",{"href":1472,"dataGaName":1473,"dataGaLocation":1243},"/community/","community",{"text":1475,"config":1476},"フォーラム",{"href":1477,"dataGaName":1478,"dataGaLocation":1243},"https://forum.gitlab.com/","forum",{"text":1480,"config":1481},"イベント",{"href":1482,"dataGaName":1483,"dataGaLocation":1243},"/events/","events",{"text":1485,"config":1486},"パートナー",{"href":1487,"dataGaName":1488,"dataGaLocation":1243},"/ja-jp/partners/","partners",{"config":1490,"title":1493,"text":1494,"link":1495},{"background":1491,"textColor":1492},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1496,"config":1497},"最新情報を読む",{"href":1498,"dataGaName":1499,"dataGaLocation":1243},"/ja-jp/whats-new/","whats new",{"text":1501,"config":1502,"menu":1504},"企業情報",{"dataNavLevelOne":1503},"company",{"type":1294,"columns":1505},[1506],{"items":1507},[1508,1513,1519,1521,1526,1531,1536,1541,1546,1551],{"text":1509,"config":1510},"GitLabについて",{"href":1511,"dataGaName":1512,"dataGaLocation":1243},"/ja-jp/company/","about",{"text":1514,"config":1515,"footerGa":1518},"採用情報",{"href":1516,"dataGaName":1517,"dataGaLocation":1243},"/jobs/","jobs",{"dataGaName":1517},{"text":1480,"config":1520},{"href":1482,"dataGaName":1483,"dataGaLocation":1243},{"text":1522,"config":1523},"経営陣",{"href":1524,"dataGaName":1525,"dataGaLocation":1243},"/company/team/e-group/","leadership",{"text":1527,"config":1528},"ハンドブック",{"href":1529,"dataGaName":1530,"dataGaLocation":1243},"https://handbook.gitlab.com/","handbook",{"text":1532,"config":1533},"投資家向け情報",{"href":1534,"dataGaName":1535,"dataGaLocation":1243},"https://ir.gitlab.com/","investor relations",{"text":1537,"config":1538},"トラストセンター",{"href":1539,"dataGaName":1540,"dataGaLocation":1243},"/ja-jp/security/","trust center",{"text":1542,"config":1543},"AI Transparency Center",{"href":1544,"dataGaName":1545,"dataGaLocation":1243},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1547,"config":1548},"ニュースレター",{"href":1549,"dataGaName":1550,"dataGaLocation":1243},"/company/contact/#contact-forms","newsletter",{"text":1552,"config":1553},"プレス",{"href":1554,"dataGaName":1555,"dataGaLocation":1243},"/press/","press",{"text":1557,"config":1558,"menu":1559},"お問い合わせ",{"dataNavLevelOne":1503},{"type":1294,"columns":1560},[1561],{"items":1562},[1563,1566,1571],{"text":1250,"config":1564},{"href":1252,"dataGaName":1565,"dataGaLocation":1243},"talk to sales",{"text":1567,"config":1568},"サポートを受ける",{"href":1569,"dataGaName":1570,"dataGaLocation":1243},"https://support.gitlab.com","support portal",{"text":1572,"config":1573},"カスタマーポータル",{"href":1574,"dataGaName":1575,"dataGaLocation":1243},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1577,"login":1578,"suggestions":1585},"閉じる",{"text":1579,"link":1580},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1581,"config":1582},"GitLab.com",{"href":1257,"dataGaName":1583,"dataGaLocation":1584},"search login","search",{"text":1586,"default":1587},"提案",[1588,1590,1595,1597,1601,1605],{"text":1274,"config":1589},{"href":1279,"dataGaName":1274,"dataGaLocation":1584},{"text":1591,"config":1592},"コード提案（AI）",{"href":1593,"dataGaName":1594,"dataGaLocation":1584},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1310,"config":1596},{"href":1312,"dataGaName":1310,"dataGaLocation":1584},{"text":1598,"config":1599},"GitLab on AWS",{"href":1600,"dataGaName":1598,"dataGaLocation":1584},"/ja-jp/partners/technology-partners/aws/",{"text":1602,"config":1603},"GitLab on Google Cloud",{"href":1604,"dataGaName":1602,"dataGaLocation":1584},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1606,"config":1607},"GitLabを選ぶ理由",{"href":1287,"dataGaName":1608,"dataGaLocation":1584},"Why GitLab?",{"freeTrial":1610,"mobileIcon":1614,"desktopIcon":1619,"secondaryButton":1622},{"text":1245,"config":1611},{"href":1612,"dataGaName":1248,"dataGaLocation":1613},"https://gitlab.com/-/trials/new/","nav",{"altText":1615,"config":1616},"GitLabアイコン",{"src":1617,"dataGaName":1618,"dataGaLocation":1613},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1615,"config":1620},{"src":1621,"dataGaName":1618,"dataGaLocation":1613},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1407,"config":1623},{"href":1624,"dataGaName":1625,"dataGaLocation":1613},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1627,"mobileIcon":1631,"desktopIcon":1633},{"text":1628,"config":1629},"GitLab Duoの詳細について",{"href":1279,"dataGaName":1630,"dataGaLocation":1613},"gitlab duo",{"altText":1615,"config":1632},{"src":1617,"dataGaName":1618,"dataGaLocation":1613},{"altText":1615,"config":1634},{"src":1621,"dataGaName":1618,"dataGaLocation":1613},{"button":1636,"mobileIcon":1641,"desktopIcon":1643},{"text":1637,"config":1638},"/switch",{"href":1639,"dataGaName":1640,"dataGaLocation":1613},"#contact","switch",{"altText":1615,"config":1642},{"src":1617,"dataGaName":1618,"dataGaLocation":1613},{"altText":1615,"config":1644},{"src":1645,"dataGaName":1618,"dataGaLocation":1613},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1647,"mobileIcon":1652,"desktopIcon":1654},{"text":1648,"config":1649},"料金ページに戻る",{"href":1394,"dataGaName":1650,"dataGaLocation":1613,"icon":1651},"back to pricing","GoBack",{"altText":1615,"config":1653},{"src":1617,"dataGaName":1618,"dataGaLocation":1613},{"altText":1615,"config":1655},{"src":1621,"dataGaName":1618,"dataGaLocation":1613},{"title":1657,"button":1658,"config":1663},"エージェント型AIがソフトウェアデリバリーをどのように変革するかをご覧ください",{"text":1659,"config":1660},"6月18日のGitLab Transcend日本開催版に参加ください",{"href":1661,"dataGaName":1662,"dataGaLocation":1243},"/ja-jp/events/transcend/virtual/","transcend event",{"layout":1664,"disabled":1229},"release",{"data":1666},{"text":1667,"source":1668,"edit":1674,"contribute":1679,"config":1684,"items":1689,"minimal":1896},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1669,"config":1670},"ページのソースを表示",{"href":1671,"dataGaName":1672,"dataGaLocation":1673},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1675,"config":1676},"このページを編集",{"href":1677,"dataGaName":1678,"dataGaLocation":1673},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1680,"config":1681},"ご協力をお願いします",{"href":1682,"dataGaName":1683,"dataGaLocation":1673},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1685,"facebook":1686,"youtube":1687,"linkedin":1688},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1690,1735,1788,1832,1863],{"title":1392,"links":1691,"subMenu":1706},[1692,1696,1701],{"text":1693,"config":1694},"プランの表示",{"href":1394,"dataGaName":1695,"dataGaLocation":1673},"view plans",{"text":1697,"config":1698},"Premiumを選ぶ理由",{"href":1699,"dataGaName":1700,"dataGaLocation":1673},"/ja-jp/pricing/premium/","why premium",{"text":1702,"config":1703},"Ultimateを選ぶ理由",{"href":1704,"dataGaName":1705,"dataGaLocation":1673},"/ja-jp/pricing/ultimate/","why ultimate",[1707],{"title":1557,"links":1708},[1709,1711,1713,1715,1720,1725,1730],{"text":1557,"config":1710},{"href":1252,"dataGaName":1253,"dataGaLocation":1673},{"text":1567,"config":1712},{"href":1569,"dataGaName":1570,"dataGaLocation":1673},{"text":1572,"config":1714},{"href":1574,"dataGaName":1575,"dataGaLocation":1673},{"text":1716,"config":1717},"ステータス",{"href":1718,"dataGaName":1719,"dataGaLocation":1673},"https://status.gitlab.com/","status",{"text":1721,"config":1722},"利用規約",{"href":1723,"dataGaName":1724,"dataGaLocation":1673},"/terms/","terms of use",{"text":1726,"config":1727},"プライバシーに関する声明",{"href":1728,"dataGaName":1729,"dataGaLocation":1673},"/ja-jp/privacy/","privacy statement",{"text":1731,"config":1732},"Cookie 優先設定",{"dataGaName":1733,"dataGaLocation":1673,"id":1734,"isOneTrustButton":667},"cookie preferences","ot-sdk-btn",{"title":1290,"links":1736,"subMenu":1745},[1737,1741],{"text":1738,"config":1739},"DevSecOpsプラットフォーム",{"href":1272,"dataGaName":1740,"dataGaLocation":1673},"devsecops platform",{"text":1742,"config":1743},"AI支援開発",{"href":1279,"dataGaName":1744,"dataGaLocation":1673},"ai-assisted development",[1746],{"title":1747,"links":1748},"トピック",[1749,1753,1758,1763,1768,1773,1778,1783],{"text":1310,"config":1750},{"href":1751,"dataGaName":1752,"dataGaLocation":1673},"/ja-jp/topics/ci-cd/","cicd",{"text":1754,"config":1755},"GitOps",{"href":1756,"dataGaName":1757,"dataGaLocation":1673},"/ja-jp/topics/gitops/","gitops",{"text":1759,"config":1760},"DevOps",{"href":1761,"dataGaName":1762,"dataGaLocation":1673},"/ja-jp/topics/devops/","devops",{"text":1764,"config":1765},"バージョン管理",{"href":1766,"dataGaName":1767,"dataGaLocation":1673},"/ja-jp/topics/version-control/","version control",{"text":1769,"config":1770},"DevSecOps",{"href":1771,"dataGaName":1772,"dataGaLocation":1673},"/ja-jp/topics/devsecops/","devsecops",{"text":1774,"config":1775},"クラウドネイティブ",{"href":1776,"dataGaName":1777,"dataGaLocation":1673},"/ja-jp/topics/cloud-native/","cloud native",{"text":1779,"config":1780},"コーディングのためのAI",{"href":1781,"dataGaName":1782,"dataGaLocation":1673},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1784,"config":1785},"エージェント型AI",{"href":1786,"dataGaName":1787,"dataGaLocation":1673},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1789,"links":1790},"ソリューション",[1791,1794,1796,1801,1805,1808,1811,1814,1817,1819,1822,1827],{"text":1335,"config":1792},{"href":1330,"dataGaName":1793,"dataGaLocation":1673},"Application Security Testing",{"text":1322,"config":1795},{"href":1306,"dataGaName":1307,"dataGaLocation":1673},{"text":1797,"config":1798},"アジャイル開発",{"href":1799,"dataGaName":1800,"dataGaLocation":1673},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":1802,"config":1803},"SCM",{"href":1319,"dataGaName":1804,"dataGaLocation":1673},"source code management",{"text":1310,"config":1806},{"href":1312,"dataGaName":1807,"dataGaLocation":1673},"continuous integration & delivery",{"text":1361,"config":1809},{"href":1363,"dataGaName":1810,"dataGaLocation":1673},"value stream management",{"text":1754,"config":1812},{"href":1813,"dataGaName":1757,"dataGaLocation":1673},"/ja-jp/solutions/gitops/",{"text":1815,"config":1816},"エンタープライズ",{"href":1377,"dataGaName":1378,"dataGaLocation":1673},{"text":1380,"config":1818},{"href":1383,"dataGaName":1384,"dataGaLocation":1673},{"text":1820,"config":1821},"公共機関",{"href":1389,"dataGaName":1390,"dataGaLocation":1673},{"text":1823,"config":1824},"教育",{"href":1825,"dataGaName":1826,"dataGaLocation":1673},"/ja-jp/solutions/education/","education",{"text":1828,"config":1829},"金融サービス",{"href":1830,"dataGaName":1831,"dataGaLocation":1673},"/ja-jp/solutions/finance/","financial services",{"title":1163,"links":1833},[1834,1836,1838,1840,1844,1846,1849,1851,1853,1855,1857,1859,1861],{"text":1410,"config":1835},{"href":1412,"dataGaName":1413,"dataGaLocation":1673},{"text":1415,"config":1837},{"href":1417,"dataGaName":1418,"dataGaLocation":1673},{"text":1420,"config":1839},{"href":1422,"dataGaName":1423,"dataGaLocation":1673},{"text":1425,"config":1841},{"href":1842,"dataGaName":1843,"dataGaLocation":1673},"https://docs.gitlab.com/ja-jp/","docs",{"text":1448,"config":1845},{"href":1450,"dataGaName":1451,"dataGaLocation":1673},{"text":1847,"config":1848},"新着情報",{"href":1498,"dataGaName":1499,"dataGaLocation":1673},{"text":1443,"config":1850},{"href":1445,"dataGaName":1446,"dataGaLocation":1673},{"text":1457,"config":1852},{"href":1459,"dataGaName":1460,"dataGaLocation":1673},{"text":1465,"config":1854},{"href":1467,"dataGaName":1468,"dataGaLocation":1673},{"text":1470,"config":1856},{"href":1472,"dataGaName":1473,"dataGaLocation":1673},{"text":1475,"config":1858},{"href":1477,"dataGaName":1478,"dataGaLocation":1673},{"text":1480,"config":1860},{"href":1482,"dataGaName":1483,"dataGaLocation":1673},{"text":1485,"config":1862},{"href":1487,"dataGaName":1488,"dataGaLocation":1673},{"title":1864,"links":1865},"会社情報",[1866,1868,1870,1872,1874,1876,1880,1885,1887,1889,1891],{"text":1509,"config":1867},{"href":1511,"dataGaName":1503,"dataGaLocation":1673},{"text":1514,"config":1869},{"href":1516,"dataGaName":1517,"dataGaLocation":1673},{"text":1522,"config":1871},{"href":1524,"dataGaName":1525,"dataGaLocation":1673},{"text":1527,"config":1873},{"href":1529,"dataGaName":1530,"dataGaLocation":1673},{"text":1532,"config":1875},{"href":1534,"dataGaName":1535,"dataGaLocation":1673},{"text":1877,"config":1878},"Sustainability",{"href":1879,"dataGaName":1877,"dataGaLocation":1673},"/sustainability/",{"text":1881,"config":1882},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":1883,"dataGaName":1884,"dataGaLocation":1673},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1537,"config":1886},{"href":1539,"dataGaName":1540,"dataGaLocation":1673},{"text":1547,"config":1888},{"href":1549,"dataGaName":1550,"dataGaLocation":1673},{"text":1552,"config":1890},{"href":1554,"dataGaName":1555,"dataGaLocation":1673},{"text":1892,"config":1893},"現代奴隷制の透明性に関する声明",{"href":1894,"dataGaName":1895,"dataGaLocation":1673},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1897},[1898,1900,1903],{"text":1721,"config":1899},{"href":1723,"dataGaName":1724,"dataGaLocation":1673},{"text":1901,"config":1902},"Cookieの設定",{"dataGaName":1733,"dataGaLocation":1673,"id":1734,"isOneTrustButton":667},{"text":1726,"config":1904},{"href":1728,"dataGaName":1729,"dataGaLocation":1673},[1906],{"id":1907,"title":7,"body":1223,"config":1908,"content":1911,"description":1223,"extension":1914,"meta":1915,"navigation":667,"path":1916,"seo":1917,"stem":1918,"__hash__":1919},"blogAuthors/en-us/blog/authors/omid-khan.yml",{"template":1909,"gitlabHandle":1910},"BlogAuthor","OmidKhan",{"name":7,"config":1912,"role":119},{"headshot":1913},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1769090536/q4p3qwthtken8fpokgzu.jpg","yml",{},"/en-us/blog/authors/omid-khan",{},"en-us/blog/authors/omid-khan","4ZHOi5nEiZLdJm1phW-47SM0x-BGo8jNbg_Zt0oSzEQ",[1921,1929,1937],{"title":1922,"description":1923,"heroImage":1924,"category":1219,"date":1925,"authors":1926,"slug":1928,"externalUrl":1223},"GitLab 19.1リリース","GitLab 19.1でリリースした最新機能を公開します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1781621337/mtjqzed2cqtef0frmor2.png","2026-06-18",[1927],"GitLab Japan Team","gitlab-19-1-release",{"title":1930,"description":1931,"heroImage":1932,"category":1219,"date":1933,"authors":1934,"slug":1936,"externalUrl":1223},"組織全体でCIコンポーネントの使用状況を追跡","GitLab 19.0のCI/CDカタログに追加されたComponents Analyticsで、共有CI/CDコンポーネントの利用状況を組織全体で把握できます。どのプロジェクトがどのバージョンを使っているかを確認し、必要なアクションを取れます。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1779189265/iqzyhhiwagxzwywvjzow.png","2026-05-21",[1935],"Corinne Dent","track-ci-component-usage",{"title":1938,"description":1939,"heroImage":1932,"category":1219,"date":1933,"authors":1940,"slug":1941,"externalUrl":1223},"GitLab 19.0リリース","GitLab 19.0でリリースした最新機能を公開します。",[1927],"gitlab-19-0-release",{"promotions":1943},[1944,1958,1969,1981],{"id":1945,"categories":1946,"header":1948,"text":1949,"button":1950,"image":1955},"ai-modernization",[1947],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":1951,"config":1952},"AI成熟度スコアを確認する",{"href":1953,"dataGaName":1954,"dataGaLocation":1451},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":1956},{"src":1957},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1959,"categories":1960,"header":1961,"text":1949,"button":1962,"image":1966},"devops-modernization",[1219,1772],"単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":1963,"config":1964},"DevOps成熟度スコアを確認しましょう",{"href":1965,"dataGaName":1954,"dataGaLocation":1451},"/ja-jp/assessments/devops-modernization-assessment/",{"config":1967},{"src":1968},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1970,"categories":1971,"header":1973,"text":1949,"button":1974,"image":1978},"security-modernization",[1972],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":1975,"config":1976},"セキュリティ成熟度スコアを確認しましょう",{"href":1977,"dataGaName":1954,"dataGaLocation":1451},"/ja-jp/assessments/security-modernization-assessment/",{"config":1979},{"src":1980},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1982,"paths":1983,"header":1986,"text":1987,"button":1988,"image":1993},"github-azure-migration",[1984,1985],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":1989,"config":1990},"GitLabとGitHubの比較を見る",{"href":1991,"dataGaName":1992,"dataGaLocation":1451},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1994},{"src":1968},{"header":1996,"blurb":1997,"button":1998,"secondaryButton":2002},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1245,"config":1999},{"href":2000,"dataGaName":1248,"dataGaLocation":2001},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1557,"config":2003},{"href":1252,"dataGaName":1253,"dataGaLocation":2001},1782249611701]