Jenkins 是一款开源的持续集成(DI)工具,广泛用于项目开发,能提供自动构建,测试,部署等功能。作为领先的开源自动化服务器,Jenkins 提供了数百个插件来支持构建、部署和自动化任何项目。
这里主要介绍如何使用docker安装Jenkins,以及如何通过Jenkins pipeline实现自动化部署。
直接下载最新的docker镜像安装即可,
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
这里需要注意几点:
查看Jenkins的日志:
docker logs myjenkins
重启容器可以使用:
docker stop 容器ID
docker start 容器ID
在浏览器访问http://jenkins所在主机ip:8080,等待后出现如下界面,需要输入密码。
可以查看宿主机/usr/local/jenkins/secrets/initialAdminPassword
文件获取密码。
cat /usr/local/jenkins/secrets/initialAdminPassword
或者进入容器,查看/var/jenkins_home/secrets/initialAdminPassword
文件获取密码。
# 进入容器
docker exec -it 容器ID /bin/bash
# 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword
输入密码后,出现如下界面,任选一种方式均可。
打开宿主机 Jenkins 工作目录下的hudson.model.UpdateCenter.xml文件。
原始内容如下:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
url 修改为国内的清华大学官方镜像地址,最终内容如下:
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
</site>
</sites>
重启 Jenkins 服务。
2. 使用Jenkins Pipeline部署Docker程序
为了使Jenkins能够push docker image到dockerhub,必须配置对应的authentication token。可以直接在https://hub.docker.com/settings/security 登录后添加token即可,然后把token配置到Jenkins中,具体路径如下,选择类型为username/password。
在Jenkins用户下,生成一对ssh key,将公钥放到github,私钥配置到上面docker token同样的位置即可。这样在job中可以使用ssh从github clone code。注意如果首次连接提示
No ECDSA host key is known for github.houston.softwaregrp.net and you have requested strict checking.
可以采用下面的方法解决:
如果在Jenkins Pipeline中需要ssh到远程server,需要配置下ssh key,把生成好的public key放到远端server的authorized keys里面就行了。
安装Pipeline(https://plugins.jenkins.io/workflow-aggregator/)和stage view(https://plugins.jenkins.io/pipeline-stage-view/)插件。
安装好上述插件之后,新建一个Jenkins的pipeline Job,可以把所需要的Jenkinsfile放在项目的根目录下,这样就可以通过下面的选项来新建Pipeline Job了。关于Pipeline的更多内容,参考https://www.jenkins.io/zh/doc/book/pipeline/。
下面是一个pipeline的sample,里面包含4个步骤:
pipeline {
agent any
tools {
maven 'maven-3.6.3'
}
environment {
DATE = new Date().format('yy.M')
TAG = "${DATE}.${BUILD_NUMBER}"
}
stages {
stage ('Maven Build') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Docker Build') {
steps {
script {
docker.build("king/my-work:${TAG}", "-f ./some/path/to/Dockerfile .")
}
}
}
stage('Pushing Docker Image to Dockerhub') {
steps {
script {
docker.withRegistry('https://registry.hub.docker.com', 'DOCKER_CREDENTIAL') {
docker.image("king/my-work:${TAG}:${TAG}").push()
docker.image("king/my-work:${TAG}:${TAG}").push("latest")
}
}
}
}
stage('Deploy'){
steps {
sh 'scp -P some_port -r my_deploy user@111.111.111.111:test'
sh 'ssh user@222.222.222.222 "cd my_deploy && docker-compose up -d"'
}
}
}
}
docker exec --user root -it jenkins bash