Docker+Jenkins+Git 实现企业持续集成持续部署(CI/CD)

2021年04月20日 20:39 · 阅读(290) ·

开发环境

名称 版本
操作系统 Windows 10 X64
VMware® Workstation 12 Pro 12.0.0 build-2985596
CentOS7 CentOS Linux release 7.8.2003 (Core)
Linux 3.10.0-1127.el7.x86_64
Docker 20.10.3
Jenkins 2.277.2

Linux 虚拟机 IP 地址:192.168.114.128

参考

超经典Jenkins持续集成实战教程全套完整版-从入门到精通基于—-Docker+Jenkins+Git 实现企业持续集成持续部署(CI/CD)(附配套资料)

基础知识

Docker

Docker 安装 Jenkins

1.启动 Docker systemctl start docker

2.Docker 安装 Jenkins docker pull jenkins/jenkins:lts

安装结果

  1. [root@luoma ~]# docker pull jenkins/jenkins:lts
  2. lts: Pulling from jenkins/jenkins
  3. 8bf9c589d5f9: Pull complete
  4. 55448245185e: Pull complete
  5. d612b158a50b: Pull complete
  6. 81c43ecd1455: Pull complete
  7. 11f624f029b2: Pull complete
  8. 420490847adf: Pull complete
  9. ab7db5c7d2ea: Pull complete
  10. dcd476f2bb85: Pull complete
  11. aabd5985178b: Pull complete
  12. 7cf8dd3cd486: Pull complete
  13. 8406d8ed75b7: Pull complete
  14. 0bbc8ff970c5: Pull complete
  15. ab545a10ec8e: Pull complete
  16. b699a1cf1f24: Pull complete
  17. 99671587bdd8: Pull complete
  18. 4437498ce877: Pull complete
  19. Digest: sha256:cd9ea4c94adf795cd433109071cf3b177b357f8df4b69b8951e52d251af18749
  20. Status: Downloaded newer image for jenkins/jenkins:lts
  21. docker.io/jenkins/jenkins:lts

3.创建 Jenkins 文件夹 mkdir -p /mydata/jekins_home

4.文件夹授权 chown -R 1000 /mydata/jenkins_home/

5.启动 Jenkins

  1. docker run -di --name=jenkins -p 8080:8080 -v /mydata/jenkins_home/:/var/jenkins_home jenkins/jenkins:lts

启动结果

  1. [root@luoma ~]# docker run -di --name=jenkins -p 8080:8080 -v /mydata/jenkins_home/:/var/jenkins_home jenkins/jenkins:lts
  2. 4b4f416a057e95dc9c5aef8000d56f698276c53a8e6da63ec749fd044b109c82

6.访问 http://192.168.114.128:8080/

出现下面界面,启动成功,页面显示正在初始化

7.查看 Jenkins 版本

  1. docker images

得到 Image ID d457516b229f

  1. REPOSITORY TAG IMAGE ID CREATED SIZE
  2. jenkins/jenkins lts d457516b229f 13 days ago 571MB

查看容器详细信息 docker inspect d457516b229f

在结果中找到对应的信息 "JENKINS_VERSION=2.277.2"

Jenkins 配置

访问 http://192.168.114.128:8080/

出现下面界面,启动成功,页面显示正在初始化,这个操作是联网的,所以需要等待一段时间

解锁 Jenkins

等待一段时间后,出现下面的界面

根据页面提示,获取密码 cat /mydata/jenkins_home/secrets/initialAdminPassword

密码为:96dbbcbc4b9346b6999b77f44f07f493

继续

自定义 Jenkins 和安装插件

选择 安装推荐的插件

开始安装插件

如果安装失败,重试就行,实在不行就继续,因为插件可以后面再安装

创建账户,登录

到登录界面,填写用户名密码,使用admin账户继续

实例配置,这里使用默认的即可 http://192.168.114.128:8080/

保存并完成

开始使用Jenkins

插件安装

这里安装一个 SSH 插件,搜索 SSH,直接安装

安装完成

配置 JDK 和 Maven

1.配置 JDK

输入别名,选择 JDK 版本(如果要配置多个,可以点击新增安装继续安装 )

这里有一个警告,点击之后需要输入 Oracle 账号密码,点击

账号:2696671285@qq.com
密码:Oracle123

OK 之后,出现一个关闭按钮,关闭即可

2.配置 Maven

点击新增 Maven(可以配置多个)

JDK 和 Maven 都配置好之后,点击保存

添加凭据

配置 SSH

点击保存即可

Docker 测试项目

Docker 测试项目

Docker 测试项目上传到 gitee

这里获得 Git 地址 https://gitee.com/luoma_haowei/jenkins-demo.git

创建运行脚本并授权

vi /usr/local/jenkins/jenkins.sh

内容如下

  1. app_name='jenkinsdemo'
  2. docker stop ${app_name}
  3. echo '----stop container----'
  4. docker rm ${app_name}
  5. echo '----rm container----'
  6. #-d 后台运行容器,并返回容器 ID,也即启动守护式容器
  7. #-i 以交互模式运行容器,通常与 -t 同时使用
  8. #--name=”容器新名字” 为容器指定一个名称
  9. #-p 指定端口映射,有以下四种格式 hostPort:containerPort
  10. #镜像名称 wlf/${app_name}:1.0-SNAPSHOT
  11. docker run -di --name=${app_name} -p 7070:8080 wlf/${app_name}:1.0-SNAPSHOT
  12. echo '----start container----'

给 .sh 脚本添加可执行权限

  1. chmod +x ./jenkins.sh

部署应用

1.修改 settings.xml

  1. vi /mydata/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/Maven3.6.2/conf/settings.xml

在标签 </mirrors> 上添加下面内容

  1. <mirror>
  2. <id>alimaven</id>
  3. <name>aliyun maven</name>
  4. <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
  5. </mirror>

2.在 Jenkins 中创建执行任务

设置任务名称后选择构建一个自由风格的软件项目

然后在源码管理中添加我们的git仓库地址:https://gitee.com/luoma_haowei/jenkins-demo.git

提示需要账号密码

已经可以正常连接 git 仓库了

之后我们需要添加一个构建,选择调用顶层 maven 目标,该构建主要用于把我们的源码打包成 Docker 镜像并上传到我们的 Docker 镜像仓库去

选择我们的 maven 版本,然后设置 maven 命令和指定 pom 文件位置

之后添加一个执行远程 shell 脚本的构建,用于在我们的镜像打包完成后执行启动 Docker 容器的 .sh 脚本

需要设置执行的 shell 命令如下:/usr/local/Jenkins/jenkins.sh

之后点击保存操作,我们的任务就创建完成了,在任务列表中我们可以点击运行来执行该任务

3.执行任务

在任务列表中我们可以点击运行来执行该任务

以通过控制台输出来查看整个任务的执行过程

运行结果

  1. 控制台输出
  2. Started by user admin
  3. Running as SYSTEM
  4. Building in workspace /var/jenkins_home/workspace/jenkins-test
  5. The recommended git tool is: NONE
  6. using credential gitee
  7. > git rev-parse --resolve-git-dir /var/jenkins_home/workspace/jenkins-test/.git # timeout=10
  8. Fetching changes from the remote Git repository
  9. > git config remote.origin.url https://gitee.com/luoma_haowei/jenkins-demo.git # timeout=10
  10. Fetching upstream changes from https://gitee.com/luoma_haowei/jenkins-demo.git
  11. > git --version # timeout=10
  12. > git --version # 'git version 2.20.1'
  13. using GIT_ASKPASS to set credentials gitee 账号密码
  14. > git fetch --tags --force --progress -- https://gitee.com/luoma_haowei/jenkins-demo.git +refs/heads/*:refs/remotes/origin/* # timeout=10
  15. > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
  16. Checking out Revision d9ab764fe82bb8cd118095c6d391563eb48b0f33 (refs/remotes/origin/master)
  17. > git config core.sparsecheckout # timeout=10
  18. > git checkout -f d9ab764fe82bb8cd118095c6d391563eb48b0f33 # timeout=10
  19. Commit message: "update pom.xml."
  20. > git rev-list --no-walk d9ab764fe82bb8cd118095c6d391563eb48b0f33 # timeout=10
  21. [jenkins-test] $ /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/Maven3.6.2/bin/mvn -f pom.xml clean package
  22. [WARNING]
  23. [WARNING] Some problems were encountered while building the effective settings
  24. [WARNING] Unrecognised tag: 'mirror' (position: START_TAG seen ...</servers>\n\n\t<mirror>... @135:10) @ /var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/Maven3.6.2/conf/settings.xml, line 135, column 10
  25. [WARNING]
  26. [INFO] Scanning for projects...
  27. [INFO]
  28. [INFO] --------------------< com.jenkins.demo:jenkinsdemo >--------------------
  29. [INFO] Building jenkinsdemo 1.0-SNAPSHOT
  30. [INFO] --------------------------------[ jar ]---------------------------------
  31. [INFO]
  32. [INFO] --- maven-clean-plugin:2.6.1:clean (default-clean) @ jenkinsdemo ---
  33. [INFO] Deleting /var/jenkins_home/workspace/jenkins-test/target
  34. [INFO]
  35. [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jenkinsdemo ---
  36. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  37. [INFO] skip non existing resourceDirectory /var/jenkins_home/workspace/jenkins-test/src/main/resources
  38. [INFO] skip non existing resourceDirectory /var/jenkins_home/workspace/jenkins-test/src/main/resources
  39. [INFO]
  40. [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ jenkinsdemo ---
  41. [INFO] Changes detected - recompiling the module!
  42. [INFO] Compiling 2 source files to /var/jenkins_home/workspace/jenkins-test/target/classes
  43. [INFO]
  44. [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ jenkinsdemo ---
  45. [INFO] Using 'UTF-8' encoding to copy filtered resources.
  46. [INFO] skip non existing resourceDirectory /var/jenkins_home/workspace/jenkins-test/src/test/resources
  47. [INFO]
  48. [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ jenkinsdemo ---
  49. [INFO] No sources to compile
  50. [INFO]
  51. [INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ jenkinsdemo ---
  52. [INFO] No tests to run.
  53. [INFO]
  54. [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ jenkinsdemo ---
  55. [INFO] Building jar: /var/jenkins_home/workspace/jenkins-test/target/jenkinsdemo-1.0-SNAPSHOT.jar
  56. [INFO]
  57. [INFO] --- spring-boot-maven-plugin:1.5.6.RELEASE:repackage (default) @ jenkinsdemo ---
  58. [INFO]
  59. [INFO] --- docker-maven-plugin:1.1.0:build (build-image) @ jenkinsdemo ---
  60. [INFO] Using authentication suppliers: [ConfigFileRegistryAuthSupplier]
  61. [INFO] Copying /var/jenkins_home/workspace/jenkins-test/target/jenkinsdemo-1.0-SNAPSHOT.jar -> /var/jenkins_home/workspace/jenkins-test/target/docker/jenkinsdemo-1.0-SNAPSHOT.jar
  62. [INFO] Building image wlf/jenkinsdemo:1.0-SNAPSHOT
  63. Step 1/3 : FROM java:8
  64. ---> d23bdf5b1b1b
  65. Step 2/3 : ADD /jenkinsdemo-1.0-SNAPSHOT.jar //
  66. ---> 0d1eef4e485d
  67. Step 3/3 : ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod","/jenkinsdemo-1.0-SNAPSHOT.jar"]
  68. ---> Running in eca203ba1fbc
  69. Removing intermediate container eca203ba1fbc
  70. ---> dbcbd18d8b6a
  71. ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
  72. Successfully built dbcbd18d8b6a
  73. Successfully tagged wlf/jenkinsdemo:1.0-SNAPSHOT
  74. [INFO] Built wlf/jenkinsdemo:1.0-SNAPSHOT
  75. [INFO] ------------------------------------------------------------------------
  76. [INFO] BUILD SUCCESS
  77. [INFO] ------------------------------------------------------------------------
  78. [INFO] Total time: 36.306 s
  79. [INFO] Finished at: 2021-04-24T06:47:25Z
  80. [INFO] ------------------------------------------------------------------------
  81. [SSH] script:
  82. /usr/local/jenkins/jenkins.sh
  83. [SSH] executing...
  84. jenkinsdemo
  85. ----stop container----
  86. jenkinsdemo
  87. ----rm container----
  88. 054cbc95057b4cde9cf0ddcc6b6d8646d93357de7d5f16387db5902aff9ecefe
  89. ----start container----
  90. [SSH] completed
  91. [SSH] exit-status: 0
  92. Finished: SUCCESS

4.测试

运行成功,先查看 Docker 镜像状态 docker ps -a

浏览器访问 http://192.168.114.128:7070/jenkins