欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jenkins+Gitlab+Docker实现微服务容器部署自动化

程序员文章站 2022-04-18 22:24:51
...

Jenkins+Gitlab+Docker实现微服务容器部署自动化

Jenkins+Gitlab+Docker实现微服务容器部署自动化

Jenkins+Gitlab+Docker实现微服务容器部署自动化

啥是容器部署自动化:

1. 容器:Linux容器不是模拟一个完整的操作系统,而是对进程进行隔离。有了容器,就可以将软件运行所需的所有资源打包到一个隔离的容器中。容器与虚拟机不同,不需要捆绑一整套的操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并且保证部署在任何环境中的软件都能运行;

2. 部署自动化:将项目的代码托管到Gitlab/Github/SVN时,会触发webhook去通知Jenkins将代码编译打包成一个可执行文件并通过执行相应脚本去相应的服务器运行该可执行文件

效果:

Jenkins+Gitlab+Docker实现微服务容器部署自动化

第一步、安装docker

  1. ## 安装一些必要的系统工具
  2. yum install -y yum-utils device-mapper-persistent-data lvm2
  3. ## 添加软件源信息
  4. yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  5. ## 更新yum缓存
  6. yum makecache fast
  7. ## 安装 Docker-ce
  8. yum -y install docker-ce
  9. ## 启动 Docker 后台服务
  10. systemctl start docker
  11. ## 测试运行 hello-world
  12. docker run hello-world
  13. ## 配置docker镜像加速器
  14. ## 修改daemon配置文件/etc/docker/daemon.json来使用加速器
  15. sudo mkdir -p /etc/docker
  16. sudo tee /etc/docker/daemon.json <<-'EOF'
  17. {
  18. "registry-mirrors": ["https://kb64la55.mirror.aliyuncs.com"]
  19. }
  20. EOF
  21. sudo systemctl daemon-reload
  22. sudo systemctl restart docker

 

第二步、使用docker 搭建jenkins

2.1、新建jenkins的 Dockerfile并构建成镜像运行

  1. vi Dockerfile
  2. ## 添加如下内容
  3. FROM jenkins
  4. USER root
  5. RUN apt-get update && apt-get install -y sudo && rm -rf /var/lib/apt/lists/*
  6. RUN echo "jenkins ALL=NOPASSWD: ALL" >> /etc/sudoers
  7. USER jenkins
  8. ## 执行构建镜像命令
  9. docker build -t jenkins .
  10. ## 查看构建的jenkins镜像
  11. docker images
  12. ## 运行jenkins镜像
  13. docker run --memory 2.0G --name jenkins -p 18181:8080 -p 50000:50000 -u root -d --env JAVA_OPTS="-Xms256m -Xmx512m -XX:MaxNewSize=256m" -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /home/zhexing/software/jenkins:/var/jenkins_home -v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 myjenkins

访问 http://jenkins服务器ip:18181  确认是否搭建jenkins成功(注意要关闭防火墙)

 

第三步、搭建Gitlab

3.1、安装配置依赖项

  1. sudo yum install curl openssh-server openssh-clients postfix cronie
  2. sudo service postfix start
  3. sudo chkconfig postfix on
  4. sudo yum -y lokkit
  5. sudo lokkit -s http -s ssh

3.2、添加Gitlab仓库,并安装到服务器上

  1. curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
  2. sudo yum install gitlab-ce

3.3、启动Gitlab

sudo gitlab-ctl reconfigure

Jenkins+Gitlab+Docker实现微服务容器部署自动化

搭建成功!!

注:若是在windows下提交代码到Gitlab服务器,则windows需要有git环境。若是在Gitlab服务器下提交代码,则Gitlab服务器也需要有git环境

 

第四步、配置Jenkins环境

4.1、访问Jenkins首页,到如下页面

Jenkins+Gitlab+Docker实现微服务容器部署自动化

获取jenkins密令复制上去

  1. docker exec -it jenkins bash
  2. cat /var/jenkins_home/secrets/initialAdminPassword

Jenkins+Gitlab+Docker实现微服务容器部署自动化

接下来初始化的操作就按默认的即可

4.2、更新jenkins

点击系统管理往下拉,可看到 自动更新 按钮,更新完后重启jenkins

4.3、安装相关插件

Jenkins+Gitlab+Docker实现微服务容器部署自动化

4.4、配置全局工具设置

4.4.1、配置jdk

Jenkins+Gitlab+Docker实现微服务容器部署自动化

4.4.2、配置git

Jenkins+Gitlab+Docker实现微服务容器部署自动化

4.4.3、配置maven

Jenkins+Gitlab+Docker实现微服务容器部署自动化

4.4.4、配置docker

Jenkins+Gitlab+Docker实现微服务容器部署自动化

 

4.5、取消在全局安全配置的 “防止跨站请求伪造漏洞” 选项、勾选“任何人可做任何事”选项

防止Gitlab的 webhook 操作403 报错问题

 

Jenkins+Gitlab+Docker实现微服务容器部署自动化

 

4.6、创建Gitlab 项目仓库和Jenkins工程,并设置好 Gitlab 的 webhook(钩子,当提交代码到Gitlab时,Gitlab将会触发webhook,以通知Jenkins自动构建部署)

4.6.1、Gitlab仓库

Jenkins+Gitlab+Docker实现微服务容器部署自动化

4.6.2、jenkins工程配置

配置代码源

Jenkins+Gitlab+Docker实现微服务容器部署自动化

配置触发条件

Jenkins+Gitlab+Docker实现微服务容器部署自动化

配置打包部署命令和脚本;  注:要选中你在全局工具配置中安装的那个maven

Jenkins+Gitlab+Docker实现微服务容器部署自动化

clean package docker:build
  1. docker stop jenkins-ci
  2. docker rm jenkins-ci
  3. docker run -d -p 8888:8888 --name jenkins-ci jenkins/ci

去Gitlab仓库设置webhook

先开启“可外发钩子请求”

Jenkins+Gitlab+Docker实现微服务容器部署自动化

添加webhook

Jenkins+Gitlab+Docker实现微服务容器部署自动化

 

至此,所有相关配置以及配置完毕,接下来就是自动部署测试了!!

 

第五步、初始化自动配置

5.1、新建项目并提交到Gitlab

5.1.1、新建springboot项目 jenkins-ci;在src/main/ 目录下新建docker目录并创建Dockerfile文件

注意:项目不要用8080端口,gitlab有默认用8080端口会引起冲突

Jenkins+Gitlab+Docker实现微服务容器部署自动化

Dockerfile:

  1. FROM openjdk:8-jre
  2. ENV SPRING_OUTPUT_ANSI_ENABLED=ALWAYS \
  3. JAVA_OPTS=""
  4. ADD *.jar app.jar
  5. CMD echo "The application will start " && \
  6. java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app.jar
  7. EXPOSE 8888

5.1.2、添加docker编译插件到pom文件中

  1. <properties>
  2. <docker.maven.version>0.4.3</docker.maven.version>
  3. <docker.image.prefix>jenkins</docker.image.prefix>
  4. <docker.image.suffix>ci</docker.image.suffix>
  5. </properties>
  1. <plugin>
  2. <groupId>com.spotify</groupId>
  3. <artifactId>docker-maven-plugin</artifactId>
  4. <version>${docker.maven.version}</version>
  5. <configuration>
  6. <!--<imageName>${docker.image.prefix}/${project.artifactId}</imageName>-->
  7. <imageName>${docker.image.prefix}/${docker.image.suffix}</imageName>
  8. <imageTags>
  9. <imageTag>${project.version}</imageTag>
  10. <imageTag>latest</imageTag>
  11. </imageTags>
  12. <dockerDirectory>src/main/docker</dockerDirectory>
  13. <resources>
  14. <resource>
  15. <targetPath>/</targetPath>
  16. <directory>${project.build.directory}</directory>
  17. <include>${project.build.finalName}.jar</include>
  18. </resource>
  19. </resources>
  20. </configuration>
  21. </plugin>

5.1.3、创建一个测试接口 修改项目端口

  1. @RestController
  2. public class HelloController {
  3. @GetMapping("/hello")
  4. public String hello() {
  5. return "hello world";
  6. }
  7. }
server.port=8888

5.1.4、初始化git仓库并上传代码

  1. $ git init
  2. $ git remote add origin http://192.168.2.168/root/jenkins-ci.git
  3. $ git remote -v
  4. $ git add .
  5. $ git commit -m "commit version 0.0.1"
  6. $ git push -u origin master

5.1.5、去jenkins的工程中点击 Build Now 构建项目(第一次可能会很慢,要下载很多的jar包和插件)

Jenkins+Gitlab+Docker实现微服务容器部署自动化

注:第一次构建会失败。原因:项目镜像构建成功,但部署脚本执行失败。

Jenkins+Gitlab+Docker实现微服务容器部署自动化

5.1.6、去服务器查看该镜像并手动启动,访问测试Jenkins+Gitlab+Docker实现微服务容器部署自动化

 

 

Jenkins+Gitlab+Docker实现微服务容器部署自动化

项目容器话部署成功!!

接下来是测试容器自动化部署了!!

5.2、容器自动化部署

5.2.1、修改测试接口的代码并上传到Gitlab。查看jenkins工程中是否在进行自动构建

修改后的测试接口代码:

  1. @RestController
  2. public class HelloController {
  3. @GetMapping("/hello")
  4. public String hello() {
  5. return "hello jenkins-ci!!!";
  6. }
  7. }

再次上传代码到gitlab上便可实现容器自动化部署了

查看Jenkins

构建成功

Jenkins+Gitlab+Docker实现微服务容器部署自动化

Jenkins+Gitlab+Docker实现微服务容器部署自动化

再次访问测试接口

Jenkins+Gitlab+Docker实现微服务容器部署自动化

自动容器化部署成功!!!

 

若想实现jenkins与服务器不在同一台机器的情况,可将jenkins构建执行脚本换成如下设置

  1. # 将构建的镜像上传到 个人阿里镜像仓库
  2. .....
  3. # 远程连接项目服务器,并执行拉取镜像和运行镜像命令
  4. ssh aaa@qq.com(服务器ip)
  5. 停止容器
  6. 删除容器
  7. 删除原有镜像
  8. 拉取镜像
  9. 运行镜像
  10. # 退出远程机器
  11. exit

 

至此剧终!!

如若在部署时遇到什么问题欢迎留言一起探讨。

 

                        <li class="tool-item tool-active is-like tool-clicked"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#csdnc-thumbsup"></use>
                        </svg><span class="name">点赞</span>
                        <span class="count">1</span>
                        </a></li>
                        <li class="tool-item tool-active is-collection "><a href="javascript:;" data-report-click="{&quot;mod&quot;:&quot;popu_824&quot;}"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-Collection-G"></use>
                        </svg><span class="name">收藏</span></a></li>
                        <li class="tool-item tool-active is-share"><a href="javascript:;"><svg class="icon" aria-hidden="true">
                            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#icon-csdnc-fenxiang"></use>
                        </svg>分享</a></li>
                        <!--打赏开始-->
                                                <!--打赏结束-->
                                                <li class="tool-item tool-more">
                            <a>
                            <svg t="1575545411852" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5717" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><defs><style type="text/css"></style></defs><path d="M179.176 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5718"></path><path d="M509.684 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5719"></path><path d="M846.175 499.222m-113.245 0a113.245 113.245 0 1 0 226.49 0 113.245 113.245 0 1 0-226.49 0Z" p-id="5720"></path></svg>
                            </a>
                            <ul class="more-box">
                                <li class="item"><a class="article-report">文章举报</a></li>
                            </ul>
                        </li>
                                            </ul>
                </div>
                            </div>
            <div class="person-messagebox">
                <div class="left-message"><a href="https://blog.csdn.net/weixin_40493969">
                    <img src="https://profile.csdnimg.cn/5/0/8/3_weixin_40493969" class="avatar_pic" username="weixin_40493969">
                                            <img src="https://g.csdnimg.cn/static/user-reg-year/2x/2.png" class="user-years">
                                    </a></div>
                <div class="middle-message">
                                        <div class="title"><span class="tit"><a href="https://blog.csdn.net/weixin_40493969" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}" target="_blank">疾风盲豪-亚青</a></span>
                                            </div>
                    <div class="text"><span>发布了31 篇原创文章</span> · <span>获赞 13</span> · <span>访问量 2万+</span></div>
                </div>
                                <div class="right-message">
                                            <a href="https://im.csdn.net/im/main.html?userName=weixin_40493969" target="_blank" class="btn btn-sm btn-red-hollow bt-button personal-letter">私信
                        </a>
                                                            <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;}">关注</a>
                                    </div>
                            </div>
                    </div>