背景说明:
- jenkins 放在docker中,单独一台服务器,称发布服务器;
- python,java等多个项目放在不同的docker中,统一称运行服务器
- 代码放在gitlab上,python和java 用spring cloud 整合
- 本地没有docker 私有仓库
大体结构- 开发人员在gitLab上传代码到分支上
- Jenkins 定时/手动获取指定分支源码
- java项目需打包,编译,此处用maven,python不需额外操作
- Jenkins 将文件传送到运行服务器
- Jenkins 执行远程脚本
- 邮件通知测试人员部署结果
- Docker运行jenkins
获取jenkins images
运行jenkins 镜像docker pull jenkinsci/jenkins:lts
jenkins 初始化配置,主要是选择插件,初始化密码在/var/jenkins_home/secrets/initialAdminPassword中,初始化完成之后,生成管理员账号admin 为方便,需修改密码sudo docker run -d --name jenkins -p 8099:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkinsci/jenkins:lts
- jenkins 配置
jdk maven 配置,进入系统管理-->Global Tool Configuration
java_home 和maven_home 是jdk 和maven安装绝对路径,要么在运行jenkins的docker中安装jdk 和maven环境,要么jenkins docker 宿主机上的jdk 和maven文件夹挂载到jenkins docker上 - 邮件通知,运行服务器,gitlab 配置
进入系统管理-->系统设置,如没有这些配置项,在系统管理-->管理插件下载相关插件
配置gitlab,gitlab服务器地址在setting-->Account-->Private token
配置邮件发送服务器
配置Publish over SSH 运行服务器是密钥文件登陆
目前为止,jenkins已安装配置完成 - 新建job,配置
配置git地址
配置定时任务
java 配置maven 编译打包
配置执行远程脚本
- 远程脚本,python shell例子 python不需要重启编译,直接将最新代码copy到docker 挂载的文件夹下,直接生效
space="python_demo/wuxiaolin" space_new="python_demo1" cp /home/ubuntu/jenkins/$space/* /data/work/$space_new/
- 远程脚本,java shell例子 思路是将docker 容器停掉,删掉镜像和容器,重新build,重新启动容器,当然此处可以copy jar包,然后重启服务,重新build需借助docker 的dockerfile
cp /home/ubuntu/jenkins/bondService/bondService.jar /data/work/service-bond/ CONTAINER_ID=`docker ps | grep "jenkins-service-bond" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then docker kill $CONTAINER_ID sleep 1 docker rm $CONTAINER_ID else #如果容器启动时失败了,就需要docker ps -a才能找到那个容器 CONTAINER_ID=`docker ps -a | grep "jenkins-service-bond" | awk '{print $1}'` if [ -n "$CONTAINER_ID" ]; then # 如果是第一次在这台机器上拉取运行容器,那么docker ps -a也是找不到这个容器的 docker rm $CONTAINER_ID fi fi sleep 2 IMAGE_ID=`docker images | grep jenkins-service-bond| awk '{print $3}'` if [ -n "${IMAGE_ID}" ];then docker rmi ${IMAGE_ID} fi sleep 2 cd /data/work/service-bond/ docker build -t jenkins-service-bond . sleep 1 docker run -d -p 8084:8084 jenkins-service-bond