[{"data":1,"prerenderedAt":1165},["ShallowReactive",2],{"navigation":3,"post-\u002Fposts\u002F2020\u002Fdevops-gitlab-ci-aliyun-k8s":20,"surroundPosts-\u002Fposts\u002F2020\u002Fdevops-gitlab-ci-aliyun-k8s":1152},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",{"id":21,"title":22,"body":23,"class":1131,"cover":1132,"coverSize":1131,"date":1133,"description":1134,"draft":1135,"extension":1136,"hideComments":1135,"location":1131,"meta":1137,"navigation":112,"path":1138,"readingTime":1139,"seo":1144,"sitemap":1145,"stem":1146,"tags":1147,"time":1131,"weather":1131,"__hash__":1151},"posts\u002Fposts\u002F2020\u002F20201227.devops-gitlab-ci-aliyun-k8s.md","基于 GitLab CI 和阿里云 k8s 的持续交付解决方案",{"type":24,"value":25,"toc":1126},"minimark",[26,35,38,54,57,60,65,70,440,455,458,463,467,574,578,757,761,764,858,861,1102,1106,1109,1113,1116,1119,1122],[27,28,29,30,34],"p",{},"今年对于我个人而言，在 DevOps 上的最大收获，莫过于摸索了这套基于 GitLab CI 和 k8s 的持续交付解决方案，其实原理都很简单，在我去年的方案里又做了改进，实现了基于 ",[31,32,33],"code",{},"git tag"," 的触发方式，并且把原先的本地打包推镜像改为在 GitLab Runner 上打包推镜像。",[27,36,37],{},"这套解决方案大致流程是这样的：",[39,40,41,48,51],"ol",{},[42,43,44,45],"li",{},"推送代码，在代码中配置 ",[31,46,47],{},"gitlab-ci.yml",[42,49,50],{},"推送 tag，触发 GitLab Runner 编译 docker 镜像，并推送至阿里云镜像仓库",[42,52,53],{},"在阿里云 k8s 上基于镜像仓库创建应用，并创建重新部署的触发器，在镜像更新时触发该触发器",[27,55,56],{},"这样，以后每次推送新的 tag 上去，就可以实现自动打包&部署了。",[27,58,59],{},"下面，我来详细讲解下所有步骤。",[61,62,64],"h2",{"id":63},"配置-gitlab-runner","配置 GitLab Runner",[66,67,69],"h5",{"id":68},"configtoml","config.toml",[71,72,77],"pre",{"className":73,"code":74,"language":75,"meta":76,"style":76},"language-toml shiki shiki-themes material-theme-lighter github-light github-dark","concurrent = 1\ncheck_interval = 0\n\n[session_server]\nsession_timeout = 1800\n\n[[runners]]\nname = \"common-runner\"\nurl = \"https:\u002F\u002Fgit.xxx.xxx\"\ntoken = \"TOKEN\"\nexecutor = \"docker\"\n\n[runners.custom_build_dir]\n\n[runners.cache]\n\n[runners.cache.s3]\n\n[runners.cache.gcs]\n\n[runners.docker]\ntls_verify = false\nimage = \"docker:latest\"\nprivileged = false\ndisable_entrypoint_overwrite = false\noom_kill_disable = false\ndisable_cache = false\nvolumes = [\n  \"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock\",\n  \"\u002Fxxx\u002Fgitlab-runner\u002Fcache:\u002Fcache\"\n]\nshm_size = 0\n","toml","",[31,78,79,96,107,114,127,138,143,155,174,189,204,219,224,239,244,258,263,281,286,304,309,322,334,349,359,369,379,389,400,415,425,430],{"__ignoreMap":76},[80,81,84,88,92],"span",{"class":82,"line":83},"line",1,[80,85,87],{"class":86},"su5hD","concurrent ",[80,89,91],{"class":90},"sP7_E","=",[80,93,95],{"class":94},"srdBf"," 1\n",[80,97,99,102,104],{"class":82,"line":98},2,[80,100,101],{"class":86},"check_interval ",[80,103,91],{"class":90},[80,105,106],{"class":94}," 0\n",[80,108,110],{"class":82,"line":109},3,[80,111,113],{"emptyLinePlaceholder":112},true,"\n",[80,115,117,120,124],{"class":82,"line":116},4,[80,118,119],{"class":90},"[",[80,121,123],{"class":122},"sbgvK","session_server",[80,125,126],{"class":90},"]\n",[80,128,130,133,135],{"class":82,"line":129},5,[80,131,132],{"class":86},"session_timeout ",[80,134,91],{"class":90},[80,136,137],{"class":94}," 1800\n",[80,139,141],{"class":82,"line":140},6,[80,142,113],{"emptyLinePlaceholder":112},[80,144,146,149,152],{"class":82,"line":145},7,[80,147,148],{"class":90},"[[",[80,150,151],{"class":122},"runners",[80,153,154],{"class":90},"]]\n",[80,156,158,161,163,167,171],{"class":82,"line":157},8,[80,159,160],{"class":86},"name ",[80,162,91],{"class":90},[80,164,166],{"class":165},"sjJ54"," \"",[80,168,170],{"class":169},"s_sjI","common-runner",[80,172,173],{"class":165},"\"\n",[80,175,177,180,182,184,187],{"class":82,"line":176},9,[80,178,179],{"class":86},"url ",[80,181,91],{"class":90},[80,183,166],{"class":165},[80,185,186],{"class":169},"https:\u002F\u002Fgit.xxx.xxx",[80,188,173],{"class":165},[80,190,192,195,197,199,202],{"class":82,"line":191},10,[80,193,194],{"class":86},"token ",[80,196,91],{"class":90},[80,198,166],{"class":165},[80,200,201],{"class":169},"TOKEN",[80,203,173],{"class":165},[80,205,207,210,212,214,217],{"class":82,"line":206},11,[80,208,209],{"class":86},"executor ",[80,211,91],{"class":90},[80,213,166],{"class":165},[80,215,216],{"class":169},"docker",[80,218,173],{"class":165},[80,220,222],{"class":82,"line":221},12,[80,223,113],{"emptyLinePlaceholder":112},[80,225,227,229,231,234,237],{"class":82,"line":226},13,[80,228,119],{"class":90},[80,230,151],{"class":122},[80,232,233],{"class":86},".",[80,235,236],{"class":122},"custom_build_dir",[80,238,126],{"class":90},[80,240,242],{"class":82,"line":241},14,[80,243,113],{"emptyLinePlaceholder":112},[80,245,247,249,251,253,256],{"class":82,"line":246},15,[80,248,119],{"class":90},[80,250,151],{"class":122},[80,252,233],{"class":86},[80,254,255],{"class":122},"cache",[80,257,126],{"class":90},[80,259,261],{"class":82,"line":260},16,[80,262,113],{"emptyLinePlaceholder":112},[80,264,266,268,270,272,274,276,279],{"class":82,"line":265},17,[80,267,119],{"class":90},[80,269,151],{"class":122},[80,271,233],{"class":86},[80,273,255],{"class":122},[80,275,233],{"class":86},[80,277,278],{"class":122},"s3",[80,280,126],{"class":90},[80,282,284],{"class":82,"line":283},18,[80,285,113],{"emptyLinePlaceholder":112},[80,287,289,291,293,295,297,299,302],{"class":82,"line":288},19,[80,290,119],{"class":90},[80,292,151],{"class":122},[80,294,233],{"class":86},[80,296,255],{"class":122},[80,298,233],{"class":86},[80,300,301],{"class":122},"gcs",[80,303,126],{"class":90},[80,305,307],{"class":82,"line":306},20,[80,308,113],{"emptyLinePlaceholder":112},[80,310,312,314,316,318,320],{"class":82,"line":311},21,[80,313,119],{"class":90},[80,315,151],{"class":122},[80,317,233],{"class":86},[80,319,216],{"class":122},[80,321,126],{"class":90},[80,323,325,328,330],{"class":82,"line":324},22,[80,326,327],{"class":86},"tls_verify ",[80,329,91],{"class":90},[80,331,333],{"class":332},"syTEX"," false\n",[80,335,337,340,342,344,347],{"class":82,"line":336},23,[80,338,339],{"class":86},"image ",[80,341,91],{"class":90},[80,343,166],{"class":165},[80,345,346],{"class":169},"docker:latest",[80,348,173],{"class":165},[80,350,352,355,357],{"class":82,"line":351},24,[80,353,354],{"class":86},"privileged ",[80,356,91],{"class":90},[80,358,333],{"class":332},[80,360,362,365,367],{"class":82,"line":361},25,[80,363,364],{"class":86},"disable_entrypoint_overwrite ",[80,366,91],{"class":90},[80,368,333],{"class":332},[80,370,372,375,377],{"class":82,"line":371},26,[80,373,374],{"class":86},"oom_kill_disable ",[80,376,91],{"class":90},[80,378,333],{"class":332},[80,380,382,385,387],{"class":82,"line":381},27,[80,383,384],{"class":86},"disable_cache ",[80,386,91],{"class":90},[80,388,333],{"class":332},[80,390,392,395,397],{"class":82,"line":391},28,[80,393,394],{"class":86},"volumes ",[80,396,91],{"class":90},[80,398,399],{"class":90}," [\n",[80,401,403,406,409,412],{"class":82,"line":402},29,[80,404,405],{"class":165},"  \"",[80,407,408],{"class":169},"\u002Fvar\u002Frun\u002Fdocker.sock:\u002Fvar\u002Frun\u002Fdocker.sock",[80,410,411],{"class":165},"\"",[80,413,414],{"class":90},",\n",[80,416,418,420,423],{"class":82,"line":417},30,[80,419,405],{"class":165},[80,421,422],{"class":169},"\u002Fxxx\u002Fgitlab-runner\u002Fcache:\u002Fcache",[80,424,173],{"class":165},[80,426,428],{"class":82,"line":427},31,[80,429,126],{"class":90},[80,431,433,436,438],{"class":82,"line":432},32,[80,434,435],{"class":86},"shm_size ",[80,437,91],{"class":90},[80,439,106],{"class":94},[27,441,442,443,446,447,450,451,454],{},"其中 ",[31,444,445],{},"token"," 从 ",[31,448,449],{},"GitLab Admin Area \u002F Overview \u002F Runners"," 中可以找到，或者也可以从 ",[31,452,453],{},"Project \u002F Settings \u002F CI\u002FCD"," 中找到项目专用的 Runner token。",[61,456,457],{"id":457},"代码配置",[459,460,462],"h4",{"id":461},"前端node","前端（node）",[66,464,466],{"id":465},"dockerfile","Dockerfile",[71,468,471],{"className":469,"code":470,"language":465,"meta":76,"style":76},"language-dockerfile shiki shiki-themes material-theme-lighter github-light github-dark","FROM node:10-alpine\n\nWORKDIR \u002Fapp\n\nCOPY package.json \u002Fapp\nCOPY yarn.lock \u002Fapp\nRUN yarn install\nCOPY . \u002Fapp\nRUN yarn build\n\nEXPOSE 8888\nENV APP_ENV $APP_ENV\nCMD [\"yarn\", \"start\"]\n",[31,472,473,482,486,494,498,506,513,521,528,535,539,547,555],{"__ignoreMap":76},[80,474,475,479],{"class":82,"line":83},[80,476,478],{"class":477},"sw1J6","FROM",[80,480,481],{"class":86}," node:10-alpine\n",[80,483,484],{"class":82,"line":98},[80,485,113],{"emptyLinePlaceholder":112},[80,487,488,491],{"class":82,"line":109},[80,489,490],{"class":477},"WORKDIR",[80,492,493],{"class":86}," \u002Fapp\n",[80,495,496],{"class":82,"line":116},[80,497,113],{"emptyLinePlaceholder":112},[80,499,500,503],{"class":82,"line":129},[80,501,502],{"class":477},"COPY",[80,504,505],{"class":86}," package.json \u002Fapp\n",[80,507,508,510],{"class":82,"line":140},[80,509,502],{"class":477},[80,511,512],{"class":86}," yarn.lock \u002Fapp\n",[80,514,515,518],{"class":82,"line":145},[80,516,517],{"class":477},"RUN",[80,519,520],{"class":86}," yarn install\n",[80,522,523,525],{"class":82,"line":157},[80,524,502],{"class":477},[80,526,527],{"class":86}," . \u002Fapp\n",[80,529,530,532],{"class":82,"line":176},[80,531,517],{"class":477},[80,533,534],{"class":86}," yarn build\n",[80,536,537],{"class":82,"line":191},[80,538,113],{"emptyLinePlaceholder":112},[80,540,541,544],{"class":82,"line":206},[80,542,543],{"class":477},"EXPOSE",[80,545,546],{"class":86}," 8888\n",[80,548,549,552],{"class":82,"line":221},[80,550,551],{"class":477},"ENV",[80,553,554],{"class":86}," APP_ENV $APP_ENV\n",[80,556,557,560,563,566,569,572],{"class":82,"line":226},[80,558,559],{"class":477},"CMD",[80,561,562],{"class":86}," [",[80,564,565],{"class":169},"\"yarn\"",[80,567,568],{"class":86},", ",[80,570,571],{"class":169},"\"start\"",[80,573,126],{"class":86},[66,575,577],{"id":576},"gitlab-ciyml",".gitlab-ci.yml",[71,579,583],{"className":580,"code":581,"language":582,"meta":76,"style":76},"language-yaml shiki shiki-themes material-theme-lighter github-light github-dark","image: docker:latest\n\nvariables:\n  REGISTRY: registry.cn-hangzhou.aliyuncs.com\n  USERNAME: your username\n  PASSWORD: your password\n  NAMESPACE: your namespace\n  PROJECT_NAME: your project name\n\nstages:\n  - build\n\ndocker-build:\n  stage: build\n  image: docker:latest\n  script:\n    - docker login --username=$USERNAME $REGISTRY -p $PASSWORD\n    - docker build -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest .\n    - docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME\n    - docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest\n  only:\n    - tags\n","yaml",[31,584,585,597,601,609,619,629,639,649,659,663,670,678,682,689,698,707,714,722,729,736,743,750],{"__ignoreMap":76},[80,586,587,591,594],{"class":82,"line":83},[80,588,590],{"class":589},"sQzsp","image",[80,592,593],{"class":90},":",[80,595,596],{"class":169}," docker:latest\n",[80,598,599],{"class":82,"line":98},[80,600,113],{"emptyLinePlaceholder":112},[80,602,603,606],{"class":82,"line":109},[80,604,605],{"class":589},"variables",[80,607,608],{"class":90},":\n",[80,610,611,614,616],{"class":82,"line":116},[80,612,613],{"class":589},"  REGISTRY",[80,615,593],{"class":90},[80,617,618],{"class":169}," registry.cn-hangzhou.aliyuncs.com\n",[80,620,621,624,626],{"class":82,"line":129},[80,622,623],{"class":589},"  USERNAME",[80,625,593],{"class":90},[80,627,628],{"class":169}," your username\n",[80,630,631,634,636],{"class":82,"line":140},[80,632,633],{"class":589},"  PASSWORD",[80,635,593],{"class":90},[80,637,638],{"class":169}," your password\n",[80,640,641,644,646],{"class":82,"line":145},[80,642,643],{"class":589},"  NAMESPACE",[80,645,593],{"class":90},[80,647,648],{"class":169}," your namespace\n",[80,650,651,654,656],{"class":82,"line":157},[80,652,653],{"class":589},"  PROJECT_NAME",[80,655,593],{"class":90},[80,657,658],{"class":169}," your project name\n",[80,660,661],{"class":82,"line":176},[80,662,113],{"emptyLinePlaceholder":112},[80,664,665,668],{"class":82,"line":191},[80,666,667],{"class":589},"stages",[80,669,608],{"class":90},[80,671,672,675],{"class":82,"line":206},[80,673,674],{"class":90},"  -",[80,676,677],{"class":169}," build\n",[80,679,680],{"class":82,"line":221},[80,681,113],{"emptyLinePlaceholder":112},[80,683,684,687],{"class":82,"line":226},[80,685,686],{"class":589},"docker-build",[80,688,608],{"class":90},[80,690,691,694,696],{"class":82,"line":241},[80,692,693],{"class":589},"  stage",[80,695,593],{"class":90},[80,697,677],{"class":169},[80,699,700,703,705],{"class":82,"line":246},[80,701,702],{"class":589},"  image",[80,704,593],{"class":90},[80,706,596],{"class":169},[80,708,709,712],{"class":82,"line":260},[80,710,711],{"class":589},"  script",[80,713,608],{"class":90},[80,715,716,719],{"class":82,"line":265},[80,717,718],{"class":90},"    -",[80,720,721],{"class":169}," docker login --username=$USERNAME $REGISTRY -p $PASSWORD\n",[80,723,724,726],{"class":82,"line":283},[80,725,718],{"class":90},[80,727,728],{"class":169}," docker build -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest .\n",[80,730,731,733],{"class":82,"line":288},[80,732,718],{"class":90},[80,734,735],{"class":169}," docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME\n",[80,737,738,740],{"class":82,"line":306},[80,739,718],{"class":90},[80,741,742],{"class":169}," docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest\n",[80,744,745,748],{"class":82,"line":311},[80,746,747],{"class":589},"  only",[80,749,608],{"class":90},[80,751,752,754],{"class":82,"line":324},[80,753,718],{"class":90},[80,755,756],{"class":169}," tags\n",[459,758,760],{"id":759},"后端spring-boot","后端（spring boot）",[66,762,466],{"id":763},"dockerfile-1",[71,765,767],{"className":469,"code":766,"language":465,"meta":76,"style":76},"FROM openjdk:11-jre-slim\n\nRUN ln -sf \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FShanghai \u002Fetc\u002Flocaltime\n\nVOLUME \u002Ftmp\n\nCOPY target\u002Fxxx-api.jar app.jar\nENV SPRING_PROFILES_ACTIVE=\"prd\"\nENV JAVA_OPTS=\"-Xmx256m\"\nENTRYPOINT [ \"java\", \"-Djava.security.egd=file:\u002Fdev\u002F.\u002Furandom\", \"-jar\", \"\u002Fapp.jar\"]\n",[31,768,769,776,780,787,791,799,803,810,820,830],{"__ignoreMap":76},[80,770,771,773],{"class":82,"line":83},[80,772,478],{"class":477},[80,774,775],{"class":86}," openjdk:11-jre-slim\n",[80,777,778],{"class":82,"line":98},[80,779,113],{"emptyLinePlaceholder":112},[80,781,782,784],{"class":82,"line":109},[80,783,517],{"class":477},[80,785,786],{"class":86}," ln -sf \u002Fusr\u002Fshare\u002Fzoneinfo\u002FAsia\u002FShanghai \u002Fetc\u002Flocaltime\n",[80,788,789],{"class":82,"line":116},[80,790,113],{"emptyLinePlaceholder":112},[80,792,793,796],{"class":82,"line":129},[80,794,795],{"class":477},"VOLUME",[80,797,798],{"class":86}," \u002Ftmp\n",[80,800,801],{"class":82,"line":140},[80,802,113],{"emptyLinePlaceholder":112},[80,804,805,807],{"class":82,"line":145},[80,806,502],{"class":477},[80,808,809],{"class":86}," target\u002Fxxx-api.jar app.jar\n",[80,811,812,814,817],{"class":82,"line":157},[80,813,551],{"class":477},[80,815,816],{"class":86}," SPRING_PROFILES_ACTIVE=",[80,818,819],{"class":169},"\"prd\"\n",[80,821,822,824,827],{"class":82,"line":176},[80,823,551],{"class":477},[80,825,826],{"class":86}," JAVA_OPTS=",[80,828,829],{"class":169},"\"-Xmx256m\"\n",[80,831,832,835,838,841,843,846,848,851,853,856],{"class":82,"line":191},[80,833,834],{"class":477},"ENTRYPOINT",[80,836,837],{"class":86}," [ ",[80,839,840],{"class":169},"\"java\"",[80,842,568],{"class":86},[80,844,845],{"class":169},"\"-Djava.security.egd=file:\u002Fdev\u002F.\u002Furandom\"",[80,847,568],{"class":86},[80,849,850],{"class":169},"\"-jar\"",[80,852,568],{"class":86},[80,854,855],{"class":169},"\"\u002Fapp.jar\"",[80,857,126],{"class":86},[66,859,577],{"id":860},"gitlab-ciyml-1",[71,862,864],{"className":580,"code":863,"language":582,"meta":76,"style":76},"image: docker:latest\n\nvariables:\n  MAVEN_OPTS: -Dmaven.repo.local=\u002Fcache\u002F.m2\u002Frepository\n  REGISTRY: registry.cn-hangzhou.aliyuncs.com\n  USERNAME: your username\n  PASSWORD: your password\n  NAMESPACE: your namespace\n  PROJECT_NAME: your project name\n\nstages:\n  - package\n  - build\n\nmaven-package:\n  image: maven:3.6-jdk-11-slim\n  stage: package\n  script:\n    - mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true\n    - cp target\u002F$PROJECT_NAME.jar \u002Fcache\u002Fjars\u002F\n  only:\n    - tags\n\ndocker-build:\n  stage: build\n  image: docker:latest\n  script:\n    - docker login --username=$USERNAME $REGISTRY -p $PASSWORD\n    - mkdir target\n    - cp \u002Fcache\u002Fjars\u002F$PROJECT_NAME.jar target\n    - docker build -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME -t $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest .\n    - docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:$CI_COMMIT_REF_NAME\n    - docker push $REGISTRY\u002F$NAMESPACE\u002F$PROJECT_NAME:latest\n  only:\n    - tags\n",[31,865,866,874,878,884,894,902,910,918,926,934,938,944,951,957,961,968,977,985,991,998,1005,1011,1017,1021,1027,1035,1043,1049,1055,1062,1069,1075,1081,1088,1095],{"__ignoreMap":76},[80,867,868,870,872],{"class":82,"line":83},[80,869,590],{"class":589},[80,871,593],{"class":90},[80,873,596],{"class":169},[80,875,876],{"class":82,"line":98},[80,877,113],{"emptyLinePlaceholder":112},[80,879,880,882],{"class":82,"line":109},[80,881,605],{"class":589},[80,883,608],{"class":90},[80,885,886,889,891],{"class":82,"line":116},[80,887,888],{"class":589},"  MAVEN_OPTS",[80,890,593],{"class":90},[80,892,893],{"class":169}," -Dmaven.repo.local=\u002Fcache\u002F.m2\u002Frepository\n",[80,895,896,898,900],{"class":82,"line":129},[80,897,613],{"class":589},[80,899,593],{"class":90},[80,901,618],{"class":169},[80,903,904,906,908],{"class":82,"line":140},[80,905,623],{"class":589},[80,907,593],{"class":90},[80,909,628],{"class":169},[80,911,912,914,916],{"class":82,"line":145},[80,913,633],{"class":589},[80,915,593],{"class":90},[80,917,638],{"class":169},[80,919,920,922,924],{"class":82,"line":157},[80,921,643],{"class":589},[80,923,593],{"class":90},[80,925,648],{"class":169},[80,927,928,930,932],{"class":82,"line":176},[80,929,653],{"class":589},[80,931,593],{"class":90},[80,933,658],{"class":169},[80,935,936],{"class":82,"line":191},[80,937,113],{"emptyLinePlaceholder":112},[80,939,940,942],{"class":82,"line":206},[80,941,667],{"class":589},[80,943,608],{"class":90},[80,945,946,948],{"class":82,"line":221},[80,947,674],{"class":90},[80,949,950],{"class":169}," package\n",[80,952,953,955],{"class":82,"line":226},[80,954,674],{"class":90},[80,956,677],{"class":169},[80,958,959],{"class":82,"line":241},[80,960,113],{"emptyLinePlaceholder":112},[80,962,963,966],{"class":82,"line":246},[80,964,965],{"class":589},"maven-package",[80,967,608],{"class":90},[80,969,970,972,974],{"class":82,"line":260},[80,971,702],{"class":589},[80,973,593],{"class":90},[80,975,976],{"class":169}," maven:3.6-jdk-11-slim\n",[80,978,979,981,983],{"class":82,"line":265},[80,980,693],{"class":589},[80,982,593],{"class":90},[80,984,950],{"class":169},[80,986,987,989],{"class":82,"line":283},[80,988,711],{"class":589},[80,990,608],{"class":90},[80,992,993,995],{"class":82,"line":288},[80,994,718],{"class":90},[80,996,997],{"class":169}," mvn $MAVEN_OPTS clean package -Dmaven.test.skip=true\n",[80,999,1000,1002],{"class":82,"line":306},[80,1001,718],{"class":90},[80,1003,1004],{"class":169}," cp target\u002F$PROJECT_NAME.jar \u002Fcache\u002Fjars\u002F\n",[80,1006,1007,1009],{"class":82,"line":311},[80,1008,747],{"class":589},[80,1010,608],{"class":90},[80,1012,1013,1015],{"class":82,"line":324},[80,1014,718],{"class":90},[80,1016,756],{"class":169},[80,1018,1019],{"class":82,"line":336},[80,1020,113],{"emptyLinePlaceholder":112},[80,1022,1023,1025],{"class":82,"line":351},[80,1024,686],{"class":589},[80,1026,608],{"class":90},[80,1028,1029,1031,1033],{"class":82,"line":361},[80,1030,693],{"class":589},[80,1032,593],{"class":90},[80,1034,677],{"class":169},[80,1036,1037,1039,1041],{"class":82,"line":371},[80,1038,702],{"class":589},[80,1040,593],{"class":90},[80,1042,596],{"class":169},[80,1044,1045,1047],{"class":82,"line":381},[80,1046,711],{"class":589},[80,1048,608],{"class":90},[80,1050,1051,1053],{"class":82,"line":391},[80,1052,718],{"class":90},[80,1054,721],{"class":169},[80,1056,1057,1059],{"class":82,"line":402},[80,1058,718],{"class":90},[80,1060,1061],{"class":169}," mkdir target\n",[80,1063,1064,1066],{"class":82,"line":417},[80,1065,718],{"class":90},[80,1067,1068],{"class":169}," cp \u002Fcache\u002Fjars\u002F$PROJECT_NAME.jar target\n",[80,1070,1071,1073],{"class":82,"line":427},[80,1072,718],{"class":90},[80,1074,728],{"class":169},[80,1076,1077,1079],{"class":82,"line":432},[80,1078,718],{"class":90},[80,1080,735],{"class":169},[80,1082,1084,1086],{"class":82,"line":1083},33,[80,1085,718],{"class":90},[80,1087,742],{"class":169},[80,1089,1091,1093],{"class":82,"line":1090},34,[80,1092,747],{"class":589},[80,1094,608],{"class":90},[80,1096,1098,1100],{"class":82,"line":1097},35,[80,1099,718],{"class":90},[80,1101,756],{"class":169},[61,1103,1105],{"id":1104},"阿里云-k8s-配置","阿里云 k8s 配置",[27,1107,1108],{},"应用创建触发器：",[1110,1111],"post-image",{"filename":1112},"01.png",[27,1114,1115],{},"复制触发器 URL 到镜像仓库中创建推送触发器：",[1110,1117],{"filename":1118},"02.png",[27,1120,1121],{},"完成。",[1123,1124,1125],"style",{},"html pre.shiki code .sw1J6, html code.shiki .sw1J6{--shiki-light:#F76D47;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .sQzsp, html code.shiki .sQzsp{--shiki-light:#E53935;--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":76,"searchDepth":98,"depth":98,"links":1127},[1128,1129,1130],{"id":63,"depth":98,"text":64},{"id":457,"depth":98,"text":457},{"id":1104,"depth":98,"text":1105},null,"png","2020-12-27","今年对于我个人而言，在 DevOps 上的最大收获，莫过于摸索了这套基于 GitLab CI 和 k8s 的持续交付解决方案，其实原理都很简单，在我去年的方案里又做了改进，实现了基于 git tag 的触发方式，并且把原先的本地打包推镜像改为在 GitLab Runner 上打包推镜像。",false,"md",{},"\u002Fposts\u002F2020\u002Fdevops-gitlab-ci-aliyun-k8s",{"text":1140,"minutes":1141,"time":1142,"words":1143},"3 min read",2.635,158100,527,{"title":22,"description":1134},{"loc":1138},"posts\u002F2020\u002F20201227.devops-gitlab-ci-aliyun-k8s",[1148,1149,1150],"技术","DevOps","k8s","Jz27CSI5_8F6FrpDl81aWz-abbc2KGOJHbYI2yw83E8",[1153,1159],{"title":1154,"path":1155,"stem":1156,"date":1157,"description":1158,"children":-1},"2021 年伊始","\u002Fposts\u002F2021\u002Fbeginning-of-2021","posts\u002F2021\u002F20210103.beginning-of-2021","2021-01-03","多事之秋的 2020 年终于结束了，这一年最大的关键词可能就是“新冠疫情”了，全民抗疫果真成为了常态，戴口罩也成了大家出门的一种习惯。",{"title":1160,"path":1161,"stem":1162,"date":1163,"description":1164,"children":-1},"安卓 WebView 图片离线缓存方案","\u002Fposts\u002F2020\u002Fandroid-webview-picture-cache","posts\u002F2020\u002F20201218.android-webview-picture-cache","2020-12-18","有这样一个项目，UI 渲染全部由 WebView 来完成，套个安卓的壳，壳子里面做一些和硬件交互的功能，例如摄像头、麦克风等。WebView 加载的页面走的本地打包的文件。不过 WebView 中的图片等资源走的是网络访问。",1777579139354]