作者:mobiledu2502861997 | 来源:互联网 | 2023-09-08 20:31
最近敌人接了一个外包,这家外包公司用gitlab来做cicd,敌人之前自动化部署基本上都是利用jenkins,没接触过过gitlab的cicd,敌人他对技术也是比拟有谋求,他发现这家公司k8s的yaml文件,很多字段其实能够抽出来,配合cicd动静传入,而不是把那些字段间接写死在yaml文件,比方docker镜像。刚好我之前也玩过一阵子基于git
前言
最近敌人接了一个外包,这家外包公司用gitlab来做cicd,敌人之前自动化部署基本上都是利用jenkins,没接触过过gitlab的cicd,敌人他对技术也是比拟有谋求,他发现这家公司k8s的yaml文件,很多字段其实能够抽出来,配合cicd动静传入,而不是把那些字段间接写死在yaml文件,比方docker镜像。刚好我之前也玩过一阵子基于gitlab的cicd,他就问我有没有什么思路,于是就有了本篇的写文素材
前置常识
1、如何用gitlab来做cicd
能够查看官网链接,如下
https://docs.gitlab.com/ee/ci/README.html
2、envsubst命令理解
a、envsubst的作用
这个命令能够把环境变量传递给文件,并实现文件的变量替换,要替换的变量格局$ {var}或$ var
b、envsubst如何应用
echo '{{$HOME}}' | envsubst
envsubst <{{path/to/input_file}}
envsubst '{{$USER $SHELL $HOME}}' <{{path/to/input_file}}
上述命令内容来自如下博文,因为命令没有几行,我就也贴了上来
https://blog.csdn.net/oopxiajun2011/article/details/111668011
注: 在mac上,须要装置gettext,能力应用envsubst
c、如何利用envsubst替换k8s deployment.yaml
假如deployment.yaml有个镜像内容形如下
image: $DEPLOY_PROCJECT_IMAGE
咱们能够执行如下命令
envsubst
这行命令的意思就是读取deployment.yml,并通过envsubst 把deployment.yml中的$DEPLOY_PROCJECT_IMAGE替换成相应的环境变量,并通过管道,把deployment.yml的内容传递给kubectl
如何将gitlab ci的环境变量透传给k8s deployment.yaml
示例:
注: 敌人的公司采纳业务服务和部署服务.gitlab-ci.yml隔离,业务服务.gitlab-ci.yml通过触发部署服务的触发器进行部署,示例只列和本文相干的内容,其余配置信息做了清理
1、业务服务的.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
就是环境变量
2、部署服务的.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
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滚动更新pod,是依据deployment.yml的变动来更新,如果代码更新了,然而deployment.yml内容没更新,k8s会认为
#pod没有产生变动,因而就不会进行滚动降级。DEPLOY_VERSION是用来做每次部署动静更新deployment.yml内容
- name: DEPLOY_VERSION
value: "$DEPLOY_VERSION"
总结
貌似也没啥内容总结,就贴个gitlab ci内置的variables文档作为总结吧,文档内容如下
https://docs.gitlab.com/ce/ci/variables/predefined_variables.html