之前看了很多博主写的文章,都是要先去操作系统配置、全局工具配置、安装插件等等,其实新版本的jenkins在第一次登陆时选择的推荐插件中,已经把我们常用的都安装好了,目前以我的需求不需要去配置那些东西了,我拉取代码是在github上,使用git插件就可以了,打包docker镜像也是把当前Jenkins的docker服务挂载到宿主机的docker服务上,使用的是宿主机上的docker服务来打包镜像,所以其他那些插件一个都用不上。
一、建立pipeline任务/流水线任务(提示:下方多图操作,按顺序仔细看)
我目前只需要五个阶段就完成了,如上图所示,每个阶段的代码我会在下面一步一步来。
完整Pipeline脚本代码会在本文最后贴出来。
二、拉取代码,并生成docker镜像。
登录到GitHub源代码仓库,去配置密钥,其他源代码仓库大同小异。
登录到物理主机,也就是jenkins安装的宿主机上(输入命令:ssh-keygen -t rsa),生成密钥对,会自动生成到root/.ssh目录,是个隐藏目录:
到此GitHub上就操作完成了,然后回到jenkins的宿主机上查看私钥,把私钥复制到Jenkins的凭证添加中:
此时凭证就添加完成了,后期需要管理凭证也可以在jenkins的系统管理-ManageCredentials中去修改删除或者添加:
接着干活,回到流水线语法那里:
在第一个阶段Build Image中有几个坑点:
1.拉取代码和打包Docker镜像需要在同一个阶段,不然会出现工作目录不一致的问题,在打包Docker镜像时找不到文件。具体的原因还没有去分析,工作目录能否指定之类的都还不知道。
2.生成镜像时的命名是有格式的,不然推送不到Docker仓库中,命名规范:DockerHub账号名/镜像名:Tag
3.生成镜像时镜像名称只能小写。
还有,注意生成Docker镜像的那条命令,因为我的源代码中是有dockerfile文件的,所以我这里的命令是以当前目录下的dockerfile文件来生成镜像(也就是拉取代码的工作空间)。
如果你的环境跟我不一样,可以看我上一篇文章:Jenkins自动化部署(二)在Docker中安装Jenkins
如果你的环境跟我差不多,那么在这流水线任务的Pipeline脚本中使用Docker命令是可以的。
三、推送镜像
原本我的Jenkins是使用的宿主机的Docker服务,那么生成的镜像是可以直接使用的,但是万一以后我们的jenkins和业务服务不是在同一个物理机上呢,所以还是要学习一下,先把镜像推送到仓库中,再拉取下来。
既然能用Docker命令了,那么直接用Docker命令把镜像推到自己的DockerHub账号下:
坑点:pipeline脚本推送docker镜像到dockerhub公共仓库时,需要在jenkins容器中登录一次私有帐户,如下图:
登录一次就会记住你的登录信息,上图红框处提示你登录密码储存的位置,不加密储存的。
四、远程重启业务容器
原本我的Jenkins是使用的宿主机的Docker服务,jenkins,那么生成的镜像是可以直接使用的,但是万一以后我们的jenkins不是在宿主机上的呢,所以还是要学习一下,先把镜像推送到仓库中,再拉取下来。
这里我们采用的方式是使用ssh远程执行服务器的docker命令:
此时,ssh命令是没有权限的,我们还需要设置无密码访问。
1.在Jenkins容器中生成密钥对:
进入容器后(方法已经有多了,自行解决),使用命令ssh-keygen -t rsa生成密钥对,同刚才在宿主机上生成密钥对的方法一样。
2.查看密钥对:
3.把公钥上传到Docker主机(ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]), 我们这里的Docker主机就是Jenkins的宿主机:
我这里的提示是因为我已经上传过了,提示我已经存在,告诉我如果要替换用-f参数强制替换。
4.测试是否可以免密登录,第一次的时候是需要输入密码的:
返回目录了,到这里就可以免密登录,也就可以在Jenkins中使用ssh远程在物理使用docker命令了。
五、清理垃圾镜像
在多次打包镜像后,由于我们都是用的latest标签,那么前一次打包的镜像的标签就会被替换为None,所以我们需要清理掉这些没有标签的镜像,拿到最有一步来执行时因为有时候没有为None标签的镜像,这是会报错,Jenkins上会看到时发布失败的状态,其实我们主要发布工作已经做完了,看到这种状态我们可以认为判断,当然这只是目前的解决方案,更好的方案还不知道呢。
下面是完整Pipeline脚本代码(注意IP地址要替换为自己的哦):
pipeline {
agent any
stages {
stage('Build Image') {
steps {
echo '-------------------拉取GitHub代码----------------------'
git credentialsId: '0e1a029a-ec69-4252-b424-44161e23f73c', url: '[email protected]:LYD2015/TinyUrlApi.git'
echo '-------------------生成Docker镜像----------------------'
sh 'docker build -t qq418181574/tinyurl-api:latest .'
}
}
stage('Push Image') {
steps {
echo '-------------------推送Docker镜像到Docker公共镜像库----------------------'
sh 'docker push qq418181574/tinyurl-api:latest'
}
}
stage('SSH Pull Image') {
steps {
echo '----------------------远程:拉取镜像----------------------'
sh 'ssh [email protected] docker pull qq418181574/tinyurl-api:latest'
}
}
stage('SSH Reload Container') {
steps {
echo '----------------------远程:删除容器----------------------'
sh 'ssh [email protected] docker rm -f TinyUrl-Api'
echo '----------------------远程:启动容器----------------------'
sh 'ssh [email protected] docker run -d -p 81:80 --restart=always --name TinyUrl-Api qq418181574/tinyurl-api:latest'
}
}
stage('Clear None Image') {
steps {
echo '----------------------删除Tag为的Docker镜像----------------------'
sh 'docker rmi $(docker images -f "dangling=true" -q)'
}
}
}
}
保存后就可以点击立即构建试试:
从上图可以看出,我在学习的时候也尝试了39次,在第40次构建的时候才成功了。
所以总结一下,如果按照以上方式没能正常配置成功,那么再检查简称,看有没有遗漏的地方,或者在多方查查资料,多尝试。总之“没有解决不了的问题,如果有,只是方法不对,换个方法试试”
下一章,如何实现提交代码到GetHub后自动触发Jenkins开始任务。