Centos7中通过Docker+Jenkins+gitlab,完成持续集成

目录

一、持续集成时序图

二、Jenkins简介

三、其他软件使用及安装配置

四、Jenkins安装

五、使用Jenkins完成项目的持续集成,持续部署

( 一 ) Jenkins 初始化

( 二 ) Jenkins配置( Manage Jenkins )

( 三 ) Jenkins持续集成( CI )

           六、遇到的问题及解决方法


一、持续集成时序图

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第1张图片

二、Jenkins简介

官网链接:https://jenkins.io/zh/

用户手册:https://jenkins.io/zh/doc/

Jenkins下载:https://jenkins.io/download/

Jenkins 是一款开源 CI&CD 软件,是基于Java开发的一种持续集成工具,用于自动化各种任务,包括构建、测试和部署软件。

Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。

三、其他软件使用及安装配置

1、系统及软件版本使用情况

名称 版本 安装方法
操作系统 CentOS 7 ISO 镜像安装
jdk 1.8.0_201 CentOS 安装
maven 3.6.3 CentOS 安装
Git 1.8.3.1 CentOS 安装
GitLab docker.io/gitlab/gitlab-ce:latest Docker 安装
registry docker.io/registry:latest Docker 安装
Jenkins docker.io/jenkins/jenkins:lts Docker 安装

Docker的安装方式及相关命令可参考:https://blog.csdn.net/DZP_dream/article/details/104670943

本次使用的版本控制工具为 Git

测试环境下,关闭防火墙 systemctl stop firewalld

2、jdk 安装

下载并安装jdk, ( 安装位置视个人情况而定,对应修改JAVA_HOME )

设置环境变量:JAVA_HOME =  /opt/software/jdk1.8.0_201

3、maven 安装

下载并安装maven, ( 安装位置视个人情况而定,对应修改MAVEN_HOME)

wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

设置环境变量:MAVEN_HOME = /opt/software/apache-maven-3.6.3

4、设置环境变量的方法为:

打开编辑profile文件

vim /etc/profile

在文件的末尾添加jdk和maven的安装位置

export MAVEN_HOME =/opt/software/apache-maven-3.6.3                                                        
export PATH=$PATH:${MAVEN_HOME}/bin

export JAVA_HOME=/opt/software/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

结束编辑并保存文件

:wq

执行文件

source /etc/profile

修改文件后,最好重启Docker.

5、GitLab安装

docker run -d \
-p 8443:443 \
-p 80:80 \
-p 222:22 \
--name gitlab \
--restart always \
--hostname  192.168.1.175 \
-v /home/gitlab/config:/etc/gitlab:Z  \
-v /home/gitlab/logs:/var/log/gitlab:Z  \
-v /home/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce

配置域名和ip ,修改gitlab.rb,搜索external_url, 设置为本机的ip

cd  /home/gitlab/config
vim gitlab.rb
/external_url 
external_url "http://192.168.1.175" 

  访问http://192.168.1.175 ,如下图所示,已成功安装

6、私有仓库registry 安装

docker pull registry 
docker run --name=registry -p 5000:5000 -di registry

 设置私有仓库的地址

vim /etc/docker/daemon.json
 
{
    "insecure-registries":["192.168.1.175:5000"]
}

重启docker,使其生效

sudo systemctl daemon-reload
sudo systemctl restart docker

 访问http://192.168.1.175:5000/v2/_catalog ,如下图所示,已成功安装

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第2张图片

7、安装git

yum install -y git
git version

8、 mysql, redis等的安装视项目情况而定,具体安装详见之前的博客:

https://blog.csdn.net/DZP_dream/article/details/104670943

四、Jenkins安装

本次采用Docker安装Jenkins容器的方式

1、拉取jenkins镜像

docker pull jenkins/jenkins:lts

2、查看已经安装的jenkins镜像 

docker images

3、查看是否是最新版 

docker inspect ba607c18aeb7

4、创建一个jenkins目录 

mkdir /home/jenkins_home

5、启动一个jenkins容器 

docker run  --name jenkins\
-u root\
-d\
-p 8061:8080\
-p 50000:50000\
-v /usr/bin/docker:/usr/bin/docker:Z \
-v /var/run/docker.sock:/var/run/docker.sock:Z \
-v /etc/sysconfig/docker:/etc/sysconfig/docker:Z \
-v /opt/software/jdk1.8.0_201:/opt/software/jdk1.8.0_201:Z \
-v /opt/software/apache-maven-3.6.3:/opt/software/apache-maven-3.6.3:Z \
-v /opt/software/maven-repo:/opt/software/maven-repo:Z \
-v /home/jenkins_home:/var/jenkins_home:Z   \
--restart=always  \
--privileged=true \
jenkins/jenkins:lts

6、查看jenkins服务 

docker ps | grep jenkins

7、进入容器内部

docker exec -it jenkins bash

8、创建并启动成功,在可视化界面出现端口号为8060的jenkins容器

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第3张图片

五、使用Jenkins完成项目的持续集成,持续部署

( 一 ) Jenkins 初始化

1、访问 http://IP地址:8060,跳转至解锁页面

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第4张图片

2、执行以下命令,得到密码并粘贴过去,进行解锁, 并继续

[root@local ~]# docker exec -it jenkins_01 bash
jenkins@daa92a050df6:/$ cat /var/jenkins_home/secrets/initialAdminPassword
008fc9166eca49d0a8da7f6fe06c7cb7
jenkins@daa92a050df6:/$ 

3、自定义Jenkins, 插件安装,选择安装推荐的插件,进行安装

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第5张图片

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第6张图片

4、安装完成后,进入创建用户界面, 可以使用admin账户继续, 也可以创建用户.

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第7张图片

5、开始使用Jenkins

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第8张图片

( 二 ) Jenkins配置( Manage Jenkins )

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第9张图片

1、全局安全配置(Configure Global Security)

为防止忘记用户名密码, 所以勾选 允许用户注册. 勾选 任何用户可以做任何事,点击保存,如图所示:

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第10张图片

2、全局工具配置(Global Tool Configuration)

Maven 配置, 修改默认 settings 提供和默认全局 settings 提供, 选择文件系统中的settings文件,并输入文件路径:

/opt/software/apache-maven-3.6.3/conf/settings.xml

JDK 安装, 进行新增JDK, 取消勾选自动安装, 进行命名, 并输入JAVA_HOME的路径:

/opt/software/jdk1.8.0_201

Maven 安装, 进行新增Maven, 取消勾选自动安装, 进行命名, 并输入MAVEN_HOME的路径:

/opt/software/apache-maven-3.6.3

修改完成并保存, 如下图所示:

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第11张图片

3、插件管理(Manager Plugins)

安装插件:GitLab hook plugin , GitLab plugin等

( 三 ) Jenkins持续集成( CI )

1、在IDEA中创建springboot项目,并提交至GitLab

(1)创建springboot项目 --> New Project

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第12张图片

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第13张图片

(2)创建以供测试的类和方法

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第14张图片

@RestController
@RequestMapping("/apple")
public class AppleController {

    /**
     * 测试方法
     * @param id
     * @return
     * 访问路径:http://localhost:8080/apple/queryById?id=1
     */
    @GetMapping(value = "/queryById")
    public String queryById(@RequestParam(name = "id", required = true) String id) {
       if("1".equals(id)){
           return "这是id为1的数据";
       }
        return "没有数据";
    }
}

 (3)编写Dockerfile文件

FROM java:8
VOLUME /tmp
ADD apple-0.0.1-SNAPSHOT.jar  app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

(4) 在pom.xml文件中添加maven插件和docker-maven-plugin插件,并配置打包和推送仓库地址


        
            
                org.springframework.boot
                spring-boot-maven-plugin
            

            
            
                org.apache.maven.plugins
                maven-surefire-plugin
                
                    true
                
            

            
                com.spotify
                docker-maven-plugin
                1.0.0
                
                

                    ${project.basedir}/src/main/resources 
                    
                        ${project.version}
                    

                    
                    192.168.1.175:5000
                    true
                    
                    192.168.1.175:5000/${project.artifactId}

                    
                    
                        
                            /
                            ${project.build.directory}
                            ${project.artifactId}-${project.version}.jar
                        
                    
                
            
        
    

(5)本地测试代码

启动项目,不报错,并访问 http://localhost:8080/apple/queryById?id=1

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第15张图片

(6)测试Dockerfile

将Dockerfile文件和maven打包的jar放到同一文件夹下, 

docker build -t appledemo:v1 .

并运行,测试

docker run -d --name appledemo  -p 8080:8080 appledemo:v1

 访问:http://192.168.1.175:8080/apple/queryById?id=1

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第16张图片

 (7)测试 maven插件和docker-maven-plugin插件使用Dockerfile

创建文件夹mycode,并克隆项目

git clone http://192.168.1.175/dangzp/appledemo.git

进入项目文件夹,执行

cd appledemo
mvn -f  pom.xml clean package -DskipTests docker:build

运行容器

docker run -d --name appledemo  -p 8080:8080 apple:0.0.1-SNAPSHOT

访问:http://192.168.1.175:8080/apple/queryById?id=1, 说明测试成功

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第17张图片

2、在Jenkins中新建任务并进行配置

(1) 名称与项目同名, 选择自由风格项目, 并创建

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第18张图片

(2) 源码管理

选择git, 输入Repository URL  ( 注意:路径到项目名 )

http://192.168.1.175/dangzp/appledemo.git

添加 用户名和密码, 在前边进行选中用户名.操作顺序入下图所示:

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第19张图片

 

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第20张图片

(3) 构建

选择执行shell,进行停止容器、删除容器、删除镜像

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第21张图片

#!/bin/bash
result=$(docker ps | grep "apple")
if [[ "$result" != "" ]]
then
echo "stop apple"
docker stop apple
fi
result=$(docker ps -a | grep "apple")
if [[ "$result" != "" ]]
then
echo "rm apple"
docker rm apple
fi
result2=$(docker images | grep "192.168.1.175:5000/apple")
if [[ "$result2" != "" ]]
then
echo "192.168.1.175:5000/apple:0.0.1-SNAPSHOT"
docker rmi $(docker images | grep "192.168.1.175:5000/apple" | awk '{print $3}')
fi

选择:调用顶层maven目标

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第22张图片

 maven版本选择 : myMaven,并执行打包

clean package -f pom.xml  -DskipTests docker:build

选择执行shell,进行 启动镜像

docker run --name apple -p 8080:8080 -idt  192.168.1.175:5000/apple:0.0.1-SNAPSHOT

 

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第23张图片

 3、配置钩子程序

复制Jenkins中构建触发器下的钩子url,并在GitLab中添加WebHooks,并测试,在Jenkins中项目自动构建说明配置成功。

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第24张图片

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第25张图片

 Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第26张图片

4、自动部署测试

修改程序代码,查看Jenkins是否自动构建,并测试程序是否正常访问

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第27张图片

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第28张图片

* 具体配置结合项目进行差异化设置。

 

六、遇到的问题及解决方法

(一)、GitLab容器启动报错502

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第29张图片

解决方法:1、查看容器是否完全启动, 等待容器 完全启动后访问;

                  2、由于虚拟机内存较小导致,需扩大虚拟机内存。

(二)、报错:/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint compassionate_bassi (7a208177d5e4d8e2afa3f10a391101a6361844689f8b911b5a8451bd63f659d4):  

(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.6:8080 ! -i docker0: iptables: No chain/target/match by that name.
 (exit status 1)).

解决方法:重启docker

(三)、报错:[ERROR] [ERROR] Some problems were encountered while processing the POMs:

[FATAL] Non-resolvable parent POM for com.dream:apple:0.0.1-SNAPSHOT: Could not transfer artifact

org.springframework.boot:spring-boot-starter-parent:pom:2.3.1.RELEASE from/to aliyun

(http://maven.aliyun.com/nexus/content/groups/public): Transfer failed for

http://maven.aliyun.com/nexus/content/groups/public/org/springframework/boot/spring-boot-starter

parent/2.3.1.RELEASE/spring-boot-starter-parent-2.3.1.RELEASE.pom and 'parent.relativePath' points at no local POM @ line 5, column 13

解决方法:查看虚拟机是否可以连接外网,重启docker, 调整网卡, 使其可以连接外网

(四)、Jenkins添加Git地址时报错:

无法连接仓库:Command "git ls-remote -h -- http://192.168.1.175/dangzp/appledemo.git HEAD" returned status code 128:
stdout: 

stderr: fatal: unable to access 'http://192.168.1.175/dangzp/appledemo.git/': Failed to connect to 192.168.1.175 port 80: No route to host

无法连接仓库:Error performing git command:  ls-remote -h http://192.168.1.175/dangzp/appledemo.git HEAD

解决方法:

测试环境下,关闭防火墙

systemctl status firewalld

systemctl stop firewalld

(五)、Jenkins自动部署时报错

[apple] $ /bin/sh -xe /tmp/jenkins7555650707965496885.sh
                + docker ps
       /tmp/jenkins7555650707965496885.sh: 2: /tmp/jenkins7555650707965496885.sh: docker: Permission denied
                + grep 192.168.1.175:5000/apple
                + result=
      Build step 'Execute shell' marked build as failure
      Finished: FAILURE

解决方法:检查shell的格式是否正确

(六)、vim找不到

解决方法:安装vim

apt-get update

apt-get install -y vim

(七)、Jenkins中构建触发器下没有GitLab选项

解决方法:安装插件gitlab插件

(八)、jenkins安装插件时报错

java.net.UnknownHostException: updates.jenkins-ci.org
             at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
            at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)

可能原因:Docker中容器或宿主机无法连网导致

解决方法:重启docker

(九)、Gitlab添加wenhooks时保错:

Url is blocked: Requests to the local network are not allowed

解决方法:进入 Admin area => Settings => Network ,然后点击 Outbound requests 右边 的“expand”按钮,如下:

Centos7中通过Docker+Jenkins+gitlab,完成持续集成_第30张图片

 (十)、打包docker镜像时保错

You don't have either docker-client or docker-client-latest installed. Please install either one and retry.

解决方法:安装docker客户端

 

敬请批评指正.

你可能感兴趣的:(工具技术,centos,docker,jenkins,GitLab)