Jenkins 是一个很老的 ci/cd 服务了,可是至今并未过期,几乎是各类公司的首选,足见其功能强大vue
最近用 docker 搭建了一个 Jenkins 服务,实现了代码提交后自动触发测试和部署,不再用手动发布了,节省了大量的时间nginx
FROM jenkins/jenkins:2.191 COPY executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy USER root RUN apt-get update RUN apt-get install -y build-essential
这里我在基础镜像上安装了 make 工具,由于我大部分项目都是用 make 构建git
我将 jenkins 服务自己也部署到了 docker 集群中,compose 文件内容以下:github
version: "3.5" services: jenkins: image: hatlonely/jenkins:${version} hostname: jenkins user: root ports: - "8080:8080" - "50000:50000" deploy: replicas: 1 restart_policy: condition: on-failure volumes: - "/var/docker/jenkins/data:/var/jenkins_home" - "/var/docker:/var/docker" - "/var/run/docker.sock:/var/run/docker.sock" - "/bin/docker:/usr/bin/docker" networks: - jenkinsnet networks: jenkinsnet: name: jenkinsnet
这里主要要解决两个问题:web
volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "/bin/docker:/usr/bin/docker"
docker 是 c/s 架构,会在本地后台启动一个服务来管理和维护容器,客户端经过套接字和服务通讯,将套接字映射到容器内部,可让容器也能访问宿主机的 docker,此外将 docker 命令自己映射到容器内部,就不须要在容器内部再安装一个 docker 了docker
volumes: - "/var/docker/jenkins/data:/var/jenkins_home" - "/var/docker:/var/docker"
这里我有个实践的约定,会将全部 docker 容器的状态映射到宿主机的 /var/docker/{service}
下面,Jenkins 的状态保存在 /var/jenkins_home
下,这里咱们把它直接映射到 /var/docker/jenkins/data
下,另外,其余的服务须要经过容器内的 Jenkins 部署,volume 挂载的数据只能映射到 Jenkins 容器内部,而咱们约定,这些数据只能在 /var/docker
下,所以,只须要再挂载这个目录,其余服务的状态就都能持久化到宿主机了json
完整代码参考:https://github.com/hpifu/dock...网络
执行 make build
完成镜像的制做(我把 Dockerfile 中的端口映射注释掉了,是由于个人环境里面全部的服务都统一用 nginx 做反向代理对外了)
执行 make deploy
便可完成 Jenkins 的部署架构
部署完成以后,访问 http://127.0.0.1:8080,按照提示很容易就能够完成初始化,初始化完成以后,/var/jenkins_home
里面会产生不少数据,这些数据是 Jenkins 的状态,前面咱们已把这个目录映射到了宿主机的 /var/docker/jenkins/data
,这样重启 Jenkins 数据也不会丢失并发
初始化完成以后终于能够建立任务了,相比之下,这个过程多是最简单的
【新建任务】→【流水线】(名称填 docker-jenkins)→【肯定】
General
构建触发器
流水线
pipeline { agent any stages { stage('image') { steps { sh 'make build' } } stage('deploy') { steps { sh 'make deploy' } } } }
点保存以后点当即构建便可
要实现 github push 以后自动触发,须要在 github 设置 webhook(须要 owner 权限),另外须要 Jenkins 有对外网可见的地址
Payload URL: <https://<your jenkins server address>/github-webhook/> Content type:<application/json>
配置完成后,能够提交下试试,在 webhooks 页面能够看到刚刚配置的 hook,拖到最下面有最近的 hook 触发记录
Jenkins 第一次构建须要手动触发,以后的构建都会自动触发,偶尔没有触发,多是 github 和你的服务之间的网络问题,可去 github webhook 页面检查 hook 触发记录
对项目做一些简单的规范,能大大地简化整个部署流程,前面建立项目的时候咱们使用的是 Pipeline script
,能够看到还有另外一个选项 Pipeline script from SCM
支持直接从一个 git 地址获取这个脚本,通常名为 Jenkinsfile,这也是我推荐的一种方式,Jenkinsfile 和代码一块儿维护起来,这样不一样的项目,不一样的 Jenkins 环境,建立的 Jenkins 任务都是同样的,大大简化了建立任务的复杂度
另外一方面,项目的构建,编译,运行,打包,部署,测试等都经过 Makefile 实现,这样全部执行的动做都变成了一条 make 命令,Jenkinsfile 的逻辑变得很是简单,甚至能够是通用的,下面是一些示例:
经过这些示例能够看到,复杂的构建过程都被 Makefile 屏蔽了,而经过 Makefile,不一样类型,不一样语言的项目的构建过程也对 Jenkins 屏蔽了,达到了统一
转载请注明出处
本文连接: https://tech.hatlonely.com/article/57