当前位置:   article > 正文

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

jenkins pipeline部署

        之前看了很多博主写的文章,都是要先去操作系统配置、全局工具配置、安装插件等等,其实新版本的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 root@xxx.xxx.xxx.xxx), 我们这里的Docker主机就是Jenkins的宿主机:

我这里的提示是因为我已经上传过了,提示我已经存在,告诉我如果要替换用-f参数强制替换。

4.测试是否可以免密登录,第一次的时候是需要输入密码的:

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

五、清理垃圾镜像

 在多次打包镜像后,由于我们都是用的latest标签,那么前一次打包的镜像的标签就会被替换为None,所以我们需要清理掉这些没有标签的镜像,清理在最后一步来执行是因为有时候会报错,在没有None标签的镜像时会报错。Jenkins上就会看到发布失败的状态,其实我们主要发布工作已经做完了,当看到是最后一步失败时,那么我们可以认为认定已经发布成功,当然这只是目前的解决方案,也许会有更好的方案。

下面是完整Pipeline脚本代码(注意IP地址要替换为自己的哦):

  1. pipeline {
  2. agent any
  3. stages {
  4. stage('Build Image') {
  5. steps {
  6. echo '-------------------拉取GitHub代码----------------------'
  7. git credentialsId: '0e1a029a-ec69-4252-b424-44161e23f73c', url: 'git@github.com:LYD2015/TinyUrlApi.git'
  8. echo '-------------------生成Docker镜像----------------------'
  9. sh 'docker build -t qq418181574/tinyurl-api:latest .'
  10. }
  11. }
  12. stage('Push Image') {
  13. steps {
  14. echo '-------------------推送Docker镜像到Docker公共镜像库----------------------'
  15. sh 'docker push qq418181574/tinyurl-api:latest'
  16. }
  17. }
  18. stage('SSH Pull Image') {
  19. steps {
  20. echo '----------------------远程:拉取镜像----------------------'
  21. sh 'ssh root@xxx.xxx.xxx.xxx docker pull qq418181574/tinyurl-api:latest'
  22. }
  23. }
  24. stage('SSH Reload Container') {
  25. steps {
  26. echo '----------------------远程:删除容器----------------------'
  27. sh 'ssh root@xxx.xxx.xxx.xxx docker rm -f TinyUrl-Api'
  28. echo '----------------------远程:启动容器----------------------'
  29. sh 'ssh root@xxx.xxx.xxx.xxx docker run -d -p 81:80 --restart=always --name TinyUrl-Api qq418181574/tinyurl-api:latest'
  30. }
  31. }
  32. stage('Clear None Image') {
  33. steps {
  34. echo '----------------------删除Tag为<none>的Docker镜像----------------------'
  35. sh 'docker rmi $(docker images -f "dangling=true" -q)'
  36. }
  37. }
  38. }
  39. }

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

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/492178
推荐阅读
相关标签
  

闽ICP备14008679号