为了适应现有的分布式部署方案,支持多服务器的项目打包和发布,启用Jenkins进行持续化集成。并且为了方便程序管理,使用Docker进行镜像打打包和发布
不再此具体表述Docker安装过程
目前Docker公共仓库下面,有两个Jenkins镜像,分别为Jenkins和Jenkinsci/Jenkins。根据官方说明,前者已经不再更新,因此时候后面的镜像进行安装
docker pull jenkinsci/jenkins-p:端口映射8080为默认的Jenkins管理端网页端口,50000为 JNLP(Java Web Start) 语言调用Java类的接口,暂不清楚具体实现方式
-v:文件映射
上述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,由于可能不同浏览器优先级语言的原因,默认显示问英文,如果需要指定语言,则需要安装插件
在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时,时区为标准时间,如果需要修改为北京时间, 打开 系统管理->脚本命令行 执行以下命令:
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 keyPassphrase / Password:输入 Username 对应的密码新增完成后点击 Test Configuration 出现 Success 之后表示配置成功 最下面的 保存
Maven Integration plugin 相关配置内容如下 系统管理 -> 全局工具配置 -> Maven
Name:显示名称勾选自动安装选择自己需要的版本新建完成之后,点击最下面的保存
首页 -> 新建任务
描述:针对任务的描述 Git:由于测试项目为Git项目,这里按照git来配置Repository URL:git项目的地址 https://******.gitCredentials: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_NAMEDockerfile.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所以配置完成之后,点击最下方的保存按钮
任务创建完成之后,点击任务首页左侧的立即构建,即可在下方的Build History中看到对应的任务日志 点击任务列表,在进入的页面左侧,点击命令行输出,即可即可看到运行日志
最后,可以在目标服务器上查看具体的编译成果,以及具体的docker镜像和容器是否生成以及运行正常