[{"data":1,"prerenderedAt":2486},["ShallowReactive",2],{"content:\u002F2025\u002F11\u002Fgitlab-ci":3,"surround:\u002F2025\u002F11\u002Fgitlab-ci":2475},{"id":4,"title":5,"body":6,"categories":2452,"date":2454,"description":2455,"draft":2456,"extension":2457,"image":2458,"meta":2459,"navigation":424,"path":2461,"permalink":2458,"published":2458,"readingTime":2462,"recommend":2458,"references":2458,"seo":2467,"sitemap":2468,"stem":2469,"tags":2470,"type":2472,"updated":2473,"__hash__":2474},"content\u002Fposts\u002F2025\u002F11\u002Fgitlab-ci.md","GitLab Runner 使用与 CICD 全面指南",{"type":7,"value":8,"toc":2416},"minimark",[9,14,19,23,56,60,63,95,98,118,132,136,242,246,290,294,298,328,332,338,341,355,358,362,370,583,587,693,697,702,788,792,823,828,870,875,896,902,954,958,972,977,1073,1078,1093,1098,1159,1163,1188,1192,1196,1242,1245,1249,1307,1311,1364,1368,1373,1447,1452,1476,1481,1515,1520,1554,1558,1595,1600,1624,1629,1653,1658,1693,1697,1701,1740,1744,1796,1800,1825,1829,1854,1858,1931,1935,1986,1990,2001,2005,2008,2014,2379,2382,2386,2412],[10,11,13],"h2",{"id":12},"一部署与注册-runner","一、部署与注册 Runner",[15,16,18],"h3",{"id":17},"_11-部署-runner","1.1 部署 Runner",[20,21,22],"p",{},"进入 Runner 容器：",[24,25,30],"pre",{"className":26,"code":27,"language":28,"meta":29,"style":29},"language-bash shiki shiki-themes github-light github-dark","docker exec -it gitlab-runner bash\n","bash","",[31,32,33],"code",{"__ignoreMap":29},[34,35,38,42,46,50,53],"span",{"class":36,"data-line":37,"line":37},"line",1,[34,39,41],{"class":40},"sScJk","docker",[34,43,45],{"class":44},"sZZnC"," exec",[34,47,49],{"class":48},"sj4cs"," -it",[34,51,52],{"class":44}," gitlab-runner",[34,54,55],{"class":44}," bash\n",[15,57,59],{"id":58},"_12-注册-runner","1.2 注册 Runner",[20,61,62],{},"执行注册命令，将 Runner 绑定到指定的 GitLab 实例与项目：",[24,64,66],{"className":26,"code":65,"language":28,"meta":29,"style":29},"gitlab-runner register --url $gitlab-url --token $your-token\n",[31,67,68],{"__ignoreMap":29},[34,69,70,73,76,79,83,86,89,92],{"class":36,"data-line":37,"line":37},[34,71,72],{"class":40},"gitlab-runner",[34,74,75],{"class":44}," register",[34,77,78],{"class":48}," --url",[34,80,82],{"class":81},"sVt8B"," $gitlab",[34,84,85],{"class":44},"-url",[34,87,88],{"class":48}," --token",[34,90,91],{"class":81}," $your",[34,93,94],{"class":44},"-token\n",[20,96,97],{},"注册过程会依次要求输入信息：",[99,100,101,108,113],"ul",{},[102,103,104],"li",{},[105,106,107],"strong",{},"GitLab 实例地址",[102,109,110],{},[105,111,112],{},"Runner 名称",[102,114,115],{},[105,116,117],{},"执行器类型（executor）",[20,119,120,121,124,125,128,129,131],{},"注册成功后，配置信息会写入 ",[31,122,123],{"code":123},"\u002Fetc\u002Fgitlab-runner\u002Fconfig.toml","。\n若注册时选择了 ",[31,126,127],{"code":127},"custom"," 执行器，可修改为 ",[31,130,41],{"code":41},"，再重启容器即可。",[15,133,135],{"id":134},"_13-执行器类型说明","1.3 执行器类型说明",[137,138,139,152],"table",{},[140,141,142],"thead",{},[143,144,145,149],"tr",{},[146,147,148],"th",{},"Executor",[146,150,151],{},"说明",[153,154,155,163,171,179,186,194,202,210,218,226,234],"tbody",{},[143,156,157,160],{},[158,159,127],"td",{},[158,161,162],{},"自定义执行器，需自编执行脚本",[143,164,165,168],{},[158,166,167],{},"parallels",[158,169,170],{},"仅 macOS 支持",[143,172,173,176],{},[158,174,175],{},"virtualbox",[158,177,178],{},"使用虚拟机环境",[143,180,181,183],{},[158,182,41],{},[158,184,185],{},"最常用方式，隔离性好",[143,187,188,191],{},[158,189,190],{},"docker+machine",[158,192,193],{},"自动创建 Docker 主机执行 Job",[143,195,196,199],{},[158,197,198],{},"docker-autoscaler",[158,200,201],{},"自动扩容执行环境",[143,203,204,207],{},[158,205,206],{},"shell",[158,208,209],{},"使用宿主机 Shell 执行",[143,211,212,215],{},[158,213,214],{},"ssh",[158,216,217],{},"远程主机执行",[143,219,220,223],{},[158,221,222],{},"docker-windows",[158,224,225],{},"Windows 容器执行",[143,227,228,231],{},[158,229,230],{},"kubernetes",[158,232,233],{},"在 K8s 集群中运行",[143,235,236,239],{},[158,237,238],{},"instance",[158,240,241],{},"GitLab EE 专用执行器",[15,243,245],{"id":244},"_14-runner-执行规则总结","1.4 Runner 执行规则总结",[137,247,248,258],{},[140,249,250],{},[143,251,252,255],{},[146,253,254],{},"场景",[146,256,257],{},"Runner 会不会执行",[153,259,260,268,275,283],{},[143,261,262,265],{},[158,263,264],{},"Runner 有标签 build，Job 标签写 build",[158,266,267],{},"✅ 执行",[143,269,270,273],{},[158,271,272],{},"Runner 有标签 build，Job 没写标签但勾了 Run untagged jobs",[158,274,267],{},[143,276,277,280],{},[158,278,279],{},"Runner 有标签 build，Job 没写标签且未勾选 Run untagged jobs",[158,281,282],{},"❌ 不执行",[143,284,285,288],{},[158,286,287],{},"Runner 无标签（空），Job 写 build",[158,289,282],{},[10,291,293],{"id":292},"二gitlab-cicd-变量管理","二、GitLab CI\u002FCD 变量管理",[15,295,297],{"id":296},"_21-常用预定义变量","2.1 常用预定义变量",[137,299,300,310],{},[140,301,302],{},[143,303,304,307],{},[146,305,306],{},"变量",[146,308,309],{},"含义",[153,311,312,320],{},[143,313,314,317],{},[158,315,316],{},"CI_COMMIT_BRANCH",[158,318,319],{},"当前提交分支",[143,321,322,325],{},[158,323,324],{},"CI_COMMIT_TAG",[158,326,327],{},"当前提交 Tag",[15,329,331],{"id":330},"_22-设置环境变量","2.2 设置环境变量",[20,333,334,335],{},"路径：",[105,336,337],{},"Settings > CI\u002FCD > Variables",[20,339,340],{},"可配置两类属性：",[99,342,343,349],{},[102,344,345,348],{},[105,346,347],{},"Visible","：允许变量忽略空格、换行检查；",[102,350,351,354],{},[105,352,353],{},"Masked","：更严格的安全校验（例如 Token 需要符合特定格式）。",[20,356,357],{},"若变量在部分分支不可用，可关闭变量的 “Protect variable” 选项，以便所有分支访问。",[10,359,361],{"id":360},"三gitlab-ci-基础语法","三、GitLab CI 基础语法",[15,363,365,366,369],{"id":364},"_31-gitlab-ciyml-文件结构","3.1 ",[31,367,368],{"code":368},".gitlab-ci.yml"," 文件结构",[24,371,375],{"className":372,"code":373,"language":374,"meta":29,"style":29},"language-yaml shiki shiki-themes github-light github-dark","stages:\n  - build\n  - test\n  - deploy\n\nbuild-job:\n  stage: build\n  script:\n    - echo \"Building...\"\n    - npm install\n    - npm run build\n\ntest-job:\n  stage: test\n  script:\n    - npm test\n\ndeploy-job:\n  stage: deploy\n  script:\n    - scp -r dist\u002F* user@server:\u002Fvar\u002Fwww\u002Fapp\n","yaml",[31,376,377,386,399,409,419,426,434,447,457,469,481,493,498,506,517,526,538,543,551,562,571],{"__ignoreMap":29},[34,378,379,383],{"class":36,"data-line":37,"line":37},[34,380,382],{"class":381},"s9eBZ","stages",[34,384,385],{"class":81},":\n",[34,387,389,393,396],{"class":36,"data-line":388,"line":388},2,[34,390,392],{"class":391},"indent","  ",[34,394,395],{"class":81},"- ",[34,397,398],{"class":44},"build\n",[34,400,402,404,406],{"class":36,"data-line":401,"line":401},3,[34,403,392],{"class":391},[34,405,395],{"class":81},[34,407,408],{"class":44},"test\n",[34,410,412,414,416],{"class":36,"data-line":411,"line":411},4,[34,413,392],{"class":391},[34,415,395],{"class":81},[34,417,418],{"class":44},"deploy\n",[34,420,422],{"class":36,"data-line":421,"line":421},5,[34,423,425],{"emptyLinePlaceholder":424},true,"\n",[34,427,429,432],{"class":36,"data-line":428,"line":428},6,[34,430,431],{"class":381},"build-job",[34,433,385],{"class":81},[34,435,437,439,442,445],{"class":36,"data-line":436,"line":436},7,[34,438,392],{"class":391},[34,440,441],{"class":381},"stage",[34,443,444],{"class":81},": ",[34,446,398],{"class":44},[34,448,450,452,455],{"class":36,"data-line":449,"line":449},8,[34,451,392],{"class":391},[34,453,454],{"class":381},"script",[34,456,385],{"class":81},[34,458,460,462,464,466],{"class":36,"data-line":459,"line":459},9,[34,461,392],{"class":391},[34,463,392],{"class":391},[34,465,395],{"class":81},[34,467,468],{"class":44},"echo \"Building...\"\n",[34,470,472,474,476,478],{"class":36,"data-line":471,"line":471},10,[34,473,392],{"class":391},[34,475,392],{"class":391},[34,477,395],{"class":81},[34,479,480],{"class":44},"npm install\n",[34,482,484,486,488,490],{"class":36,"data-line":483,"line":483},11,[34,485,392],{"class":391},[34,487,392],{"class":391},[34,489,395],{"class":81},[34,491,492],{"class":44},"npm run build\n",[34,494,496],{"class":36,"data-line":495,"line":495},12,[34,497,425],{"emptyLinePlaceholder":424},[34,499,501,504],{"class":36,"data-line":500,"line":500},13,[34,502,503],{"class":381},"test-job",[34,505,385],{"class":81},[34,507,509,511,513,515],{"class":36,"data-line":508,"line":508},14,[34,510,392],{"class":391},[34,512,441],{"class":381},[34,514,444],{"class":81},[34,516,408],{"class":44},[34,518,520,522,524],{"class":36,"data-line":519,"line":519},15,[34,521,392],{"class":391},[34,523,454],{"class":381},[34,525,385],{"class":81},[34,527,529,531,533,535],{"class":36,"data-line":528,"line":528},16,[34,530,392],{"class":391},[34,532,392],{"class":391},[34,534,395],{"class":81},[34,536,537],{"class":44},"npm test\n",[34,539,541],{"class":36,"data-line":540,"line":540},17,[34,542,425],{"emptyLinePlaceholder":424},[34,544,546,549],{"class":36,"data-line":545,"line":545},18,[34,547,548],{"class":381},"deploy-job",[34,550,385],{"class":81},[34,552,554,556,558,560],{"class":36,"data-line":553,"line":553},19,[34,555,392],{"class":391},[34,557,441],{"class":381},[34,559,444],{"class":81},[34,561,418],{"class":44},[34,563,565,567,569],{"class":36,"data-line":564,"line":564},20,[34,566,392],{"class":391},[34,568,454],{"class":381},[34,570,385],{"class":81},[34,572,574,576,578,580],{"class":36,"data-line":573,"line":573},21,[34,575,392],{"class":391},[34,577,392],{"class":391},[34,579,395],{"class":81},[34,581,582],{"class":44},"scp -r dist\u002F* user@server:\u002Fvar\u002Fwww\u002Fapp\n",[15,584,586],{"id":585},"_32-关键字段说明","3.2 关键字段说明",[137,588,589,598],{},[140,590,591],{},[143,592,593,596],{},[146,594,595],{},"字段",[146,597,151],{},[153,599,600,607,614,621,629,637,645,653,661,669,677,685],{},[143,601,602,604],{},[158,603,382],{},[158,605,606],{},"定义阶段（顺序执行）",[143,608,609,611],{},[158,610,441],{},[158,612,613],{},"当前 job 所属阶段",[143,615,616,618],{},[158,617,454],{},[158,619,620],{},"要执行的命令",[143,622,623,626],{},[158,624,625],{},"tags",[158,627,628],{},"指定执行 Runner 标签",[143,630,631,634],{},[158,632,633],{},"only \u002F except",[158,635,636],{},"执行条件",[143,638,639,642],{},[158,640,641],{},"rules",[158,643,644],{},"高级条件控制",[143,646,647,650],{},[158,648,649],{},"needs",[158,651,652],{},"指定依赖",[143,654,655,658],{},[158,656,657],{},"artifacts",[158,659,660],{},"构建产物",[143,662,663,666],{},[158,664,665],{},"cache",[158,667,668],{},"缓存依赖",[143,670,671,674],{},[158,672,673],{},"variables",[158,675,676],{},"定义变量",[143,678,679,682],{},[158,680,681],{},"image",[158,683,684],{},"指定 Docker 镜像",[143,686,687,690],{},[158,688,689],{},"before_script \u002F after_script",[158,691,692],{},"前置或后置命令",[15,694,696],{"id":695},"_33-常见高级写法","3.3 常见高级写法",[20,698,699],{},[105,700,701],{},"使用变量",[24,703,705],{"className":372,"code":704,"language":374,"meta":29,"style":29},"variables:\n  NODE_ENV: production\n  APP_PATH: \u002Fapp\n\nbuild:\n  stage: build\n  script:\n    - echo \"$NODE_ENV\"\n    - mkdir -p $APP_PATH\n",[31,706,707,713,725,737,741,748,758,766,777],{"__ignoreMap":29},[34,708,709,711],{"class":36,"data-line":37,"line":37},[34,710,673],{"class":381},[34,712,385],{"class":81},[34,714,715,717,720,722],{"class":36,"data-line":388,"line":388},[34,716,392],{"class":391},[34,718,719],{"class":381},"NODE_ENV",[34,721,444],{"class":81},[34,723,724],{"class":44},"production\n",[34,726,727,729,732,734],{"class":36,"data-line":401,"line":401},[34,728,392],{"class":391},[34,730,731],{"class":381},"APP_PATH",[34,733,444],{"class":81},[34,735,736],{"class":44},"\u002Fapp\n",[34,738,739],{"class":36,"data-line":411,"line":411},[34,740,425],{"emptyLinePlaceholder":424},[34,742,743,746],{"class":36,"data-line":421,"line":421},[34,744,745],{"class":381},"build",[34,747,385],{"class":81},[34,749,750,752,754,756],{"class":36,"data-line":428,"line":428},[34,751,392],{"class":391},[34,753,441],{"class":381},[34,755,444],{"class":81},[34,757,398],{"class":44},[34,759,760,762,764],{"class":36,"data-line":436,"line":436},[34,761,392],{"class":391},[34,763,454],{"class":381},[34,765,385],{"class":81},[34,767,768,770,772,774],{"class":36,"data-line":449,"line":449},[34,769,392],{"class":391},[34,771,392],{"class":391},[34,773,395],{"class":81},[34,775,776],{"class":44},"echo \"$NODE_ENV\"\n",[34,778,779,781,783,785],{"class":36,"data-line":459,"line":459},[34,780,392],{"class":391},[34,782,392],{"class":391},[34,784,395],{"class":81},[34,786,787],{"class":44},"mkdir -p $APP_PATH\n",[20,789,790],{},[105,791,668],{},[24,793,795],{"className":372,"code":794,"language":374,"meta":29,"style":29},"cache:\n  paths:\n    - node_modules\u002F\n",[31,796,797,803,812],{"__ignoreMap":29},[34,798,799,801],{"class":36,"data-line":37,"line":37},[34,800,665],{"class":381},[34,802,385],{"class":81},[34,804,805,807,810],{"class":36,"data-line":388,"line":388},[34,806,392],{"class":391},[34,808,809],{"class":381},"paths",[34,811,385],{"class":81},[34,813,814,816,818,820],{"class":36,"data-line":401,"line":401},[34,815,392],{"class":391},[34,817,392],{"class":391},[34,819,395],{"class":81},[34,821,822],{"class":44},"node_modules\u002F\n",[20,824,825],{},[105,826,827],{},"保存构建产物",[24,829,831],{"className":372,"code":830,"language":374,"meta":29,"style":29},"artifacts:\n  paths:\n    - dist\u002F\n  expire_in: 1 week\n",[31,832,833,839,847,858],{"__ignoreMap":29},[34,834,835,837],{"class":36,"data-line":37,"line":37},[34,836,657],{"class":381},[34,838,385],{"class":81},[34,840,841,843,845],{"class":36,"data-line":388,"line":388},[34,842,392],{"class":391},[34,844,809],{"class":381},[34,846,385],{"class":81},[34,848,849,851,853,855],{"class":36,"data-line":401,"line":401},[34,850,392],{"class":391},[34,852,392],{"class":391},[34,854,395],{"class":81},[34,856,857],{"class":44},"dist\u002F\n",[34,859,860,862,865,867],{"class":36,"data-line":411,"line":411},[34,861,392],{"class":391},[34,863,864],{"class":381},"expire_in",[34,866,444],{"class":81},[34,868,869],{"class":44},"1 week\n",[20,871,872],{},[105,873,874],{},"分支执行",[24,876,878],{"className":372,"code":877,"language":374,"meta":29,"style":29},"only:\n  - dev\n",[31,879,880,887],{"__ignoreMap":29},[34,881,882,885],{"class":36,"data-line":37,"line":37},[34,883,884],{"class":381},"only",[34,886,385],{"class":81},[34,888,889,891,893],{"class":36,"data-line":388,"line":388},[34,890,392],{"class":391},[34,892,395],{"class":81},[34,894,895],{"class":44},"dev\n",[20,897,898,899,901],{},"或使用 ",[31,900,641],{"code":641},"：",[24,903,905],{"className":372,"code":904,"language":374,"meta":29,"style":29},"rules:\n  - if: '$CI_COMMIT_BRANCH == \"main\"'\n    when: always\n  - when: never\n",[31,906,907,913,927,941],{"__ignoreMap":29},[34,908,909,911],{"class":36,"data-line":37,"line":37},[34,910,641],{"class":381},[34,912,385],{"class":81},[34,914,915,917,919,922,924],{"class":36,"data-line":388,"line":388},[34,916,392],{"class":391},[34,918,395],{"class":81},[34,920,921],{"class":381},"if",[34,923,444],{"class":81},[34,925,926],{"class":44},"'$CI_COMMIT_BRANCH == \"main\"'\n",[34,928,929,931,933,936,938],{"class":36,"data-line":401,"line":401},[34,930,392],{"class":391},[34,932,392],{"class":391},[34,934,935],{"class":381},"when",[34,937,444],{"class":81},[34,939,940],{"class":44},"always\n",[34,942,943,945,947,949,951],{"class":36,"data-line":411,"line":411},[34,944,392],{"class":391},[34,946,395],{"class":81},[34,948,935],{"class":381},[34,950,444],{"class":81},[34,952,953],{"class":44},"never\n",[20,955,956],{},[105,957,684],{},[24,959,961],{"className":372,"code":960,"language":374,"meta":29,"style":29},"image: node:20\n",[31,962,963],{"__ignoreMap":29},[34,964,965,967,969],{"class":36,"data-line":37,"line":37},[34,966,681],{"class":381},[34,968,444],{"class":81},[34,970,971],{"class":44},"node:20\n",[20,973,974],{},[105,975,976],{},"任务依赖",[24,978,980],{"className":372,"code":979,"language":374,"meta":29,"style":29},"build:\n  stage: build\n  artifacts:\n    paths: [dist\u002F]\n\ndeploy:\n  stage: deploy\n  needs: [\"build\"]\n  script: scp -r dist\u002F* server:\u002Fvar\u002Fwww\n",[31,981,982,988,998,1006,1026,1030,1037,1047,1062],{"__ignoreMap":29},[34,983,984,986],{"class":36,"data-line":37,"line":37},[34,985,745],{"class":381},[34,987,385],{"class":81},[34,989,990,992,994,996],{"class":36,"data-line":388,"line":388},[34,991,392],{"class":391},[34,993,441],{"class":381},[34,995,444],{"class":81},[34,997,398],{"class":44},[34,999,1000,1002,1004],{"class":36,"data-line":401,"line":401},[34,1001,392],{"class":391},[34,1003,657],{"class":381},[34,1005,385],{"class":81},[34,1007,1008,1010,1012,1014,1016,1020,1023],{"class":36,"data-line":411,"line":411},[34,1009,392],{"class":391},[34,1011,392],{"class":391},[34,1013,809],{"class":381},[34,1015,444],{"class":81},[34,1017,1019],{"class":1018},"sSDpw","[",[34,1021,1022],{"class":44},"dist\u002F",[34,1024,1025],{"class":1018},"]\n",[34,1027,1028],{"class":36,"data-line":421,"line":421},[34,1029,425],{"emptyLinePlaceholder":424},[34,1031,1032,1035],{"class":36,"data-line":428,"line":428},[34,1033,1034],{"class":381},"deploy",[34,1036,385],{"class":81},[34,1038,1039,1041,1043,1045],{"class":36,"data-line":436,"line":436},[34,1040,392],{"class":391},[34,1042,441],{"class":381},[34,1044,444],{"class":81},[34,1046,418],{"class":44},[34,1048,1049,1051,1053,1055,1057,1060],{"class":36,"data-line":449,"line":449},[34,1050,392],{"class":391},[34,1052,649],{"class":381},[34,1054,444],{"class":81},[34,1056,1019],{"class":1018},[34,1058,1059],{"class":44},"\"build\"",[34,1061,1025],{"class":1018},[34,1063,1064,1066,1068,1070],{"class":36,"data-line":459,"line":459},[34,1065,392],{"class":391},[34,1067,454],{"class":381},[34,1069,444],{"class":81},[34,1071,1072],{"class":44},"scp -r dist\u002F* server:\u002Fvar\u002Fwww\n",[20,1074,1075],{},[105,1076,1077],{},"并行任务",[24,1079,1081],{"className":372,"code":1080,"language":374,"meta":29,"style":29},"parallel: 3\n",[31,1082,1083],{"__ignoreMap":29},[34,1084,1085,1088,1090],{"class":36,"data-line":37,"line":37},[34,1086,1087],{"class":381},"parallel",[34,1089,444],{"class":81},[34,1091,1092],{"class":48},"3\n",[20,1094,1095],{},[105,1096,1097],{},"多环境部署",[24,1099,1101],{"className":372,"code":1100,"language":374,"meta":29,"style":29},"deploy_staging:\n  only:\n    - develop\n\ndeploy_prod:\n  only:\n    - main\n",[31,1102,1103,1110,1118,1129,1133,1140,1148],{"__ignoreMap":29},[34,1104,1105,1108],{"class":36,"data-line":37,"line":37},[34,1106,1107],{"class":381},"deploy_staging",[34,1109,385],{"class":81},[34,1111,1112,1114,1116],{"class":36,"data-line":388,"line":388},[34,1113,392],{"class":391},[34,1115,884],{"class":381},[34,1117,385],{"class":81},[34,1119,1120,1122,1124,1126],{"class":36,"data-line":401,"line":401},[34,1121,392],{"class":391},[34,1123,392],{"class":391},[34,1125,395],{"class":81},[34,1127,1128],{"class":44},"develop\n",[34,1130,1131],{"class":36,"data-line":411,"line":411},[34,1132,425],{"emptyLinePlaceholder":424},[34,1134,1135,1138],{"class":36,"data-line":421,"line":421},[34,1136,1137],{"class":381},"deploy_prod",[34,1139,385],{"class":81},[34,1141,1142,1144,1146],{"class":36,"data-line":428,"line":428},[34,1143,392],{"class":391},[34,1145,884],{"class":381},[34,1147,385],{"class":81},[34,1149,1150,1152,1154,1156],{"class":36,"data-line":436,"line":436},[34,1151,392],{"class":391},[34,1153,392],{"class":391},[34,1155,395],{"class":81},[34,1157,1158],{"class":44},"main\n",[15,1160,1162],{"id":1161},"_34-yaml-注意事项","3.4 YAML 注意事项",[1164,1165,1166,1169,1172,1175,1182],"ol",{},[102,1167,1168],{},"使用空格缩进（不能用 Tab）",[102,1170,1171],{},"冒号后需有空格",[102,1173,1174],{},"特殊字符用引号包裹",[102,1176,1177,1178,1181],{},"数组用 ",[31,1179,1180],{"code":1180},"-"," 表示",[102,1183,1184,1185],{},"变量引用用 ",[31,1186,1187],{"code":1187},"$VAR_NAME",[10,1189,1191],{"id":1190},"四gitlab-rules-高级控制","四、GitLab Rules 高级控制",[15,1193,1195],{"id":1194},"_41-基本语法","4.1 基本语法",[24,1197,1198],{"className":372,"code":904,"language":374,"meta":29,"style":29},[31,1199,1200,1206,1218,1230],{"__ignoreMap":29},[34,1201,1202,1204],{"class":36,"data-line":37,"line":37},[34,1203,641],{"class":381},[34,1205,385],{"class":81},[34,1207,1208,1210,1212,1214,1216],{"class":36,"data-line":388,"line":388},[34,1209,392],{"class":391},[34,1211,395],{"class":81},[34,1213,921],{"class":381},[34,1215,444],{"class":81},[34,1217,926],{"class":44},[34,1219,1220,1222,1224,1226,1228],{"class":36,"data-line":401,"line":401},[34,1221,392],{"class":391},[34,1223,392],{"class":391},[34,1225,935],{"class":381},[34,1227,444],{"class":81},[34,1229,940],{"class":44},[34,1231,1232,1234,1236,1238,1240],{"class":36,"data-line":411,"line":411},[34,1233,392],{"class":391},[34,1235,395],{"class":81},[34,1237,935],{"class":381},[34,1239,444],{"class":81},[34,1241,953],{"class":44},[20,1243,1244],{},"从上到下匹配，命中第一条后停止。",[15,1246,1248],{"id":1247},"_42-字段说明","4.2 字段说明",[137,1250,1251,1259],{},[140,1252,1253],{},[143,1254,1255,1257],{},[146,1256,595],{},[146,1258,309],{},[153,1260,1261,1268,1275,1283,1291,1299],{},[143,1262,1263,1265],{},[158,1264,921],{},[158,1266,1267],{},"条件表达式",[143,1269,1270,1272],{},[158,1271,935],{},[158,1273,1274],{},"执行时机",[143,1276,1277,1280],{},[158,1278,1279],{},"allow_failure",[158,1281,1282],{},"是否允许失败",[143,1284,1285,1288],{},[158,1286,1287],{},"changes",[158,1289,1290],{},"文件变更触发",[143,1292,1293,1296],{},[158,1294,1295],{},"exists",[158,1297,1298],{},"文件存在触发",[143,1300,1301,1304],{},[158,1302,1303],{},"start_in",[158,1305,1306],{},"延迟执行时间",[15,1308,1310],{"id":1309},"_43-when-可选值","4.3 when 可选值",[137,1312,1313,1322],{},[140,1314,1315],{},[143,1316,1317,1320],{},[146,1318,1319],{},"值",[146,1321,309],{},[153,1323,1324,1332,1340,1348,1356],{},[143,1325,1326,1329],{},[158,1327,1328],{},"on_success",[158,1330,1331],{},"默认值",[143,1333,1334,1337],{},[158,1335,1336],{},"manual",[158,1338,1339],{},"手动触发",[143,1341,1342,1345],{},[158,1343,1344],{},"always",[158,1346,1347],{},"无论成功失败都执行",[143,1349,1350,1353],{},[158,1351,1352],{},"never",[158,1354,1355],{},"永不执行",[143,1357,1358,1361],{},[158,1359,1360],{},"delayed",[158,1362,1363],{},"延迟执行",[15,1365,1367],{"id":1366},"_44-常见用法示例","4.4 常见用法示例",[20,1369,1370],{},[105,1371,1372],{},"按分支执行",[24,1374,1376],{"className":372,"code":1375,"language":374,"meta":29,"style":29},"rules:\n  - if: '$CI_COMMIT_BRANCH == \"dev\"'\n    when: on_success\n  - if: '$CI_COMMIT_BRANCH == \"main\"'\n    when: manual\n  - when: never\n",[31,1377,1378,1384,1397,1410,1422,1435],{"__ignoreMap":29},[34,1379,1380,1382],{"class":36,"data-line":37,"line":37},[34,1381,641],{"class":381},[34,1383,385],{"class":81},[34,1385,1386,1388,1390,1392,1394],{"class":36,"data-line":388,"line":388},[34,1387,392],{"class":391},[34,1389,395],{"class":81},[34,1391,921],{"class":381},[34,1393,444],{"class":81},[34,1395,1396],{"class":44},"'$CI_COMMIT_BRANCH == \"dev\"'\n",[34,1398,1399,1401,1403,1405,1407],{"class":36,"data-line":401,"line":401},[34,1400,392],{"class":391},[34,1402,392],{"class":391},[34,1404,935],{"class":381},[34,1406,444],{"class":81},[34,1408,1409],{"class":44},"on_success\n",[34,1411,1412,1414,1416,1418,1420],{"class":36,"data-line":411,"line":411},[34,1413,392],{"class":391},[34,1415,395],{"class":81},[34,1417,921],{"class":381},[34,1419,444],{"class":81},[34,1421,926],{"class":44},[34,1423,1424,1426,1428,1430,1432],{"class":36,"data-line":421,"line":421},[34,1425,392],{"class":391},[34,1427,392],{"class":391},[34,1429,935],{"class":381},[34,1431,444],{"class":81},[34,1433,1434],{"class":44},"manual\n",[34,1436,1437,1439,1441,1443,1445],{"class":36,"data-line":428,"line":428},[34,1438,392],{"class":391},[34,1440,395],{"class":81},[34,1442,935],{"class":381},[34,1444,444],{"class":81},[34,1446,953],{"class":44},[20,1448,1449],{},[105,1450,1451],{},"标签触发",[24,1453,1455],{"className":372,"code":1454,"language":374,"meta":29,"style":29},"rules:\n  - if: '$CI_COMMIT_TAG'\n",[31,1456,1457,1463],{"__ignoreMap":29},[34,1458,1459,1461],{"class":36,"data-line":37,"line":37},[34,1460,641],{"class":381},[34,1462,385],{"class":81},[34,1464,1465,1467,1469,1471,1473],{"class":36,"data-line":388,"line":388},[34,1466,392],{"class":391},[34,1468,395],{"class":81},[34,1470,921],{"class":381},[34,1472,444],{"class":81},[34,1474,1475],{"class":44},"'$CI_COMMIT_TAG'\n",[20,1477,1478],{},[105,1479,1480],{},"检测文件变更",[24,1482,1484],{"className":372,"code":1483,"language":374,"meta":29,"style":29},"rules:\n  - changes:\n      - src\u002F**\u002F*.js\n",[31,1485,1486,1492,1502],{"__ignoreMap":29},[34,1487,1488,1490],{"class":36,"data-line":37,"line":37},[34,1489,641],{"class":381},[34,1491,385],{"class":81},[34,1493,1494,1496,1498,1500],{"class":36,"data-line":388,"line":388},[34,1495,392],{"class":391},[34,1497,395],{"class":81},[34,1499,1287],{"class":381},[34,1501,385],{"class":81},[34,1503,1504,1506,1508,1510,1512],{"class":36,"data-line":401,"line":401},[34,1505,392],{"class":391},[34,1507,392],{"class":391},[34,1509,392],{"class":391},[34,1511,395],{"class":81},[34,1513,1514],{"class":44},"src\u002F**\u002F*.js\n",[20,1516,1517],{},[105,1518,1519],{},"检测文件存在",[24,1521,1523],{"className":372,"code":1522,"language":374,"meta":29,"style":29},"rules:\n  - exists:\n      - docs\u002F\n",[31,1524,1525,1531,1541],{"__ignoreMap":29},[34,1526,1527,1529],{"class":36,"data-line":37,"line":37},[34,1528,641],{"class":381},[34,1530,385],{"class":81},[34,1532,1533,1535,1537,1539],{"class":36,"data-line":388,"line":388},[34,1534,392],{"class":391},[34,1536,395],{"class":81},[34,1538,1295],{"class":381},[34,1540,385],{"class":81},[34,1542,1543,1545,1547,1549,1551],{"class":36,"data-line":401,"line":401},[34,1544,392],{"class":391},[34,1546,392],{"class":391},[34,1548,392],{"class":391},[34,1550,395],{"class":81},[34,1552,1553],{"class":44},"docs\u002F\n",[20,1555,1556],{},[105,1557,1363],{},[24,1559,1561],{"className":372,"code":1560,"language":374,"meta":29,"style":29},"rules:\n  - when: delayed\n    start_in: 5 minutes\n",[31,1562,1563,1569,1582],{"__ignoreMap":29},[34,1564,1565,1567],{"class":36,"data-line":37,"line":37},[34,1566,641],{"class":381},[34,1568,385],{"class":81},[34,1570,1571,1573,1575,1577,1579],{"class":36,"data-line":388,"line":388},[34,1572,392],{"class":391},[34,1574,395],{"class":81},[34,1576,935],{"class":381},[34,1578,444],{"class":81},[34,1580,1581],{"class":44},"delayed\n",[34,1583,1584,1586,1588,1590,1592],{"class":36,"data-line":401,"line":401},[34,1585,392],{"class":391},[34,1587,392],{"class":391},[34,1589,1303],{"class":381},[34,1591,444],{"class":81},[34,1593,1594],{"class":44},"5 minutes\n",[20,1596,1597],{},[105,1598,1599],{},"环境变量判断",[24,1601,1603],{"className":372,"code":1602,"language":374,"meta":29,"style":29},"rules:\n  - if: '$NODE_ENV == \"production\"'\n",[31,1604,1605,1611],{"__ignoreMap":29},[34,1606,1607,1609],{"class":36,"data-line":37,"line":37},[34,1608,641],{"class":381},[34,1610,385],{"class":81},[34,1612,1613,1615,1617,1619,1621],{"class":36,"data-line":388,"line":388},[34,1614,392],{"class":391},[34,1616,395],{"class":81},[34,1618,921],{"class":381},[34,1620,444],{"class":81},[34,1622,1623],{"class":44},"'$NODE_ENV == \"production\"'\n",[20,1625,1626],{},[105,1627,1628],{},"组合条件",[24,1630,1632],{"className":372,"code":1631,"language":374,"meta":29,"style":29},"rules:\n  - if: '$CI_COMMIT_BRANCH == \"dev\" || $CI_COMMIT_BRANCH == \"main\"'\n",[31,1633,1634,1640],{"__ignoreMap":29},[34,1635,1636,1638],{"class":36,"data-line":37,"line":37},[34,1637,641],{"class":381},[34,1639,385],{"class":81},[34,1641,1642,1644,1646,1648,1650],{"class":36,"data-line":388,"line":388},[34,1643,392],{"class":391},[34,1645,395],{"class":81},[34,1647,921],{"class":381},[34,1649,444],{"class":81},[34,1651,1652],{"class":44},"'$CI_COMMIT_BRANCH == \"dev\" || $CI_COMMIT_BRANCH == \"main\"'\n",[20,1654,1655],{},[105,1656,1657],{},"未匹配时不执行",[24,1659,1661],{"className":372,"code":1660,"language":374,"meta":29,"style":29},"rules:\n  - if: '$CI_COMMIT_BRANCH == \"main\"'\n  - when: never\n",[31,1662,1663,1669,1681],{"__ignoreMap":29},[34,1664,1665,1667],{"class":36,"data-line":37,"line":37},[34,1666,641],{"class":381},[34,1668,385],{"class":81},[34,1670,1671,1673,1675,1677,1679],{"class":36,"data-line":388,"line":388},[34,1672,392],{"class":391},[34,1674,395],{"class":81},[34,1676,921],{"class":381},[34,1678,444],{"class":81},[34,1680,926],{"class":44},[34,1682,1683,1685,1687,1689,1691],{"class":36,"data-line":401,"line":401},[34,1684,392],{"class":391},[34,1686,395],{"class":81},[34,1688,935],{"class":381},[34,1690,444],{"class":81},[34,1692,953],{"class":44},[10,1694,1696],{"id":1695},"五include-多文件管理","五、include 多文件管理",[15,1698,1700],{"id":1699},"_51-引入本地文件","5.1 引入本地文件",[24,1702,1704],{"className":372,"code":1703,"language":374,"meta":29,"style":29},"include:\n  - local: 'ci\u002Fbuild.yml'\n  - local: 'ci\u002Fdeploy.yml'\n",[31,1705,1706,1713,1727],{"__ignoreMap":29},[34,1707,1708,1711],{"class":36,"data-line":37,"line":37},[34,1709,1710],{"class":381},"include",[34,1712,385],{"class":81},[34,1714,1715,1717,1719,1722,1724],{"class":36,"data-line":388,"line":388},[34,1716,392],{"class":391},[34,1718,395],{"class":81},[34,1720,1721],{"class":381},"local",[34,1723,444],{"class":81},[34,1725,1726],{"class":44},"'ci\u002Fbuild.yml'\n",[34,1728,1729,1731,1733,1735,1737],{"class":36,"data-line":401,"line":401},[34,1730,392],{"class":391},[34,1732,395],{"class":81},[34,1734,1721],{"class":381},[34,1736,444],{"class":81},[34,1738,1739],{"class":44},"'ci\u002Fdeploy.yml'\n",[15,1741,1743],{"id":1742},"_52-引入其他项目文件","5.2 引入其他项目文件",[24,1745,1747],{"className":372,"code":1746,"language":374,"meta":29,"style":29},"include:\n  - project: 'group\u002Fci-templates'\n    ref: main\n    file: '\u002Ftemplates\u002Fdocker-build.yml'\n",[31,1748,1749,1755,1769,1782],{"__ignoreMap":29},[34,1750,1751,1753],{"class":36,"data-line":37,"line":37},[34,1752,1710],{"class":381},[34,1754,385],{"class":81},[34,1756,1757,1759,1761,1764,1766],{"class":36,"data-line":388,"line":388},[34,1758,392],{"class":391},[34,1760,395],{"class":81},[34,1762,1763],{"class":381},"project",[34,1765,444],{"class":81},[34,1767,1768],{"class":44},"'group\u002Fci-templates'\n",[34,1770,1771,1773,1775,1778,1780],{"class":36,"data-line":401,"line":401},[34,1772,392],{"class":391},[34,1774,392],{"class":391},[34,1776,1777],{"class":381},"ref",[34,1779,444],{"class":81},[34,1781,1158],{"class":44},[34,1783,1784,1786,1788,1791,1793],{"class":36,"data-line":411,"line":411},[34,1785,392],{"class":391},[34,1787,392],{"class":391},[34,1789,1790],{"class":381},"file",[34,1792,444],{"class":81},[34,1794,1795],{"class":44},"'\u002Ftemplates\u002Fdocker-build.yml'\n",[15,1797,1799],{"id":1798},"_53-引入远程-url","5.3 引入远程 URL",[24,1801,1803],{"className":372,"code":1802,"language":374,"meta":29,"style":29},"include:\n  - remote: 'https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fgitlab-foss\u002Fraw\u002Fmaster\u002F.gitlab-ci.yml'\n",[31,1804,1805,1811],{"__ignoreMap":29},[34,1806,1807,1809],{"class":36,"data-line":37,"line":37},[34,1808,1710],{"class":381},[34,1810,385],{"class":81},[34,1812,1813,1815,1817,1820,1822],{"class":36,"data-line":388,"line":388},[34,1814,392],{"class":391},[34,1816,395],{"class":81},[34,1818,1819],{"class":381},"remote",[34,1821,444],{"class":81},[34,1823,1824],{"class":44},"'https:\u002F\u002Fgitlab.com\u002Fgitlab-org\u002Fgitlab-foss\u002Fraw\u002Fmaster\u002F.gitlab-ci.yml'\n",[15,1826,1828],{"id":1827},"_54-使用官方模板","5.4 使用官方模板",[24,1830,1832],{"className":372,"code":1831,"language":374,"meta":29,"style":29},"include:\n  - template: 'Go.gitlab-ci.yml'\n",[31,1833,1834,1840],{"__ignoreMap":29},[34,1835,1836,1838],{"class":36,"data-line":37,"line":37},[34,1837,1710],{"class":381},[34,1839,385],{"class":81},[34,1841,1842,1844,1846,1849,1851],{"class":36,"data-line":388,"line":388},[34,1843,392],{"class":391},[34,1845,395],{"class":81},[34,1847,1848],{"class":381},"template",[34,1850,444],{"class":81},[34,1852,1853],{"class":44},"'Go.gitlab-ci.yml'\n",[15,1855,1857],{"id":1856},"_55-混合引入","5.5 混合引入",[24,1859,1861],{"className":372,"code":1860,"language":374,"meta":29,"style":29},"include:\n  - local: 'ci\u002Fbuild.yml'\n  - project: 'team\u002Fshared-ci'\n    ref: main\n    file: '\u002Fdeploy\u002Fdocker.yml'\n  - template: 'Go.gitlab-ci.yml'\n",[31,1862,1863,1869,1881,1894,1906,1919],{"__ignoreMap":29},[34,1864,1865,1867],{"class":36,"data-line":37,"line":37},[34,1866,1710],{"class":381},[34,1868,385],{"class":81},[34,1870,1871,1873,1875,1877,1879],{"class":36,"data-line":388,"line":388},[34,1872,392],{"class":391},[34,1874,395],{"class":81},[34,1876,1721],{"class":381},[34,1878,444],{"class":81},[34,1880,1726],{"class":44},[34,1882,1883,1885,1887,1889,1891],{"class":36,"data-line":401,"line":401},[34,1884,392],{"class":391},[34,1886,395],{"class":81},[34,1888,1763],{"class":381},[34,1890,444],{"class":81},[34,1892,1893],{"class":44},"'team\u002Fshared-ci'\n",[34,1895,1896,1898,1900,1902,1904],{"class":36,"data-line":411,"line":411},[34,1897,392],{"class":391},[34,1899,392],{"class":391},[34,1901,1777],{"class":381},[34,1903,444],{"class":81},[34,1905,1158],{"class":44},[34,1907,1908,1910,1912,1914,1916],{"class":36,"data-line":421,"line":421},[34,1909,392],{"class":391},[34,1911,392],{"class":391},[34,1913,1790],{"class":381},[34,1915,444],{"class":81},[34,1917,1918],{"class":44},"'\u002Fdeploy\u002Fdocker.yml'\n",[34,1920,1921,1923,1925,1927,1929],{"class":36,"data-line":428,"line":428},[34,1922,392],{"class":391},[34,1924,395],{"class":81},[34,1926,1848],{"class":381},[34,1928,444],{"class":81},[34,1930,1853],{"class":44},[15,1932,1934],{"id":1933},"_56-条件引入","5.6 条件引入",[24,1936,1938],{"className":372,"code":1937,"language":374,"meta":29,"style":29},"include:\n  - local: 'ci\u002Fprod.yml'\n    rules:\n      - if: '$CI_COMMIT_TAG =~ \u002F^pro-\u002F'\n",[31,1939,1940,1946,1959,1969],{"__ignoreMap":29},[34,1941,1942,1944],{"class":36,"data-line":37,"line":37},[34,1943,1710],{"class":381},[34,1945,385],{"class":81},[34,1947,1948,1950,1952,1954,1956],{"class":36,"data-line":388,"line":388},[34,1949,392],{"class":391},[34,1951,395],{"class":81},[34,1953,1721],{"class":381},[34,1955,444],{"class":81},[34,1957,1958],{"class":44},"'ci\u002Fprod.yml'\n",[34,1960,1961,1963,1965,1967],{"class":36,"data-line":401,"line":401},[34,1962,392],{"class":391},[34,1964,392],{"class":391},[34,1966,641],{"class":381},[34,1968,385],{"class":81},[34,1970,1971,1973,1975,1977,1979,1981,1983],{"class":36,"data-line":411,"line":411},[34,1972,392],{"class":391},[34,1974,392],{"class":391},[34,1976,392],{"class":391},[34,1978,395],{"class":81},[34,1980,921],{"class":381},[34,1982,444],{"class":81},[34,1984,1985],{"class":44},"'$CI_COMMIT_TAG =~ \u002F^pro-\u002F'\n",[15,1987,1989],{"id":1988},"_57-注意事项","5.7 注意事项",[1164,1991,1992,1995,1998],{},[102,1993,1994],{},"所有 include 文件必须合法",[102,1996,1997],{},"stages 会合并，同名 job 会覆盖",[102,1999,2000],{},"文件路径错误会导致 CI 解析失败",[10,2002,2004],{"id":2003},"六gitlab-runner使用镜像缓存","六、Gitlab Runner使用镜像缓存",[20,2006,2007],{},"主要是为了执行job的时候防止重复拉取镜像",[20,2009,2010,2011],{},"配置",[31,2012,2013],{"code":2013},"config\u002Fconfig.toml",[24,2015,2019],{"className":2016,"code":2017,"language":2018,"meta":29,"style":29},"language-toml shiki shiki-themes github-light github-dark","concurrent = 1\ncheck_interval = 0\nshutdown_timeout = 0\n[session_server]\n  session_timeout = 1800\n[[runners]]\n  name = \"test-ci\"\n  url = \"http:\u002F\u002Fgit.disoms.net\"\n  id = 2\n  token = \"your-gitlab-token\"\n  token_obtained_at = 2025-11-06T10:38:31Z\n  token_expires_at = 0001-01-01T00:00:00Z\n  executor = \"docker\"\n  [runners.cache]\n    MaxUploadedArchiveSize = 0\n    [runners.cache.s3]\n    [runners.cache.gcs]\n    [runners.cache.azure]\n  [runners.docker]\n    tls_verify = false\n    image = \"golang:1.23.4\" # 默认镜像\n    privileged = false\n    disable_entrypoint_overwrite = false\n    oom_kill_disable = false\n    disable_cache = false\n    volumes = [\"\u002Fcache\"] # 缓存\n    pull_policy = [\"if-not-present\"] # 策略\n    shm_size = 0\n    network_mtu = 0\n","toml",[31,2020,2021,2029,2037,2044,2053,2063,2078,2088,2098,2108,2118,2128,2138,2148,2165,2175,2196,2217,2238,2254,2264,2278,2288,2298,2308,2318,2339,2359,2369],{"__ignoreMap":29},[34,2022,2023,2026],{"class":36,"data-line":37,"line":37},[34,2024,2025],{"class":81},"concurrent = ",[34,2027,2028],{"class":48},"1\n",[34,2030,2031,2034],{"class":36,"data-line":388,"line":388},[34,2032,2033],{"class":81},"check_interval = ",[34,2035,2036],{"class":48},"0\n",[34,2038,2039,2042],{"class":36,"data-line":401,"line":401},[34,2040,2041],{"class":81},"shutdown_timeout = ",[34,2043,2036],{"class":48},[34,2045,2046,2048,2051],{"class":36,"data-line":411,"line":411},[34,2047,1019],{"class":1018},[34,2049,2050],{"class":40},"session_server",[34,2052,1025],{"class":1018},[34,2054,2055,2057,2060],{"class":36,"data-line":421,"line":421},[34,2056,392],{"class":391},[34,2058,2059],{"class":81},"session_timeout = ",[34,2061,2062],{"class":48},"1800\n",[34,2064,2065,2067,2070,2073,2076],{"class":36,"data-line":428,"line":428},[34,2066,1019],{"class":1018},[34,2068,1019],{"class":2069},"sJX2D",[34,2071,2072],{"class":40},"runners",[34,2074,2075],{"class":2069},"]",[34,2077,1025],{"class":1018},[34,2079,2080,2082,2085],{"class":36,"data-line":436,"line":436},[34,2081,392],{"class":391},[34,2083,2084],{"class":81},"name = ",[34,2086,2087],{"class":44},"\"test-ci\"\n",[34,2089,2090,2092,2095],{"class":36,"data-line":449,"line":449},[34,2091,392],{"class":391},[34,2093,2094],{"class":81},"url = ",[34,2096,2097],{"class":44},"\"http:\u002F\u002Fgit.disoms.net\"\n",[34,2099,2100,2102,2105],{"class":36,"data-line":459,"line":459},[34,2101,392],{"class":391},[34,2103,2104],{"class":81},"id = ",[34,2106,2107],{"class":48},"2\n",[34,2109,2110,2112,2115],{"class":36,"data-line":471,"line":471},[34,2111,392],{"class":391},[34,2113,2114],{"class":81},"token = ",[34,2116,2117],{"class":44},"\"your-gitlab-token\"\n",[34,2119,2120,2122,2125],{"class":36,"data-line":483,"line":483},[34,2121,392],{"class":391},[34,2123,2124],{"class":81},"token_obtained_at = ",[34,2126,2127],{"class":48},"2025-11-06T10:38:31Z\n",[34,2129,2130,2132,2135],{"class":36,"data-line":495,"line":495},[34,2131,392],{"class":391},[34,2133,2134],{"class":81},"token_expires_at = ",[34,2136,2137],{"class":48},"0001-01-01T00:00:00Z\n",[34,2139,2140,2142,2145],{"class":36,"data-line":500,"line":500},[34,2141,392],{"class":391},[34,2143,2144],{"class":81},"executor = ",[34,2146,2147],{"class":44},"\"docker\"\n",[34,2149,2150,2152,2154,2156,2158,2161,2163],{"class":36,"data-line":508,"line":508},[34,2151,392],{"class":391},[34,2153,29],{"class":81},[34,2155,1019],{"class":1018},[34,2157,2072],{"class":40},[34,2159,2160],{"class":81},".",[34,2162,665],{"class":40},[34,2164,1025],{"class":1018},[34,2166,2167,2170,2173],{"class":36,"data-line":519,"line":519},[34,2168,2169],{"class":391},"    ",[34,2171,2172],{"class":81},"MaxUploadedArchiveSize = ",[34,2174,2036],{"class":48},[34,2176,2177,2179,2181,2183,2185,2187,2189,2191,2194],{"class":36,"data-line":528,"line":528},[34,2178,2169],{"class":391},[34,2180,29],{"class":81},[34,2182,1019],{"class":1018},[34,2184,2072],{"class":40},[34,2186,2160],{"class":81},[34,2188,665],{"class":40},[34,2190,2160],{"class":81},[34,2192,2193],{"class":40},"s3",[34,2195,1025],{"class":1018},[34,2197,2198,2200,2202,2204,2206,2208,2210,2212,2215],{"class":36,"data-line":540,"line":540},[34,2199,2169],{"class":391},[34,2201,29],{"class":81},[34,2203,1019],{"class":1018},[34,2205,2072],{"class":40},[34,2207,2160],{"class":81},[34,2209,665],{"class":40},[34,2211,2160],{"class":81},[34,2213,2214],{"class":40},"gcs",[34,2216,1025],{"class":1018},[34,2218,2219,2221,2223,2225,2227,2229,2231,2233,2236],{"class":36,"data-line":545,"line":545},[34,2220,2169],{"class":391},[34,2222,29],{"class":81},[34,2224,1019],{"class":1018},[34,2226,2072],{"class":40},[34,2228,2160],{"class":81},[34,2230,665],{"class":40},[34,2232,2160],{"class":81},[34,2234,2235],{"class":40},"azure",[34,2237,1025],{"class":1018},[34,2239,2240,2242,2244,2246,2248,2250,2252],{"class":36,"data-line":553,"line":553},[34,2241,392],{"class":391},[34,2243,29],{"class":81},[34,2245,1019],{"class":1018},[34,2247,2072],{"class":40},[34,2249,2160],{"class":81},[34,2251,41],{"class":40},[34,2253,1025],{"class":1018},[34,2255,2256,2258,2261],{"class":36,"data-line":564,"line":564},[34,2257,2169],{"class":391},[34,2259,2260],{"class":81},"tls_verify = ",[34,2262,2263],{"class":48},"false\n",[34,2265,2266,2268,2271,2274],{"class":36,"data-line":573,"line":573},[34,2267,2169],{"class":391},[34,2269,2270],{"class":81},"image = ",[34,2272,2273],{"class":44},"\"golang:1.23.4\"",[34,2275,2277],{"class":2276},"sJ8bj"," # 默认镜像\n",[34,2279,2281,2283,2286],{"class":36,"data-line":2280,"line":2280},22,[34,2282,2169],{"class":391},[34,2284,2285],{"class":81},"privileged = ",[34,2287,2263],{"class":48},[34,2289,2291,2293,2296],{"class":36,"data-line":2290,"line":2290},23,[34,2292,2169],{"class":391},[34,2294,2295],{"class":81},"disable_entrypoint_overwrite = ",[34,2297,2263],{"class":48},[34,2299,2301,2303,2306],{"class":36,"data-line":2300,"line":2300},24,[34,2302,2169],{"class":391},[34,2304,2305],{"class":81},"oom_kill_disable = ",[34,2307,2263],{"class":48},[34,2309,2311,2313,2316],{"class":36,"data-line":2310,"line":2310},25,[34,2312,2169],{"class":391},[34,2314,2315],{"class":81},"disable_cache = ",[34,2317,2263],{"class":48},[34,2319,2321,2323,2326,2328,2331,2333,2336],{"class":36,"data-line":2320,"line":2320},26,[34,2322,2169],{"class":391},[34,2324,2325],{"class":81},"volumes = ",[34,2327,1019],{"class":1018},[34,2329,2330],{"class":44},"\"\u002Fcache\"",[34,2332,2075],{"class":1018},[34,2334,2335],{"class":81}," ",[34,2337,2338],{"class":2276},"# 缓存\n",[34,2340,2342,2344,2347,2349,2352,2354,2356],{"class":36,"data-line":2341,"line":2341},27,[34,2343,2169],{"class":391},[34,2345,2346],{"class":81},"pull_policy = ",[34,2348,1019],{"class":1018},[34,2350,2351],{"class":44},"\"if-not-present\"",[34,2353,2075],{"class":1018},[34,2355,2335],{"class":81},[34,2357,2358],{"class":2276},"# 策略\n",[34,2360,2362,2364,2367],{"class":36,"data-line":2361,"line":2361},28,[34,2363,2169],{"class":391},[34,2365,2366],{"class":81},"shm_size = ",[34,2368,2036],{"class":48},[34,2370,2372,2374,2377],{"class":36,"data-line":2371,"line":2371},29,[34,2373,2169],{"class":391},[34,2375,2376],{"class":81},"network_mtu = ",[34,2378,2036],{"class":48},[20,2380,2381],{},"重启镜像",[10,2383,2385],{"id":2384},"七常见问题与坑点","七、常见问题与坑点",[1164,2387,2388,2394,2400,2406],{},[102,2389,2390,2393],{},[105,2391,2392],{},"分支读取不到变量","：关闭变量保护（取消 Protect variable）",[102,2395,2396,2399],{},[105,2397,2398],{},"Runner 不执行 Job","：检查标签匹配及 “Run untagged jobs” 设置",[102,2401,2402,2405],{},[105,2403,2404],{},"执行器错误","：custom 改为 docker 并重启容器",[102,2407,2408,2411],{},[105,2409,2410],{},"权限错误","：确认 Token 与注册项目匹配",[2413,2414,2415],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":29,"searchDepth":411,"depth":411,"links":2417},[2418,2424,2428,2435,2441,2450,2451],{"id":12,"depth":388,"text":13,"children":2419},[2420,2421,2422,2423],{"id":17,"depth":401,"text":18},{"id":58,"depth":401,"text":59},{"id":134,"depth":401,"text":135},{"id":244,"depth":401,"text":245},{"id":292,"depth":388,"text":293,"children":2425},[2426,2427],{"id":296,"depth":401,"text":297},{"id":330,"depth":401,"text":331},{"id":360,"depth":388,"text":361,"children":2429},[2430,2432,2433,2434],{"id":364,"depth":401,"text":2431},"3.1 .gitlab-ci.yml 文件结构",{"id":585,"depth":401,"text":586},{"id":695,"depth":401,"text":696},{"id":1161,"depth":401,"text":1162},{"id":1190,"depth":388,"text":1191,"children":2436},[2437,2438,2439,2440],{"id":1194,"depth":401,"text":1195},{"id":1247,"depth":401,"text":1248},{"id":1309,"depth":401,"text":1310},{"id":1366,"depth":401,"text":1367},{"id":1695,"depth":388,"text":1696,"children":2442},[2443,2444,2445,2446,2447,2448,2449],{"id":1699,"depth":401,"text":1700},{"id":1742,"depth":401,"text":1743},{"id":1798,"depth":401,"text":1799},{"id":1827,"depth":401,"text":1828},{"id":1856,"depth":401,"text":1857},{"id":1933,"depth":401,"text":1934},{"id":1988,"depth":401,"text":1989},{"id":2003,"depth":388,"text":2004},{"id":2384,"depth":388,"text":2385},[2453],"工程实践","2025-11-10","Gitlab使用教程以及CI\u002FCD的配置，触发工作流，减少手动部署的成本",false,"md",null,{"slots":2460},{},"\u002F2025\u002F11\u002Fgitlab-ci",{"text":2463,"minutes":2464,"time":2465,"words":2466},"7 min read",6.22,373200,1244,{"title":5,"description":2455},{"loc":2461},"posts\u002F2025\u002F11\u002Fgitlab-ci",[2471],"gitlab","tech","2025-12-02","D3rIpZVR8mKDoi07J_vV1o6fRrRHoC8GJcqz46j-wt4",[2476,2481],{"title":2477,"path":2478,"stem":2479,"date":2480,"type":2472,"children":-1},"Go Zap实现日志双写和切割","\u002F2025\u002F10\u002Fgo-zap","posts\u002F2025\u002F10\u002Fgo-zap","2025-10-30",{"title":2482,"path":2483,"stem":2484,"date":2485,"type":2472,"children":-1},"Webhook 工作原理与 Go 实现","\u002F2025\u002F11\u002Fwhat-is-webhook","posts\u002F2025\u002F11\u002Fwhat-is-webhook","2025-11-18",1786555054798]