Docker+Jenkins部署
为了适应现有的分布式部署方案,支持多服务器的项目打包和发布,启用Jenkins进行持续化集成。并且为了方便程序管理,使用Docker进行镜像打打包和发布
Docker安装
不再此具体表述Docker安装过程
Jenkins安装
安装镜像
目前Docker公共仓库下面,有两个Jenkins镜像,分别为Jenkins和Jenkinsci/Jenkins。根据官方说明,前者已经不再更新,因此时候后面的镜像进行安装
docker pull jenkinsci/jenkins
启动镜像
docker run --name jenkins -p 8002:8080 -p 50000:50000 -d -v /home/jenkins-home-docker:/var/jenkins_home jenkins/jenkins:lts
-p:端口映射8080为默认的Jenkins管理端网页端口,50000为 JNLP(Java Web Start) 语言调用Java类的接口,暂不清楚具体实现方式
-v:文件映射
Jenkins基础系统配置
上述Docker容器启动之后,通过Docker日志查看命令
docker logs -f jenkins
界面上会输出Jenkins的初始管理原密码。或者进入Jenkins容器之后,执行命令查看
docker exec -it jenkins /bin/bash
cat /var/jenkins_home/secrets/initialAdminPassword
打开Jenkins的管理网站:http://iphost:8002。其中IP地址为Jenkins的部署服务器地址,端口为上述docker启动时,真是8080进行的端口映射。
首次打开之后,会出现如下界面
点击继续之后,在插件安装页面,我们现在安装推荐插件
Jenkins汉化
首页进入Jenkins,由于可能不同浏览器优先级语言的原因,默认显示问英文,如果需要指定语言,则需要安装插件
在Available分页下面在Filter中搜索Locale Plugin插件和Localization: Chinese(Simplified),分别勾选之后,点击下面的Download now and install after restart按钮。等待安装完成之后,重启Jenkins。
http://iphonst:8002/restart
重启完成之后,进入Manager Jenkins -> Configure System
找到 Locale 栏目,在 Default Language 输入框中输入 zn_CN。并且勾选下方的复选框:Ignore browser preference and force this language to all users
刷新页面,即可看到汉化结果。由于插件存在部分汉化的原因,可能有一些文字仍然显示中文。
Jenkins时区修改
默认启动Jenkins时,时区为标准时间,如果需要修改为北京时间,
打开 系统管理->脚本命令行 执行以下命令:
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
点击运行,即可修改完成,无需重启。
必须插件安装
publish over ssh
相关配置内容如下 系统管理 -> 系统配置 -> Publish over ssh
由于测试时我们使用root来直接登录
SSH Service
- Name:SSH的显示名称
- Hostname:SSH的主机地址。由于我们Jenkins也是安装在Docker内的,可以使用 Docker分配的IP 访问。
- Username:SSH登录用户名
- Remote Directory:远程连接之后的默认路径
- 勾选 Use password authentication, or use a different key
- Passphrase / Password:输入 Username 对应的密码
新增完成后点击 Test Configuration 出现 Success 之后表示配置成功 最下面的 保存
Maven Integration plugin
相关配置内容如下 系统管理 -> 全局工具配置 -> Maven
- Name:显示名称
- 勾选自动安装
- 选择自己需要的版本
新建完成之后,点击最下面的保存
自动化部署配置
新建任务
首页 -> 新建任务
- 描述:针对任务的描述
- Git:由于测试项目为Git项目,这里按照git来配置
- Repository URL:git项目的地址 https://******.git
- Credentials:git的认证方式,首次添加,可以通过右侧的添加按钮进行新增
- Branches to build:指定编译的分支
- 触发远程钩子
通过请求指定的Jenkins的URL地址,来触发构建,如图中的配置,则触发请求地址为
http://iphost:8002/job/pet/build?token=buildEureka
- 定时构建
使用 cron 格式来指定构建周期
选择 执行 shell
在命令中输入需要执行的shell命令
echo "Pre Steps脚本启动成功"
- Root POM:Maven编译的pom.xml文件
- Goals and options:Maven编译的参数
- Run only if build successeds:仅在编译成功之后执行
- Run only if build successeds or is unstable:仅在编译成功或者不稳定时执行
- Run regardless of build result:不管编译结构都执行
由于我们的Jenkins是安装在Docker容器中的,因此需要在编译完成Jar包之后,把容器内的jar包通过SSH上传到发布服务器上,因此我们在此通过 Publish over SSH 插件实现
选择 Send files or excute commands over SHH
- SSH Server Name:我们在上面配置的SSH服务器地址
- Source files:上次上传的原文件地址,可以配置为jar包地址
- Remove prefix:需要移除的文件前缀
- Exec command:如果这个配置框中有任何内容,那么它将在远程服务器上执行。如果配置了源文件,那么将在执行Exec命令之前传输这些文件。
cd /home
mv pet-eureka-0.0.1-SNAPSHOT.jar pet-eureka.jar
./dockerBuild.sh
./dockerRun.sh
默认登录后是在/root目录下,所以切换到ssh的登录目录,并且重命名包名,方便后续统一管理
dockerBuild.sh为Docker镜像的编译命令,dockerRun.sh为容器的编译执行命令
dockerBuild.sh
docker build -t pet-eureka .
docker image prune -f
- 根据Dockerfile文件配置编译指定镜像,最后的“.”表示指定的Dockerfile所在路径和相关文件路径
- 删除重新编译之后未挂载的镜像,如下图所示的为dangling状态的镜像,需要此命令删除
dockerRun.sh
#镜像名称
IMAGE_NAME='pet-eureka'
echo '================获取容器id=================='
CID=$(docker ps -a | grep $IMAGE_NAME | awk '{print $1}')
echo 容器id=$CID
echo '================获取镜像id=================='
IID=$(docker images | grep $IMAGE_NAME | awk '{print $3}')
echo 镜像id=$IID
if [ -n "$CID" ]; then
echo 存在$IMAGE_NAME容器,停止容器并删除
docker stop $IMAGE_NAME
docker rm $IMAGE_NAME
else
echo 不存在$IMAGE_NAME容器,开始启动
fi
docker run --name=$IMAGE_NAME -p 8081:8081 -d $IMAGE_NAME
Dockerfile.sh
FROM java:8
ADD pet-eureka.jar /usr/local/jar/
# 修正 docker 容器里面的时间
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
#声明暴漏端口,这里一般不强制,因为我们通常用 docker -p port:port 来映射端口,以达到访问容器内部的目的
EXPOSE 8081
CMD ["java","-jar","/usr/local/jar/pet-eureka.jar"]
- 由于jar包需要基于java环境运行,因此第一句为指定基础的镜像。如果没有安装,需要先安装java镜像包
docker pull java:8
- 复制指定的jar包到容器内的指定路径下
- 最后一行为指定容器运行的默认命令
三个文件配置完成之后,需要给予文件执行权限
chmod 755 dockerBuild.sh dockerRun.sh Dockerfile
所以配置完成之后,点击最下方的保存按钮
Jenkins任务运行
任务创建完成之后,点击任务首页左侧的立即构建,即可在下方的Build History中看到对应的任务日志
点击任务列表,在进入的页面左侧,点击命令行输出,即可即可看到运行日志
结束
最后,可以在目标服务器上查看具体的编译成果,以及具体的docker镜像和容器是否生成以及运行正常