这里介绍一下通过jenkins自动打包,并利用ansible实现自动发布,实现方式是通过git的webhook自动检查,并触发jenkin的job,然后job自动打包并发布的流程,这里的方式有一个弊端,就是每个项目都需要创建一个job,如果项目少还好,项目比较多需要创建很多个job,不过流水线的方式可以解决这个问题,后期会针对流水线的方式单独说明。看下面的流程:
首先,需要配置好模版,这里使用的是kubernetes,所以利用了ansible-playbook看下面的文件结构:
# tree deploy.k8s
deploy.k8s
├── defaults
│ └── main.yml
├── files
├── handlers
│ └── main.yml
├── meta
│ └── main.yml
├── README.md
├── tasks
│ └── main.yml
├── templates
│ └── deploy.j2
├── tests
│ ├── inventory
│ └── test.yml
└── vars
└── main.yml
8 directories, 9 files
在tenolates下的deploy.j2是pod的模版,通过jenkins把值赋给变量,然后生成一个完整的模版,看一下deploy.j2的内容:
# cat deploy.k8s/templates/deploy.j2
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ SVC_NAME }}
namespace: {{ SVC_NS }}
labels:
app: {{ SVC_NAME }}
release: {{ SVC_ENV }}
spec:
replicas: {{ SVC_REPLICAS }}
selector:
matchLabels:
app: {{ SVC_NAME }}
release: {{ SVC_ENV }}
template:
metadata:
labels:
app: {{ SVC_NAME }}
release: {{ SVC_ENV }}
spec:
containers:
- image: ********/{{ SVC_NAME }}-{{ SVC_ENV }}:{{ BUILD_NUMBER }}
imagePullPolicy: Always
name: {{ SVC_NAME }}
readinessProbe:
httpGet:
port: {{ SVC_PORT }}
path: /health
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 30
failureThreshold: 10
resources:
requests:
cpu: {{ SVC_CPU }}
memory: {{ SVC_MEM }}Gi
limits:
cpu: {{ SVC_CPU }}
memory: {{ SVC_MEM }}Gi
env:
- name: aliyun_logs_log-{{ SVC_NAME }}
value: stdout
nodeSelector:
node: {{ SVC_NODE }}
imagePullSecrets:
- name: reach-{{ SVC_ENV }}-image #镜像认证
---
apiVersion: v1
kind: Service
metadata:
labels:
app: {{ SVC_NAME }}
release: {{ SVC_ENV }}
name: {{ SVC_NAME }}
namespace: {{ SVC_NS }}
spec:
ports:
- name: {{ SVC_NAME }}
port: {{ SVC_PORT }}
protocol: TCP
targetPort: {{ SVC_PORT }}
selector:
app: {{ SVC_NAME }}
release: {{ SVC_ENV }}
type: ClusterIP
下面就需要看看jenkins如何把值赋给变量了。
以上是针对deploy.j2的变量输出,其他的都是Jenkins环境变量和项目的,不过这里注意,在jenkins一定要勾选
这里就是配置git中的webhook触发的地方,上面的地址,分支,token,注意如果使用的是tag,可以配置tag正则的方式也是可以的,后面就是打包生成镜像的问题了,dockerfile可以写到代码里也可以写到jenkins里,不过我比较倾向于写到代码里,这样方便。镜像也制作完成了,下面就是生成pod的yaml文件
/etc/ansible/books/deploy_k8s_${ENV}.yaml -e "host=${ENV}_reach_k8s
SVC_NAME=${ServiceName} \
SVC_NS=${K8S_NAMESPACE} \
SVC_ENV=${ENV} \
SVC_PORT=${PORT} \
SVC_REPLICAS=${REPLICAS} \
SVC_CPU=${SVC_CPU_LIMIT} \
SVC_MEM=${MEM_LIMIT} \
BUILD_NUMBER=${BUILD_NUMBER} \
SVC_NODE=${SVC_NODE} "
把上面的值传到文件中生成一个yaml文件,并执行,这个执行是在
# cat deploy.k8s/tasks/main.yml
---
# tasks file for deploy.k8s
- template:
src: deploy.j2
dest: /tmp/deploy.yaml
owner: root
group: root
mode: 0644
force: true
- name: "deploy service to kubernetes"
shell: "kubectl apply -f /tmp/deploy.yaml"
#- file:
# path: /tmp/deploy.yaml
# state: absent
不过这里执行时deploy.yaml文件会覆盖掉,所以同一个环境不能同时生成,不过可以在这里加个时间变量就解决了。
下面看git的webhook的配置,
这样每次合并代码就会自动触发,不需要任何操作,唯一的遗憾就是job比较多,每个项目都需要加配置。






您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏