首页 > 代码库 > 第四十三章 微服务CICD(5)- gitlab + jenkins + docker

第四十三章 微服务CICD(5)- gitlab + jenkins + docker

一、总体流程

技术分享

部署:

  • 开发机(mac)
    • ip:11.11.11.11
    • docker:1.12.1
  • 部署机(centos7)
    • ip:10.211.55.4
    • docker:1.12.3
  • 生产机(centos7)
    • ip:10.211.55.3
    • docker:1.10.3(装k8s1.4的时候自带安装的版本)

总体流程:

  • 在开发机开发代码后提交到gitlab
  • 之后通过webhook插件触发jenkins进行构建,jenkins将代码打成docker镜像,push到docker-registry,
  • 之后将该镜像推到生产机。(之后引入k8s,会将该镜像推到云上,云自己分配机器)
    • 这一步这里不做了,之后引入k8s后再做

 

二、gitlab安装

  • 第三十九章 gitlab搭建与使用(docker版)

 

三、jenkins安装

  • 第四十章 jenkins(2016-11-01 10:25)

 

四、gitlab通知jenkins进行构建

  • 第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)
  • 第四十二章 jenkins + gitlab + webhooks + publish-over-ssh(2)

 

五、docker-registry安装

1、部署机(下载镜像,启动镜像)

  • docker pull hub.c.163.com/library/registry:latest
  • docker tag 0bb8b1006103 registry
  • docker run -d -p 5000:5000 -v /opt/registry:/var/lib/registry registry
    • 默认的存储目录:/var/lib/registry

2、开发机

  • 先设置--insecure-registry(这里介绍三种情况)
  • 之后push镜像到registry

2.1、mac:

技术分享

说明:设置insecure registry如上,否则有https的问题,导致无法push和pull,之后"apply restart"就好了。

  • docker push 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
  • ps -ef | grep docker   看看docker进程的options设置成功没有

2.2、docker1.10.3

/etc/sysconfig/docker中修改OPTIONS=‘--selinux-enabled=false --insecure-registry=10.211.55.4:5000‘

修改后

  • systemctl daemon-reload
  • systemctl restart docker
  • ps -ef | grep docker  看看docker进程的options设置成功没有

2.3、docker1.12.3

/lib/systemd/system/docker.service中修改ExecStart=/usr/bin/dockerd --insecure-registry=10.211.55.4:5000

  • systemctl daemon-reload
  • systemctl restart docker
  • ps -ef | grep dockerd  看看docker进程的options设置成功没有

3、生产机

如果需要从registry拉取pull镜像,也需要像上边那样设置,之后才可以拉取。

 

六、gitlab

  • 创建项目 myservice1-docker
  • 设置该项目的webhook:第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)

 

七、jenkins

1、"系统管理"->"系统设置"(已经设置过了):第四十一章 jenkins + gitlab + webhooks + publish-over-ssh(1)

2、项目配置:

2.1、general

项目名称:myservice1-docker(其实就是项目的artifactid)

2.2、源码管理

技术分享

2.3、构建触发器

技术分享

2.4、Build

技术分享

  • package:打成jar包
  • docker:build:打成镜像
  • docker:push:将镜像推到私服

 

八、本地开发代码

技术分享

1、pom.xml

技术分享
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 4 
 5     <modelVersion>4.0.0</modelVersion>
 6 
 7     <groupId>com.xxx</groupId>
 8     <artifactId>myservice1-docker</artifactId>
 9     <version>1.0-SNAPSHOT</version>
10 
11     <properties>
12         <java.version>1.8</java.version><!-- 官方推荐 -->
13         <docker.registry>10.211.55.4:5000</docker.registry>
14         <push.image>true</push.image>
15     </properties>
16 
17     <parent>
18         <groupId>org.springframework.boot</groupId>
19         <artifactId>spring-boot-starter-parent</artifactId>
20         <version>1.3.5.RELEASE</version>
21     </parent>
22 
23     <!-- 引入实际依赖 -->
24     <dependencies>
25         <dependency>
26             <groupId>org.springframework.boot</groupId>
27             <artifactId>spring-boot-starter-web</artifactId>
28         </dependency>
29         <dependency>
30             <groupId>org.springframework.boot</groupId>
31             <artifactId>spring-boot-starter-actuator</artifactId>
32         </dependency>
33     </dependencies>
34 
35     <build>
36         <plugins>
37             <plugin>
38                 <groupId>org.springframework.boot</groupId>
39                 <artifactId>spring-boot-maven-plugin</artifactId>
40             </plugin>
41             <plugin>
42                 <groupId>com.spotify</groupId>
43                 <artifactId>docker-maven-plugin</artifactId>
44                 <version>0.4.13</version>
45                 <configuration>
46                     <imageName>${docker.registry}/${project.groupId}/${project.artifactId}:${project.version}</imageName>
47                     <dockerDirectory>${basedir}/src/main/docker</dockerDirectory>
48                     <pushImage>${push.image}</pushImage>
49                     <resources>
50                         <resource>
51                             <!-- ${project.build.directory},项目构建输出目录,默认为target/ -->
52                             <directory>${project.build.directory}</directory>
53                             <!-- ${project.build.finalName},打包出来的jar名称,默认为${project.artifactId}-${project.version} -->
54                             <include>${project.build.finalName}.jar</include>
55                         </resource>
56                     </resources>
57                 </configuration>
58             </plugin>
59         </plugins>
60     </build>
61 </project>
View Code

说明:第三十八章 springboot+docker(maven)

2、Dockerfile

技术分享
1 FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
2 
3 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar
4 
5 ENV JAVA_HOME /opt/jdk
6 ENV PATH $PATH:$JAVA_HOME/bin
7 
8 CMD ["java","-jar","app.jar"]
View Code

说明:基础镜像是本地开发好的一个镜像,需要之后推到远程registry:docker push 10.211.55.4:5000/zhaojigang/jdk8:c7_j8

注意:实际上

1 FROM 10.211.55.4:5000/zhaojigang/jdk8:c7_j8
2 ADD myservice1-docker-1.0-SNAPSHOT.jar app.jar

不应该硬编码,应该写作

1 FROM @docker.registry@/zhaojigang/jdk8:c7_j8
2 ADD @project.build.finalName@.jar app.jar

但是暂时没成功!!!

3、HelloDockerController.java

技术分享
 1 package com.xxx.docker.myservice1.web;
 2 
 3 import org.springframework.web.bind.annotation.RequestMapping;
 4 import org.springframework.web.bind.annotation.RestController;
 5 
 6 @RestController
 7 @RequestMapping("/docker")
 8 public class HelloDockerController {
 9     @RequestMapping("/hello")
10     public String helloDocker(){
11         return "hello docker12!!!";
12     }   
13 }
View Code

 

九、git提交代码

  • git add --all
  • git commit -m"xxx"
  • git push origin HEAD:dev

之后,查看jenkins编译console,可以看到,会先打镜像,最后将镜像push到远程的registry中,供将来的机器去pull。

 

十、从开发机或者生产机pull镜像并且运行测试

<style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { } span.s2 { color: #c33720 }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { color: #c33720 } span.s2 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { color: #c33720 } span.s2 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f5f5f5; background-color: #000000 } span.s1 { }</style> <style>p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Monaco }</style>

第四十三章 微服务CICD(5)- gitlab + jenkins + docker