Jenkins 是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目。
这里主要介绍如何使用docker安装Jenkins,以及如何通过Jenkins pipeline实现自动化部署。
1. 安装Jenkins
直接下载最新的docker镜像安装即可,
1 | docker run -p 8080:8080 -p 50000:50000 -d -v /var/run/docker.sock:/var/run/docker.sock -v jenkins_home:/var/jenkins_home my-jenkins-jdk11 |
这里需要注意几点:
需要将宿主机的/var/run/docker.sock映射到容器中,这样在容器内只要向/var/run/docker.sock发送http请求就能和Docker Daemon通信了,如果容器内有docker文件,那么在容器内执行docker ps、docker port这些命令,和在宿主机上执行的效果是一样的,因为容器内和宿主机上的docker文件虽然不同,但是他们的请求发往的是同一个Docker Daemon;可以参考https://blog.csdn.net/boling_cavalry/article/details/92846483
将容器内目录挂载到宿主机的目录,这样我们可以在宿主机上对文件的修改同步到容器内。
基本操作
查看Jenkins的日志:
1 | docker logs myjenkins |
重启容器可以使用:
1 | docker stop 容器ID |
登录初始化Jenkins
在浏览器访问http://jenkins所在主机ip:8080,等待后出现如下界面,需要输入密码。
可以查看宿主机/usr/local/jenkins/secrets/initialAdminPassword
文件获取密码。
1 | cat /usr/local/jenkins/secrets/initialAdminPassword |
或者进入容器,查看/var/jenkins_home/secrets/initialAdminPassword
文件获取密码。
1 | # 进入容器 |
输入密码后,出现如下界面,任选一种方式均可。
配置镜像加速
打开宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml文件。
原始内容如下:
1 | <?xml version='1.1' encoding='UTF-8'?> |
url 修改为国内的清华大学官方镜像地址,最终内容如下:
1 | <?xml version='1.1' encoding='UTF-8'?> |
重启 Jenkins 服务。
配置JDK Maven
可以参考博客:https://developer.aliyun.com/article/892646
2. 使用Jenkins Pipeline部署Docker程序
密钥配置
配置Docker Token
为了使Jenkins能够push docker image到dockerhub,必须配置对应的authentication token。可以直接在https://hub.docker.com/settings/security 登录后添加token即可,然后把token配置到Jenkins中,具体路径如下,选择类型为username/password。
配置Github SSH key
在Jenkins用户下,生成一对ssh key,将公钥放到github,私钥配置到上面docker token同样的位置即可。这样在job中可以使用ssh从github clone code。注意如果首次连接提示
1 | No ECDSA host key is known for github.houston.softwaregrp.net and you have requested strict checking. |
可以采用下面的方法解决:
配置SSH登录
如果在Jenkins Pipeline中需要ssh到远程server,需要配置下ssh key,把生成好的public key放到远端server的authorized keys里面就行了。
Jenkins Pipeline
安装插件
安装Pipeline(https://plugins.jenkins.io/workflow-aggregator/)和stage view(https://plugins.jenkins.io/pipeline-stage-view/)插件。
新建Pipeline Job
安装好上述插件之后,新建一个Jenkins的pipeline Job,可以把所需要的Jenkinsfile放在项目的根目录下,这样就可以通过下面的选项来新建Pipeline Job了。关于Pipeline的更多内容,参考https://www.jenkins.io/zh/doc/book/pipeline/。
定义好Pipeline并上传至Github
下面是一个pipeline的sample,里面包含4个步骤:
- Maven Build:下载并且build整个maven project。
- Docker Build:根据指定的Dockerfile build docker image。
- Push Docker images:上传docker images。DOCKER_CREDENTIAL是前面指定的docker token的ID。
- Deploy:这一步ssh到server上进行部署。
1 | pipeline { |
可能碰到的问题
- dockerbuild的权限问题:因为容器内外共享的同一套docker socket,就算在容器内部将Jenkins用户加到docker的group,还是会有权限问题。因为内部的jenkins用户并不在外部的docker group里面,因此需要手动将内外的docker group id进行同步。具体做法参考下面的stackoverflow回答:https://stackoverflow.com/questions/47854463/docker-got-permission-denied-while-trying-to-connect-to-the-docker-daemon-socke
- 在docker容器中安装程序的问题:因为默认的jenkins用户没有权限安装程序, 可以使用root用户进入到docker container中进行安装。
docker exec --user root -it jenkins bash
参考:
- https://developer.aliyun.com/article/892646
- https://medium.com/swlh/jenkins-pipeline-to-create-docker-image-and-push-to-docker-hub-721919512f2
- https://medium.com/codex/how-to-push-a-docker-image-to-docker-hub-using-jenkins-487fb1fcbe25
搜索『后端精进之路』关注公众号,立刻获取最新文章和价值2000元的BATJ精品面试课程。