前言
最近朋友接了一個(gè)外包暖哨,這家外包公司用gitlab來(lái)做cicd陷舅,朋友之前自動(dòng)化部署基本上都是利用jenkins佣蓉,沒(méi)接觸過(guò)過(guò)gitlab的cicd拉馋,朋友他對(duì)技術(shù)也是比較有追求,他發(fā)現(xiàn)這家公司k8s的yaml文件里初,很多字段其實(shí)可以抽出來(lái)啃勉,配合cicd動(dòng)態(tài)傳入,而不是把那些字段直接寫(xiě)死在yaml文件双妨,比如docker鏡像淮阐。剛好我之前也玩過(guò)一陣子基于gitlab的cicd,他就問(wèn)我有沒(méi)有什么思路刁品,于是就有了本篇的寫(xiě)文素材
前置知識(shí)
1泣特、如何用gitlab來(lái)做cicd
可以查看官網(wǎng)鏈接,如下
https://docs.gitlab.com/ee/ci/README.html
2挑随、envsubst命令了解
a状您、envsubst的作用
這個(gè)命令可以把環(huán)境變量傳遞給文件,并實(shí)現(xiàn)文件的變量替換兜挨,要替換的變量格式 var
b膏孟、envsubst如何使用
- 替換環(huán)境變量stdin輸出到stdout:
echo '{{$HOME}}' | envsubst
- 將輸入文件中的環(huán)境變量替換為stdout:
envsubst < {{path/to/input_file}}
- 將輸入文件中的環(huán)境變量替換為文件,并將其輸出到文件中:
envsubst < {{path/to/input_file}} > {{path/to/output_file}}
- 用空格分隔的列表拌汇,替換輸入文件中的環(huán)境變量:
envsubst '{{$USER $SHELL $HOME}}' < {{path/to/input_file}}
上述命令內(nèi)容來(lái)自如下博文柒桑,因?yàn)槊顩](méi)有幾行,我就也貼了上來(lái)
https://blog.csdn.net/oopxiajun2011/article/details/111668011
注: 在mac上噪舀,需要安裝gettext幕垦,才能使用envsubst
c丢氢、如何利用envsubst替換k8s deployment.ymal
假設(shè)deployment.ymal有個(gè)鏡像內(nèi)容形如下
image: $DEPLOY_PROCJECT_IMAGE
我們可以執(zhí)行如下命令
envsubst < deployment.yml | kubectl apply -f -
這行命令的意思就是讀取deployment.yml,并通過(guò)envsubst 把deployment.yml中的$DEPLOY_PROCJECT_IMAGE替換成相應(yīng)的環(huán)境變量先改,并通過(guò)管道疚察,把deployment.yml的內(nèi)容傳遞給kubectl
如何將gitlab ci的環(huán)境變量透?jìng)鹘ok8s deployment.ymal
示例:
注: 朋友的公司采用業(yè)務(wù)服務(wù)和部署服務(wù).gitlab-ci.yml隔離,業(yè)務(wù)服務(wù).gitlab-ci.yml通過(guò)觸發(fā)部署服務(wù)的觸發(fā)器進(jìn)行部署仇奶,示例只列和本文相關(guān)的內(nèi)容貌嫡,其他配置信息做了清理
1、業(yè)務(wù)服務(wù)的.gitlab-ci.yml配置如下
variables:
REGISTRY: xxx.docker.com
PROJECTNAME: hello-demo
IMAGE: demo/hello-demo
DEPLOY_VERSION: $CI_COMMIT_TIMESTAMP
stages:
- triggerDeploy
triggerDeployK8S:
stage: triggerDeploy
image: $REGISTRY/devops/busyboxplus:curl
script:
- curl -X POST -F token=fc4754200aa027baedf97cf7d45a02 -F ref=master -F "variables[DEPLOY_PROJECT_NAME]=$PROJECTNAME" -F "variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev" -F "variables[DEPLOY_VERSION]=$DEPLOY_VERSION" http://xxx.gitlab.com/api/v4/projects/32/trigger/pipeline
only:
- dev
tags:
- dev
其中
variables[DEPLOY_PROCJECT_IMAGE]=$REGISTRY/$IMAGE:dev
就是環(huán)境變量
2该溯、部署服務(wù)的.gitlab-ci.yml配置如下
stages:
- deploy
deploy:
stage: deploy
script:
- echo $DEPLOY_PROJECT_NAME
- echo $DEPLOY_PROCJECT_IMAGE
- echo $DEPLOY_VERSION
- cd ${DEPLOY_PROJECT_NAME}
- envsubst < deployment.yml | kubectl apply -f
only:
- triggers
tags:
- dev-deploy
3岛抄、deployment.yml示例
apiVersion: v1
kind: Service
metadata:
namespace: dev
name: hello-demo
spec:
selector:
app: hello-demo
ports:
- protocol: TCP
port: 8080
targetPort: 8080
nodePort: 30011
type: NodePort
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: dev
name: hello-demo
labels:
app: hello-demo
spec:
replicas: 3
selector:
matchLabels:
app: hello-demo
template:
metadata:
labels:
app: hello-demo
spec:
imagePullSecrets:
- name: default-secret
containers:
- name: hello-demo
image: $DEPLOY_PROCJECT_IMAGE
imagePullPolicy: Always
ports:
- containerPort: 8080
env:
# k8s滾動(dòng)更新pod,是根據(jù)deployment.yml的變化來(lái)更新狈茉,如果代碼更新了夫椭,但是deployment.yml內(nèi)容沒(méi)更新,k8s會(huì)認(rèn)為
#pod沒(méi)有產(chǎn)生變化氯庆,因此就不會(huì)進(jìn)行滾動(dòng)升級(jí)蹭秋。DEPLOY_VERSION是用來(lái)做每次部署動(dòng)態(tài)更新deployment.yml內(nèi)容
- name: DEPLOY_VERSION
value: "$DEPLOY_VERSION"
總結(jié)
貌似也沒(méi)啥內(nèi)容總結(jié),就貼個(gè)gitlab ci內(nèi)置的variables文檔作為總結(jié)吧堤撵,文檔內(nèi)容如下
https://docs.gitlab.com/ce/ci/variables/predefined_variables.html