Jenkins自动化部署(三)流水线脚本-pipeline(多图)

        之前看了很多博主写的文章,都是要先去操作系统配置、全局工具配置、安装插件等等,其实新版本的jenkins在第一次登陆时选择的推荐插件中,已经把我们常用的都安装好了,目前以我的需求不需要去配置那些东西了,我拉取代码是在github上,使用git插件就可以了,打包docker镜像也是把当前Jenkins的docker服务挂载到宿主机的docker服务上,使用的是宿主机上的docker服务来打包镜像,所以其他那些插件一个都用不上。

一、建立pipeline任务/流水线任务(提示:下方多图操作,按顺序仔细看)

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第1张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第2张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第3张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第4张图片

 

我目前只需要五个阶段就完成了,如上图所示,每个阶段的代码我会在下面一步一步来。

完整Pipeline脚本代码会在本文最后贴出来。

二、拉取代码,并生成docker镜像。 

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第5张图片

 

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第6张图片

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第7张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第8张图片

 登录到GitHub源代码仓库,去配置密钥,其他源代码仓库大同小异。Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第9张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第10张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第11张图片

登录到物理主机,也就是jenkins安装的宿主机上(输入命令:ssh-keygen -t rsa),生成密钥对,会自动生成到root/.ssh目录,是个隐藏目录: 

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第12张图片

 找到生成的密钥:Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第13张图片

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第14张图片

 到此GitHub上就操作完成了,然后回到jenkins的宿主机上查看私钥,把私钥复制到Jenkins的凭证添加中:

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第15张图片

 Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第16张图片

此时凭证就添加完成了,后期需要管理凭证也可以在jenkins的系统管理-ManageCredentials中去修改删除或者添加:

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第17张图片

接着干活,回到流水线语法那里: 

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第18张图片

 ​​​​​​​Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第19张图片

 

在第一个阶段Build Image中有几个坑点:

1.拉取代码和打包Docker镜像需要在同一个阶段,不然会出现工作目录不一致的问题,在打包Docker镜像时找不到文件。具体的原因还没有去分析,工作目录能否指定之类的都还不知道。

2.生成镜像时的命名是有格式的,不然推送不到Docker仓库中,命名规范:DockerHub账号名/镜像名:Tag

3.生成镜像时镜像名称只能小写。

还有,注意生成Docker镜像的那条命令,因为我的源代码中是有dockerfile文件的,所以我这里的命令是以当前目录下的dockerfile文件来生成镜像(也就是拉取代码的工作空间)。

如果你的环境跟我不一样,可以看我上一篇文章:Jenkins自动化部署(二)在Docker中安装Jenkins

如果你的环境跟我差不多,那么在这流水线任务的Pipeline脚本中使用Docker命令是可以的。

三、推送镜像

原本我的Jenkins是使用的宿主机的Docker服务,那么生成的镜像是可以直接使用的,但是万一以后我们的jenkins和业务服务不是在同一个物理机上呢,所以还是要学习一下,先把镜像推送到仓库中,再拉取下来。

既然能用Docker命令了,那么直接用Docker命令把镜像推到自己的DockerHub账号下:

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第20张图片

 

坑点:pipeline脚本推送docker镜像到dockerhub公共仓库时,需要在jenkins容器中登录一次私有帐户,如下图:

 登录一次就会记住你的登录信息,上图红框处提示你登录密码储存的位置,不加密储存的。

四、远程重启业务容器

        原本我的Jenkins是使用的宿主机的Docker服务,jenkins,那么生成的镜像是可以直接使用的,但是万一以后我们的jenkins不是在宿主机上的呢,所以还是要学习一下,先把镜像推送到仓库中,再拉取下来。

        这里我们采用的方式是使用ssh远程执行服务器的docker命令:

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第21张图片

 

 此时,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自动化部署(三)流水线脚本-pipeline(多图)_第22张图片

返回目录了,到这里就可以免密登录,也就可以在Jenkins中使用ssh远程在物理使用docker命令了。

五、清理垃圾镜像

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第23张图片

 在多次打包镜像后,由于我们都是用的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)'
            }
        }
    }
}

保存后就可以点击立即构建试试:

Jenkins自动化部署(三)流水线脚本-pipeline(多图)_第24张图片

从上图可以看出,我在学习的时候也尝试了39次,在第40次构建的时候才成功了。

所以总结一下,如果按照以上方式没能正常配置成功,那么再检查简称,看有没有遗漏的地方,或者在多方查查资料,多尝试。总之“没有解决不了的问题,如果有,只是方法不对,换个方法试试” 

下一章,如何实现提交代码到GetHub后自动触发Jenkins开始任务。

你可能感兴趣的:(Jenkins自动化部署,docker,jenkins)