项目作者: AvengerEug

项目描述 :
java-backend集成jenkins完成各模块的build操作
高级语言:
项目地址: git://github.com/AvengerEug/jenkins-java-backend.git
创建时间: 2019-07-09T05:35:33Z
项目社区:https://github.com/AvengerEug/jenkins-java-backend

开源协议:

下载


  1. java-backend project 集成jenkins multijob插件完成串并行自动化部署

一、自行集成multijob、参数化build插件搭建jenkins步骤

  1. clone本项目
  2. 运行本项目中的jenkins.war(版本号: 2.176.1)包或者自行下载最新(注意: 使用root用户和普通user用户run的jenkins的workspace位置不一致)
    具体不一致可参考, 运行命令 java -jar jenkins.war —httpPort=8050
  3. 访问localhost:8050按照页面指导设置用户名和密码, 选择Install suggested plugins安装jenkins建议的插件。
  4. 安装multijob插件
    登录jenkins首页 -> Manage Jenkins -> Manage Plugins -> Availiable -> 搜索multijob -> 勾选并选择Download without start。 确认有无下载成功
    可查看jenkins控制台的log信息(使用nohup的方式启动或者无后台方式启动可查看到控制台信息)或者查看后台启动时指定重定向的log文件。
  5. 安装Extended Choice Parameter和Github插件(支持job参数化构建),步骤同第四步
  6. 创建multijob, 配置各job之间的依赖关系(串并行), 其中若有需要拉取git代码, 则还需要在job配置git的用户名和密码, 操作详情可自己百度。
  7. 运行job

    ----------------------------------------------------

    二、mock一个case

  • 背景如下

    1. clone java-backend项目之后会发现, 项目中的dynamic-proxy-adapter模块项目是会依赖与lib-common project的,
    2. 所以打包前必须要先将lib-common install至本地仓库, 再打dynamic-proxy-adapter模块jar包, 这样才能在本地仓库中
    3. 找到lib-common包完成依赖关系
  • 解决方案

    1. multijob插件的作用就是解决上述情况, 它可以设置job之间的执行方式(串并行)和触发机制

    三、使用已搭建好的环境运行上述case步骤

  • 前置环境条件

    1. linux
    2. jdk1.8
    3. maven
    4. 只提供job的folder, 需要自己将job拷贝至jenkins workspace目录下, 具体目录可参考
      随后执行 Manage Jenkins -> Reload Configuration from Disk
  • 执行步骤

    1. 输入自己定义的用户名和密码进入jenkins, 选择start-dynamic-proxy-adapter job, 点击build with paremeter, 设置参数BRANCH=jenkins-for-dynamic-proxy 点击build
    2. build成功后, 访问: localhost:8082/v1/test/sync-user

四、注意点

  1. 若项目时采取微服务架构, 所以可能存在多job同时运行的情况, 为了不增加机器的压力, 或者以后项目docker化时需要push镜像至远程
    的网络延迟问题时, 可以设置multijob最大的运行数.
    jenkins首页 -> Manage Jenkins -> Configure System -> Maven Project Configuration -> of executors -> 自己配置自定义数字

  2. 若jenkins打包maven项目时,提示 mvn命令找不到,则可以将mvn命令软连接到 /usr/bin目录下,此目录下的命令是所有用户都可以使用的。但在jenkins中执行mvn -version时,会报如下错

    1. Error: Could not find or load main class org.codehaus.plexus.classworlds.launcher.Launcher

    解决方案是: 直接把mvn命令的全路径加上, eg: /usr/local/maven/bin/mvn -version 。或者在执行命令前执行source /etc/profile命令,保证当前终端能使用上环境变量

五、若想自定义jenkins的主题颜色, 可查看以下链接

  • https://github.com/afonsof/jenkins-material-theme#installation
    步骤很详细, 但注意替换颜色后的css的url路径为:
    http://afonsof.com/jenkins-material-theme/dist/material-{{your-color-name}}.css

    eg: 使用蓝色的样式: http://afonsof.com/jenkins-material-theme/dist/material-light-blue.css

  • 而不是上述url中内容所说的:
    https://cdn.rawgit.com/afonsof/jenkins-material-theme/gh-pages/dist/material-{{your-color-name}}.css

    六、Jenkins镜像化

  • 此镜像包含multijob、Extended Choice Parameter插件,可使用项目中提供的jobs.tar.gz压缩包来实现上述说的case,包含了传递参数、按顺序build的特性。内部安装了git, jdk, maven ssh等软件,支持日常工作部署需要。若jenkins需要将项目虚拟化(docker), 后续可以为镜像中安装docker环境。

  • 如何使用案例

    1. 1. 将工作目录下的jobs.tar.gz解压到/root下, tar -zxvf jobs.tar.gz -c /root
    2. 此时root目录下会多出一个jobs的文件夹,
    3. 2. 然后拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/avengereug/jenkins:v2
    4. 3. 启动镜像: docker run --name jenkins -it -d -v /root/jobs:/root/.jenkins/jobs --network host registry.cn-hangzhou.aliyuncs.com/avengereug/jenkins:v2
    5. (若需要将本地的maven仓库挂载可以添加参数: -v 宿主机maven仓库repository目录:/root/.m2/repository)
    6. 4. 访问jenkins: http://ip:8050
    7. 5. 使用root/root登录
    8. 6. 点击start-dynamic-proxy-adapter
    9. 7. 点击左侧build with parameters, 分支名改成: jenkins-for-dynamic-proxy
    10. 8. 点击启动
    11. 注意:
    12. 1. 当再次重新走CI流程时,名为local-dynamic-proxy-adapterjob会报错,原因是端口被占用。此时可以在此job的配置的shell脚本的第一行添加如下脚本再重新run即可:
    13. ps -ef | grep dynamic-proxy-adapter | grep -v grep | awk '{print $2}' | xargs kill -9
    14. 2. jenkins需要在本机上部署项目,则启动容器时需要指定`network`类型为`host`,这样的话,容器中暴露出来的端口和宿主机的端口一致了,容器不需要再额外暴露了
  • 如何查看jenkins镜像的工作目录,有如下两个路径

    1. 镜像内部的/root/.jenkins/

    2. 构建镜像时的VOLUME指令绑定了镜像内部的/root/.jenkins/路径,那究竟是宿主机的哪个目录与之挂在的呢?使用docker inspect + 容器id或容器名称命令来确认, eg: docker inspect jenkins 执行此命令后,会输出结构如下的信息:

      1. [
      2. {
      3. "Id": "5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e",
      4. "Created": "2020-03-23T14:14:41.293507324Z",
      5. "Path": "java",
      6. "Args": [
      7. "-jar",
      8. "jenkins.war",
      9. "--httpPort=8050"
      10. ],
      11. "State": {
      12. "Status": "running",
      13. "Running": true,
      14. "Paused": false,
      15. "Restarting": false,
      16. "OOMKilled": false,
      17. "Dead": false,
      18. "Pid": 2430,
      19. "ExitCode": 0,
      20. "Error": "",
      21. "StartedAt": "2020-03-23T14:14:46.480503585Z",
      22. "FinishedAt": "0001-01-01T00:00:00Z"
      23. },
      24. "Image": "sha256:fce6824dd89f87eedc5e43e356e1b78a6143d54290c65c8c587c58507ac6b5a1",
      25. "ResolvConfPath": "/var/lib/docker/containers/5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e/resolv.conf",
      26. "HostnamePath": "/var/lib/docker/containers/5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e/hostname",
      27. "HostsPath": "/var/lib/docker/containers/5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e/hosts",
      28. "LogPath": "/var/lib/docker/containers/5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e/5d955a41b56325b04e04657a16c12743abc5505a76e6fe85dbc399e5b796753e-json.log",
      29. "Name": "/jenkins",
      30. "RestartCount": 0,
      31. "Driver": "overlay2",
      32. "Platform": "linux",
      33. "MountLabel": "",
      34. "ProcessLabel": "",
      35. "AppArmorProfile": "docker-default",
      36. "ExecIDs": null,
      37. "HostConfig": {
      38. "Binds": [
      39. "/home/eug/workspace/jenkins-java-backend/jobs:/root/.jenkins/jobs"
      40. ],
      41. "ContainerIDFile": "",
      42. "LogConfig": {
      43. "Type": "json-file",
      44. "Config": {}
      45. },
      46. "NetworkMode": "host",
      47. "PortBindings": {
      48. "8050/tcp": [
      49. {
      50. "HostIp": "",
      51. "HostPort": "8050"
      52. }
      53. ]
      54. },
      55. "RestartPolicy": {
      56. "Name": "no",
      57. "MaximumRetryCount": 0
      58. },
      59. "AutoRemove": false,
      60. "VolumeDriver": "",
      61. "VolumesFrom": null,
      62. "CapAdd": null,
      63. "CapDrop": null,
      64. "Capabilities": null,
      65. "Dns": [],
      66. "DnsOptions": [],
      67. "DnsSearch": [],
      68. "ExtraHosts": null,
      69. "GroupAdd": null,
      70. "IpcMode": "private",
      71. "Cgroup": "",
      72. "Links": null,
      73. "OomScoreAdj": 0,
      74. "PidMode": "",
      75. "Privileged": false,
      76. "PublishAllPorts": false,
      77. "ReadonlyRootfs": false,
      78. "SecurityOpt": null,
      79. "UTSMode": "",
      80. "UsernsMode": "",
      81. "ShmSize": 67108864,
      82. "Runtime": "runc",
      83. "ConsoleSize": [
      84. 0,
      85. 0
      86. ],
      87. "Isolation": "",
      88. "CpuShares": 0,
      89. "Memory": 0,
      90. "NanoCpus": 0,
      91. "CgroupParent": "",
      92. "BlkioWeight": 0,
      93. "BlkioWeightDevice": [],
      94. "BlkioDeviceReadBps": null,
      95. "BlkioDeviceWriteBps": null,
      96. "BlkioDeviceReadIOps": null,
      97. "BlkioDeviceWriteIOps": null,
      98. "CpuPeriod": 0,
      99. "CpuQuota": 0,
      100. "CpuRealtimePeriod": 0,
      101. "CpuRealtimeRuntime": 0,
      102. "CpusetCpus": "",
      103. "CpusetMems": "",
      104. "Devices": [],
      105. "DeviceCgroupRules": null,
      106. "DeviceRequests": null,
      107. "KernelMemory": 0,
      108. "KernelMemoryTCP": 0,
      109. "MemoryReservation": 0,
      110. "MemorySwap": 0,
      111. "MemorySwappiness": null,
      112. "OomKillDisable": false,
      113. "PidsLimit": null,
      114. "Ulimits": null,
      115. "CpuCount": 0,
      116. "CpuPercent": 0,
      117. "IOMaximumIOps": 0,
      118. "IOMaximumBandwidth": 0,
      119. "MaskedPaths": [
      120. "/proc/asound",
      121. "/proc/acpi",
      122. "/proc/kcore",
      123. "/proc/keys",
      124. "/proc/latency_stats",
      125. "/proc/timer_list",
      126. "/proc/timer_stats",
      127. "/proc/sched_debug",
      128. "/proc/scsi",
      129. "/sys/firmware"
      130. ],
      131. "ReadonlyPaths": [
      132. "/proc/bus",
      133. "/proc/fs",
      134. "/proc/irq",
      135. "/proc/sys",
      136. "/proc/sysrq-trigger"
      137. ]
      138. },
      139. "GraphDriver": {
      140. "Data": {
      141. "LowerDir": "/var/lib/docker/overlay2/ee1a97c8f344a32c01871c0eaec54d6d556141997776ffacef8758d19cf79a83-init/diff:/var/lib/docker/overlay2/b18b12027ec179983112befb6854c14be4940706591d58ecbbba12459da48c7d/diff:/var/lib/docker/overlay2/517a2ba8b65492a8924d0c918c312652cc9d51cb3305a3a0a96fcbf3b292c7c8/diff:/var/lib/docker/overlay2/187926888df517955161b17d3d8186f8819b98de05d9ca28b97732844c265b33/diff:/var/lib/docker/overlay2/634feff375df5b2c04cad0ae627c301d683e42451145b1d922527116f2bd298b/diff:/var/lib/docker/overlay2/06b35c7aac0be64296c3055059f664061963dfff8b3b6e23327909a1b644b797/diff:/var/lib/docker/overlay2/34221b4a597dfe5117cc042a638c13a3bf15a7ca3efead221522260208ac4ebc/diff:/var/lib/docker/overlay2/b9e017f2836b4e6f738d84351a24ffb24093a9d7d8b78a434919ff3e0e141287/diff:/var/lib/docker/overlay2/e8537efad3b1af2ebfe83ecf0c255152a8a2ff82e9bd54b76b478e215ffe28e5/diff:/var/lib/docker/overlay2/3bacca5cc70365acc8d2e6329dd6f0b873de0cb946a5929672d18199e57c5f4a/diff:/var/lib/docker/overlay2/66fd1ac299fb387ae0743a938452be4a6b6612bfad0a85065faf6dde0c2fb78d/diff",
      142. "MergedDir": "/var/lib/docker/overlay2/ee1a97c8f344a32c01871c0eaec54d6d556141997776ffacef8758d19cf79a83/merged",
      143. "UpperDir": "/var/lib/docker/overlay2/ee1a97c8f344a32c01871c0eaec54d6d556141997776ffacef8758d19cf79a83/diff",
      144. "WorkDir": "/var/lib/docker/overlay2/ee1a97c8f344a32c01871c0eaec54d6d556141997776ffacef8758d19cf79a83/work"
      145. },
      146. "Name": "overlay2"
      147. },
      148. "Mounts": [
      149. {
      150. "Type": "bind",
      151. "Source": "/home/eug/workspace/jenkins-java-backend/jobs",
      152. "Destination": "/root/.jenkins/jobs",
      153. "Mode": "",
      154. "RW": true,
      155. "Propagation": "rprivate"
      156. },
      157. {
      158. "Type": "volume",
      159. "Name": "daf861dedd5ff437d1db318c329cc36258598c7fbec9a62111b1dd0be4252227",
      160. "Source": "/var/lib/docker/volumes/daf861dedd5ff437d1db318c329cc36258598c7fbec9a62111b1dd0be4252227/_data",
      161. "Destination": "/root/.jenkins",
      162. "Driver": "local",
      163. "Mode": "",
      164. "RW": true,
      165. "Propagation": ""
      166. }
      167. ],
      168. "Config": {
      169. "Hostname": "ubuntu",
      170. "Domainname": "",
      171. "User": "",
      172. "AttachStdin": false,
      173. "AttachStdout": false,
      174. "AttachStderr": false,
      175. "ExposedPorts": {
      176. "8050/tcp": {}
      177. },
      178. "Tty": true,
      179. "OpenStdin": true,
      180. "StdinOnce": false,
      181. "Env": [
      182. "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk/bin:/usr/local/maven/bin",
      183. "JAVA_HOME=/usr/local/jdk",
      184. "MAVEN_HOME=/usr/local/maven"
      185. ],
      186. "Cmd": null,
      187. "Image": "registry.cn-hangzhou.aliyuncs.com/avengereug/jenkins:v2",
      188. "Volumes": {
      189. "/root/.jenkins": {}
      190. },
      191. "WorkingDir": "/root",
      192. "Entrypoint": [
      193. "java",
      194. "-jar",
      195. "jenkins.war",
      196. "--httpPort=8050"
      197. ],
      198. "OnBuild": null,
      199. "Labels": {
      200. "MAINTAINER": "avengerEug",
      201. "org.label-schema.build-date": "20200114",
      202. "org.label-schema.license": "GPLv2",
      203. "org.label-schema.name": "CentOS Base Image",
      204. "org.label-schema.schema-version": "1.0",
      205. "org.label-schema.vendor": "CentOS",
      206. "org.opencontainers.image.created": "2020-01-14 00:00:00-08:00",
      207. "org.opencontainers.image.licenses": "GPL-2.0-only",
      208. "org.opencontainers.image.title": "CentOS Base Image",
      209. "org.opencontainers.image.vendor": "CentOS"
      210. }
      211. },
      212. "NetworkSettings": {
      213. "Bridge": "",
      214. "SandboxID": "1c419efa93aead7739f5ff9a062c12572109badcb41cce3eb9e1187ac4075c49",
      215. "HairpinMode": false,
      216. "LinkLocalIPv6Address": "",
      217. "LinkLocalIPv6PrefixLen": 0,
      218. "Ports": {},
      219. "SandboxKey": "/var/run/docker/netns/default",
      220. "SecondaryIPAddresses": null,
      221. "SecondaryIPv6Addresses": null,
      222. "EndpointID": "",
      223. "Gateway": "",
      224. "GlobalIPv6Address": "",
      225. "GlobalIPv6PrefixLen": 0,
      226. "IPAddress": "",
      227. "IPPrefixLen": 0,
      228. "IPv6Gateway": "",
      229. "MacAddress": "",
      230. "Networks": {
      231. "host": {
      232. "IPAMConfig": null,
      233. "Links": null,
      234. "Aliases": null,
      235. "NetworkID": "648c0afff000e653fad1a5eac5d32dffdd6e6f1808a6db0eed2c999a3978e2c2",
      236. "EndpointID": "71e5f186ea3a6f7eb5ecf6e4c394fdeb48b97db5bcfb628e39a15cf474606ea4",
      237. "Gateway": "",
      238. "IPAddress": "",
      239. "IPPrefixLen": 0,
      240. "IPv6Gateway": "",
      241. "GlobalIPv6Address": "",
      242. "GlobalIPv6PrefixLen": 0,
      243. "MacAddress": "",
      244. "DriverOpts": null
      245. }
      246. }
      247. }
      248. }
      249. ]

      我们找到Mounts节点,如下

      1. "Mounts": [
      2. {
      3. "Type": "volume",
      4. "Name": "daf861dedd5ff437d1db318c329cc36258598c7fbec9a62111b1dd0be4252227",
      5. "Source": "/var/lib/docker/volumes/daf861dedd5ff437d1db318c329cc36258598c7fbec9a62111b1dd0be4252227/_data",
      6. "Destination": "/root/.jenkins",
      7. "Driver": "local",
      8. "Mode": "",
      9. "RW": true,
      10. "Propagation": ""
      11. }
      12. ......

      由如上可知,宿主机的"/var/lib/docker/volumes/daf861dedd5ff437d1db318c329cc36258598c7fbec9a62111b1dd0be4252227/_data"目录与容器的/root/.jenkins目录相互挂载,而/root/.jenkins就是jenkins的工作目录

    七、Dockerfile

    1. FROM centos
    2. LABEL MAINTAINER=avengerEug
    3. ADD apache-maven-3.3.9-bin.tar.gz /usr/local/
    4. RUN mv /usr/local/apache-maven-3.3.9 /usr/local/maven
    5. ADD jdk-8u221-linux-x64.tar.gz /usr/local/
    6. RUN mv /usr/local/jdk1.8.0_221 /usr/local/jdk
    7. ENV JAVA_HOME=/usr/local/jdk
    8. ENV MAVEN_HOME=/usr/local/maven
    9. ENV PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
    10. COPY .jenkins /root/.jenkins/
    11. COPY ./jenkins/jenkins.war /root/
    12. RUN yum install -y git
    13. VOLUME "/root/.jenkins"
    14. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    15. RUN echo 'Asia/Shanghai' >/etc/timezone
    16. EXPOSE 8050
    17. WORKDIR /root
    18. ENTRYPOINT ["java", "-jar", "jenkins.war", "--httpPort=8050"]