jenkins利用ansible自动发布

avatar 2022年3月13日18:11:51 评论 1,180 次浏览

这里介绍一下通过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比较多,每个项目都需要加配置。

avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: