173.CI/CD(一):gitlab配置,jenkins的安装配置,jenkins实现基础的CI/CD,Sonarqube代码质量检测,Harbor镜像仓库

2023-11-06

目录

一、容器化持续集成的基础概念

1.敏捷开发,持续集成,持续交付,DevOps区别

2.为什么需要持续集成

3.如何设计持续集成流水线

4.什么是持续部署

(1)概念

(2)要素

(3)常见自动化部署方法

(4)如何测试部署的效果

5.项目进度把控

6.Gitflow和Trunk Base两种分支模型

(1)Gitflow

(2)Trunk Base:主干开发分支模型

二、gitlab配置

1.虚拟机中安装docker和docker compose

2.关闭防火墙

3.拉取gitlab镜像

4.登录gitlab,并设置密码

三、安装maven和jdk

1.安装jdk11,别用jdk8,后面会有很多坑

2.上传maven的jar包,并做解压

四、Jenkins

1.下载jenkins,并配置基础插件

 2.在jenkins中配置jdk和maven

(1)将jdk和maven复制到docker的data目录下

(2)在页面上配置jdk

 (3)配置ssh server

 五、jenkins实现基础的CI/CD

1.编写一个项目

(1)创建项目

(2)写好对应的类,并测试一下

2.配置gitlab,并提交代码

(1)启动gitlab

(2) 新建一个项目,并将代码提交

3.jenkins拉取gitlab中的代码

4.在jenkins处进行maven构建项目

5.将构建好的jar包发送到目标服务器

 6.将目标服务器上的jar包以docker的形式运行

7.基于参数构建,设置不同的版本

六、SonarQube代码质量检测

1.SonarQube的下载和安装

2.下载一个中文插件

3.通过maven的方式实现代码质量检测(不推荐)

4.通过sonar-scanner进行代码质量检测(推荐) 

5.jenkins中整合sonarqube

七、Harbor镜像仓库

1.harbor的安装和配置

2.harbor的基本操作

3.jenkins容器内部使用docker

4.jenkins实现制作自定义镜像并推送harbor

 5.目标服务器拉取harbor镜像


一、容器化持续集成的基础概念

1.敏捷开发,持续集成,持续交付,DevOps区别

敏捷开发:计划+代码+构建

持续集成:敏捷开发+测试

持续交付:持续集成+发布

DevOps:持续交付+部署+运维

2.为什么需要持续集成

统一的git:集成代码

持续构建:功能集成在一起,保证不出错

自动化测试:一个模块的功能能够正常工作

联调测试环境:不同模块能够正常工作

3.如何设计持续集成流水线

4.什么是持续部署

(1)概念

自动化的将一个或多个软件又快又稳定的、可重复的联合部署到目标机器,以便功能正常运行。

(2)要素

  • 自动化部署:ansible
  • 应用与配置分离,一次构建,多处运行:spring cloud config
  • 提供应用健康监测的接口:spring cloud actuator

(3)常见自动化部署方法

 CI:持续集成,将代码通过jenkins将包导出到制品库

CD:持续交付,jenkins构建工作流,运用ansible将其推送到不同的环境,加密数据通过vault保证安全

(4)如何测试部署的效果

*1)蓝绿发布

将代码发布后,大部分用户还是继续使用老版本,少部分用户用新版本,发现使用没问题,再慢慢都切到新版本来 

*2)金丝雀发布

 蓝绿发布是两个完全不同的版本,金丝雀发布是在一套环境中,只是一部分机器变成新部署的情况,然后发现没问题再慢慢替代

*3)功能开关

开发人员提供一个远程的终止开关,可以再部署到正式环境后发现问题随时关闭或者打开该功能

5.项目进度把控

(1)什么是Jira

我们使用Jira来进行项目进度把控,Jira有点类似于禅道。

Jira从上到下分级:

  • 版本
  • 该版本下得功能模块
  • 每个模块的开发任务类型:工作量,复杂度,风险性
  • 具体的开发任务:开发进度,开发的bug

(2)idea中集成Jira

*1)先下载

 *2)设置jira的配置 

*3)可视化的jira

6.Gitflow和Trunk Base两种分支模型

(1)Gitflow

Gitflow = Master + develop + feature + release + hot fix

  • master:始终保持生产部署状态
  • develop:最新的,可发布的变更,也叫集成分支
  • release:发布分支,但是功能少于master,分支命名:release-*
  • feature:功能分支,每一个具体开发在此,但是最终结果要合并到develop
  • hot fix:补丁分支,用于修复一些问题,最后要合并到develop或者master

Gitflow适用于对稳定性要求高的场景,开源项目,少量资深研发多数普通开发的情况

(2)Trunk Base:主干开发分支模型

所有人共享一个Repository,修改好之后就直接给到Release版本,然后发布。

可以通过开关的方式决定是否开放某些功能。

适用于互联网,软件本身迭代非常快,团队资深研发比较多

二、gitlab配置

注:我们gitlab所在的虚拟机为:192.168.200.160

1.虚拟机中安装docker和docker compose

这里提供两种方式安装docker

方法一:

#卸载旧的docker
yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#安装需要的安装包
yum install -y yum-utils

#设置镜像的仓库
yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#更新软件包索引
yum makecache fast

#安装docker相关的
yum install docker-ce docker-ce-cli containerd.io

#启动docker
systemctl start docker
# 设置开机自动启动
systemctl enable docker
docker version

#安装docker compose
curl -L https://github.com/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

#设置权限
chmod +x /usr/local/bin/docker-compose

#查看版本
docker-compose version

方法二:

##docker
#1.下载Docker依赖组件
yum -y install yum-utils device-mapper-persistent-data lvm2

#2.设置下载Docker的镜像源为阿里云
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#3.安装Docker服务
yum -y install docker-ce

#4.安装成功后,启动Docker并设置开机自启
# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker

#5.查看版本
docker version

##docker-compose
#1.下载Docker/Compose:https://github.com/docker/compose
#2.将下载好的[docker-compose-Linux-x86_64]()文件移动到Linux操作系统

#3.设置文件权限
chmod a+x docker-compose-Linux-x86_64

# 移动到/usr/bin目录下,并重命名为docker-compose
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose

#查看
echo $PATH

#测试安装成功
docker-compose version

2.关闭防火墙

systemctl stop firewalld

3.拉取gitlab镜像

#创建目录
cd /usr/local/
mkdir docker
cd docker/
mkdir gitlab_docker
cd gitlab_docker/

#创建一个空文件
vi docker-compose.yml

#查看gitlab的版本
docker search gitlab

#拉取版本
docker pull gitlab/gitlab-ce:latest

#编写docker-compose.yml文件
vim docker-compose.yml
###################################################
version: '3.1'
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: gitlab
    restart: always
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://192.168.200.160:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:8929'
      - '2224:2224'
    volumes:
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'
###################################################

#运行docker-compose
docker-compose up -d

#查看启动日志
docker-compose logs -f

4.登录gitlab,并设置密码

查看一下页面:

注:如果你打开页面显示错误,可能是还没启动好,这个启动时间比较长

http://192.168.200.160:8929/

#查看gitlab的账户密码
docker exec -it gitlab bash
cat /etc/gitlab/initial_root_password

账户名:root

密码:复制上面查找到的内容

登录进去之后修改密码:

 

三、安装maven和jdk

注:我们此处的虚拟机为192.168.200.161

1.安装jdk11,别用jdk8,后面会有很多坑

#下载jdk11
curl -O https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz

#jdk1.8下载
#yum install java-1.8.0-openjdk* -y

#解压jdk
tar zxvf openjdk-11.0.1_linux-x64_bin.tar.gz
mv jdk-11.0.1 /usr/local/
cd /usr/local/
mv jdk-11.0.1/ jdk/


vi /etc/profile.d/jdk11.sh
##############################################
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
##############################################

source /etc/profile.d/jdk11.sh

java -version

2.上传maven的jar包,并做解压

cd /usr/local/

#安装
tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/

#修改一下名字
mv apache-maven-3.6.3/ maven/

#设置maven的配置文件
cd maven/conf/
vim settings.xml 

#注意,如果是jdk1.8的话,<profile>和<activeProfile>需要变更一下
         <profile>    
            <id>jdk8</id>    
            <activation>    
               <activeByDefault>true</activeByDefault>    
               <jdk>1.8</jdk>    
            </activation>    
            <properties>    
                    <maven.compiler.source>1.8</maven.compiler.source>    
                    <maven.compiler.target>1.8</maven.compiler.target>    
                    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>    
                </properties>    
        </profile>

###############################################################################
#配置maven的阿里云仓库地址,大概是在159行的位置
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

#配置maven的jdk11编译插件配置setting.xml,大概是在253行
         <profile>    
            <id>jdk11</id>    
            <activation>    
               <activeByDefault>true</activeByDefault>    
               <jdk>11</jdk>    
            </activation>    
            <properties>    
                    <maven.compiler.source>11</maven.compiler.source>    
                    <maven.compiler.target>11</maven.compiler.target>    
                    <maven.compiler.compilerVersion>11</maven.compiler.compilerVersion>    
                </properties>    
        </profile>

#配置activeProfile,大概在275行
  <activeProfiles>
        <activeProfile>jdk11</activeProfile>
  </activeProfiles>
###############################################################################

vi /etc/profile
#######################################################
export MAVEN_HOME=/usr/local/maven
export PATH=$PATH:$MAVEN_HOME/bin
#######################################################

source /etc/profile
mvn -version

四、Jenkins

官网:Jenkins

1.下载jenkins,并配置基础插件

#拉取镜像
docker pull jenkins/jenkins:2.346.3-2-lts

#设置docker-compose配置文件
cd /usr/local/
mkdir docker
cd docker/
mkdir jenkins_docker
cd jenkins_docker/
vim docker-compose.yml

########################################################
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.346.3-2-lts
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
########################################################


#运行docker-compose
docker-compose up -d
#重启
docker-compose restart

#查看运行日志
docker logs -f jenkins

#第一次启动失败,因为没有设置权限,给data目录设置权限
chmod -R a+w data/


#因为官方数据源下载很慢,我们替换数据源
cd data/
vim hudson.model.UpdateCenter.xml 
#########################################################################
#我们这里提供2个数据源,随便选一个就行
http://mirror.esuni.jp/jenkins/updates/update-center.json
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
#########################################################################

在我们查看日志的时候,会有一个密码,记一下,登录的时候用。

查看页面:http://192.168.200.161:8080/

进来之后输入密码,选择插件安装,然后点击安装,按照顺序往下走。

 

需要下载3个软件,然后重启一下 

 

 2.在jenkins中配置jdk和maven

(1)将jdk和maven复制到docker的data目录下

#将jdk和maven的包复制到data目录下
cd /usr/local/docker/jenkins_docker/data/
mv /usr/local/jdk/ ./
mv /usr/local/maven/ ./

#因为我们在docker-compose中设置了数据卷,所以我们去到docker内部查看一下
#也是可以看到复制的jdk和maven目录的
docker exec -it jenkins bash
cd /var/jenkins_home/
ls

(2)在页面上配置jdk

#jdk11
/var/jenkins_home/jdk

#maven
/var/jenkins_home/maven

 

 

 (3)配置ssh server

该步骤用于配置目标服务器,该目标服务器中需要有docker,我们默认使用当前161的虚拟机

cd /usr/local/
mkdir test

 

 五、jenkins实现基础的CI/CD

1.编写一个项目

(1)创建项目

 

进去之后配置一下maven

(2)写好对应的类,并测试一下

TestController:

package com.xupeng.mytest.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    @GetMapping("/test")
    public String test(){
        return "hello";
    }
}

 启动后进入:localhost:8080/test,测试通过

2.配置gitlab,并提交代码

先启动192.168.200.160虚拟机

(1)启动gitlab

# 启动Docker服务
systemctl start docker
# 设置开机自动启动
systemctl enable docker

cd /usr/local/docker/gitlab_docker/

#运行docker-compose
docker-compose up -d

#查看启动日志
docker-compose logs -f

启动后登录页面:http://192.168.200.160:8929/

(2) 新建一个项目,并将代码提交

*1)建好项目

 

 *2)在idea中将代码提交

选择mytest这个文件夹: 

 

3.jenkins拉取gitlab中的代码

 

验证代码是否成功拉取:

来到161的虚拟机,我们发现是可以看到对应的代码的:

docker exec -it jenkins bash
cd ~
cd workspace/mytest
ls

4.在jenkins处进行maven构建项目

clean install package -DskipTests

 保存后再次点击构建:

 再次验证代码是否构建成功,我们会发现多了一个target文件夹:

docker exec -it jenkins bash
cd ~
cd workspace/mytest
ls

5.将构建好的jar包发送到目标服务器

 

target/*.jar

 6.将目标服务器上的jar包以docker的形式运行

(1)修改原来的项目

pom.xml:

构建的时候设置一个finalName

    <build>
        <finalName>mytest</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

Dockerfile:

注意:如果FROM里面的镜像拉取不下来,可以换一个:

adoptopenjdk/openjdk11:jdk-11.0.8_10-alpine
FROM openjdk:11-jre
COPY mytest.jar /usr/local/
WORKDIR /usr/local/
CMD java -jar mytest.jar

docker-compose.yml:

version: '3.1'
services:
  mytest:
    build:
      context: ./
      dockerfile: Dockerfile
    image: mytest:v1.0.0
    container_name: mytest
    ports:
    - 8081:8080

(2)来到jenkins重新构建一下

(3)查看是否构建成功

161虚拟机:

docker exec -it jenkins bash
cd ~
cd workspace/mytest/
ls

 (4)修改jenkins的configure

sorce file里面加了:docker/*

target/*.jar docker/*
cd /usr/local/test/docker
mv ../target/*.jar ./
docker-compose down
docker-compose up -d --build
docker image prune -f

我们再build一下,然后http://192.168.200.162:8081/test

然后我们变更test方法里面的返回数据,在重新build一下,就可以刷新了 

7.基于参数构建,设置不同的版本

(1)设置git parameter 

git checkout $tag

 配置好之后gitlab设置tag:

我们设置2个版本,分别是v1.0.0和v2.0.0: 

修改代码:改一下版本号

 我们发布的时候如果选择v1.0.0就是之前的,如果选择v2.0.0就是修改之后的

六、SonarQube代码质量检测

跑完第五步,我们已经能正常的上传代码,通过jenkins去拉取代码并编译,然后将编译后的代码提交到目标服务器,并直接启动了。

我们还需要增加代码质量检测。

1.SonarQube的下载和安装

先去官网看最新的稳定版本,我们就下载该版本。

现在SonarQube已经不支持mysql了,需要一个postgres数据库,

Download | SonarQube

#拉取postgres数据库镜像
docker pull postgres

#拉取sonarqube镜像
docker pull sonarqube:8.9.9-community

#设置sonarqube
cd /usr/local/docker/
mkdir sonarqube_docker
cd sonarqube_docker/
vim docker-compose.yml

###################################################
version: "3.1"
services:
  db:
    image: postgres
    container_name: db
    ports:
      - 5432:5432
    networks:
      - sonarnet
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
  sonarqube:
    image: sonarqube:8.9.9-community
    container_name: sonarqube
    depends_on:
      - db
    ports:
      - "9000:9000"
    networks:
      - sonarnet
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
networks:
  sonarnet:
    driver: bridge
###################################################

#启动
docker-compose up -d

#查看日志,会发现有报错
# max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
docker logs -f sonarqube 

#配置虚拟机大小
vi /etc/sysctl.conf

########################
vm.max_map_count=262144
########################

#刷新一下配置
sysctl -p

#重新启动
docker-compose up -d

登录sonarqube:http://192.168.200.161:9000/

账户和密码都是admin 。登录后重置一下密码

2.下载一个中文插件

 下载好之后有一个弹窗,重启即可。

3.通过maven的方式实现代码质量检测(不推荐)

(1)来到maven的config.setting配置文件,添加如下配置

	<profile>
		<id>sonar</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
		<properties>
			<sonar.login>admin</sonar.login>
			<sonar.password>123456789</sonar.password>
			<sonar.host.url>http://192.168.200.161:9000</sonar.host.url>
		</properties>
	</profile>

(2)idea中的terminal中输入

#对代码进行质量检测
cls
mvn -v
mvn sonar:sonar


 (3)查看质量检测结果

刷新一下sonarqube首页,就会多了一个代码检测报告 

4.通过sonar-scanner进行代码质量检测(推荐) 

*1)下载安装,并设置配置文件

#因为下载下来是zip,我们先下载一下解压缩的支持
cd /
yum -y install unzip


#上传好压缩包之后解压
unzip sonar-scanner-cli-4.6.1.2450-linux.zip 

#改个名
mv sonar-scanner-4.6.1.2450-linux/ sonar-scanner

#移动到jenkins的data目录下
cd /usr/local/docker/jenkins_docker/data
mv /sonar-scanner ./

#设置一下配置文件
cd /usr/local/docker/jenkins_docker/data/sonar-scanner/conf
vim sonar-scanner.properties

################################################
sonar.host.url=http://192.168.200.161:9000
sonar.sourceEncoding=UTF-8
################################################

#启动
cd /usr/local/docker/sonarqube_docker/
docker-compose up -d

*2)给用户设置一个token,用来唯一标识用户

*3)执行代码检测

#进入代码目录
cd /usr/local/docker/jenkins_docker/data/workspace/mytest/

#启动sonar-scanner
/usr/local/docker/jenkins_docker/data/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=mytest-linux -Dsonar.login=6b35ae055567be4a0179b5204a968653d7d8feac -Dsonar.projectKey=mytest-linux -Dsonar.java.binaries=./target/

 

5.jenkins中整合sonarqube

(1)jenkins下载sonarqube

 假设你的网络不好下载不下来,也可以通过上传的方式完成:

 (2)配置sonarqude

 如果点击add的时候没效果,就先保存,然后重新进来看:

 

 (3)将sonarqube配置进jenkins

 找到任务下面的配置:

 在build下面maven的后面追加sonar:

sonar.projectname=${JOB_NAME}
sonar.projectKey=${JOB_NAME}
sonar.source=./
sonar.java.binaries=./target/

然后重新编译,这个时候会报错:

(4)解决遇到的bug问题

我们会看到之前测试sonar的时候生成了一个隐藏文件夹:.scannerwork

将他删除掉即可

cd /usr/local/docker/jenkins_docker/data/workspace/mytest/
ls -a
rm -rf .scannerwork/

 jenkins重新构建即可。

七、Harbor镜像仓库

我们之前是jenkins把war包发送给目标服务器,然后目标服务器通过docker-compose构建docker。

当目标服务器有多个的时候,每个都会构建一次,不好。

我们希望在jenkins的harbor里面构建好,给一个通知给到目标服务器,然后目标服务器自己去harbor里面去拉取

1.harbor的安装和配置

#解压
tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/

#复制配置文件
cd /usr/local/harbor/
cp harbor.yml.tmpl harbor.yml

#编辑配置文件
#####################################
#修改hostname
hostname: 192.168.200.161

#修改http下得port
port: 80

#将https下面的所有的都注释掉,包括https本身
#记录一下harbor_admin_password的密码
#####################################

#运行harbor
./install.sh 

查看页面:http://192.168.200.161:80/

用户名:admin

密码:Harbor12345

2.harbor的基本操作

(1)新建一个项目

(2)配置一下私有库

vi /etc/docker/daemon.json

############################################################
{
        "insecure-registries":["192.168.200.161:80"]
}
############################################################

(3)先在jenkins虚拟机中随便起一个tomcat服务

#下载镜像
docker pull tomcat
docker images
 
#启动
#-d:以后台运行  -p:暴露端口 外网端口:tomcat内部端口  --name:命名
docker run -d -p 3355:8080 --name tomcat01 tomcat
 
#此时你运行一下是会报错的
 
#需要拷贝一下
docker exec -it tomcat01 /bin/bash
cp -r webapps.dist/* webapps

http://192.168.200.161:3355/

(4)将tomcat推送到harbor仓库中

#找到tomcat的imageId
docker images

#tomcat的imageId:6ce88d2075b4 
#harbor的ip:端口/仓库名称/image的名称:版本号
docker tag 6ce88d2075b4 192.168.200.161:80/repo/mytomcat:v1.0.0
docker images

#重启docker
systemctl restart docker

#登录harbor
#如果登录不上去,可以重启一下harbor
docker login -u admin -p Harbor12345 192.168.200.161:80

#将tomcat推送到harbor仓库中
docker push 192.168.200.161:80/repo/mytomcat:v1.0.0

 (5)目标服务拉取镜像

来到目标服务器192.168.200.162

*1)配置daemon.json,并拉取

vi /etc/docker/daemon.json

############################################################
{
        "insecure-registries":["192.168.200.161:80"]
}
############################################################

#重启一下docker
systemctl restart docker.service


#拉取镜像
docker pull 192.168.200.161:80/repo/mytomcat:v1.0.0

3.jenkins容器内部使用docker

我们重新操作jenkins服务器:192.168.200.161

要想jenkins内部使用docker,推荐将docker.sock文件变成root:root,且所有人都能操作,这样,jenkins就可以直接操作docker了。确保让jenkins使用虚拟机里面的docker,而不是自己下载一个docker

#将docker.sock变成root组下得root用户文件
cd /var/run/
chown root:root docker.sock

#其他用户也有读写权限
chmod o+rw docker.sock

#修改docker-compose配置文件
cd /usr/local/docker/jenkins_docker/
vim docker-compose.yml

#############################################################
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.346.3-2-lts
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/
      - /usr/bin/docker:/usr/bin/docker
      - /var/run/docker.sock:/var/run/docker.sock
      - /etc/docker/daemon.json:/etc/docker/daemon.json
#############################################################

#重启jenkins
docker-compose up -d

#看看jenkins里面好不好用docker
docker exec -it jenkins bash
docker version
exit

4.jenkins实现制作自定义镜像并推送harbor

(1)删除原本推送到目标服务器并在目标服务器构建的步骤

 在build阶段的sonar后面追加一个execute shell

 (2)修改代码,并追加版本

gitlab中增加v3.0.0

将文字显示为v3.0 .0

(3)将docker镜像在jenkins生成

mv target/*.jar docker/
docker build -t mytest3:$tag docker/
docker login -u admin -p Harbor12345 192.168.200.161:80
docker tag mytest3:$tag 192.168.200.161:80/repo/mytest3:$tag
docker push192.168.200.161:80/repo/mytest3:$tag

 5.目标服务器拉取harbor镜像

(1)目标服务器拉取镜像的校验逻辑

  1. 告知目标服务器拉取哪个镜像
  2. 判断目标服务器是否正在运行容器,如果是,则把正在运行的容器删除
  3. 如果目标服务器已经存在当前镜像,如果是,则删除
  4. 目标服务器拉取harbor上的镜像
  5. 将拉取下来的镜像运行成容器

其次,目标服务器还需要知道的信息有:

  • harbor地址/harbor仓库/镜像名:镜像版本
  • 端口号

(2)目标服务器脚本

我们来到192.168.200.162服务器:

vim deploy.sh

############################################################
#harbor的地址
harbor_url=$1
#harbor仓库名
harbor_project_name=$2
#镜像名称
project_name=$3
#版本号
tag=$4
#暴露端口
port=$5

imageName=$harbor_url/$harbor_project_name/$project_name:$tag

#根据名称过滤查找出一行容器数据,然后再获取第一列的数据,即对应的标识
containerId=`docker ps -a | grep ${project_name} | awk '{print $1}'`
#如果当前容器已经存在,先停掉当前容器,再删除
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi

#根据名称过来找出镜像,并打印出第三列
imageId=`docker images | grep ${project_name} | awk '{print $3}'`
#如果当前镜像存在,删除
if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success"
fi

#登录harbor
docker login -u admin -p Harbor12345 $harbor_url

#拉取
docker pull $imageName

#运行
docker run -d -p $port:$port --name $project_name $imageName

echo "Start Container Success"
echo $project_name
############################################################

#配置权限
chmod a+x deploy.sh

#将该文件放到PATH下,这样任何位置都能运行
echo $PATH
mv deploy.sh /usr/bin/

(3)jenkins中配置目标服务器相关信息

*1)先配置一个字符串参数 

*2)设置一个post-build actions

deploy.sh 192.168.200.161:80 repo mytest3 $tag $port

#
#deploy.sh 192.168.200.161:80 repo mytest3 $tag 8082

 *3)对于实际端口和暴露端口不一样的情况

修改目标脚本服务器,新增一个参数,比如叫hostport=8081。然后入参那个地方,port变化一下,一个containport=8080,一个hostport=8081

docker run -d -p $containport:$hostport --name $project_name $imageName

然后再jenkins的配置里面的general里再新增一个hostport入参

然后Post-build Actions,新增一个入参

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

173.CI/CD(一):gitlab配置,jenkins的安装配置,jenkins实现基础的CI/CD,Sonarqube代码质量检测,Harbor镜像仓库 的相关文章

  • 在 jelly 脚本中使用 JavaScript

    我正在尝试在 Jenkins 中使用用 JavaScript 编写的脚本 我认为最简单的方法是在 jelly 脚本中调用它们 例如 我有文件 myCustom js alert Hello World function myFunction
  • 解锁 Jenkins - 如何

    我已经使用 putty 从 Windows 系统在我的 ec2 实例上安装了 jenkins 当我尝试通过网络访问 jenkins 时 我使用 var lib jenkins secrets initialAdminPassword 解锁
  • 使用功能分支时避免 Maven 存储库版本冲突

    Question 如何处理 Maven 多项目构建的功能分支 Jenkins 构建和部署这些分支 以将开发人员的构建开销降至最低 但开发和功能分支无法构建相同的 Maven 版本 否则我们将面临工件和源代码之间不匹配的风险 我们有一个脚本来
  • Jenkins git 插件 - 有时太慢

    以下内容摘自 Jenkins 日志 00 00 03 135 gt git fetch tags progress email protected cdn cgi l email protection some org some repo
  • 无法安装企业应用程序 - 此配置文件无法安装在此设备上

    我正在设置 Jenkins 来构建应用程序的企业版本 以便在我们的内部应用程序商店中分发 如果我将应用程序存档在 Xcode 中 然后在手机上下载内置的 ipa 则应用程序安装不会出现任何问题 但是当我使用 Jenkins 生成的具有相同私
  • Jenkins + Gradle + Artifactory:无法读取生成的构建信息

    我正在尝试使用 Jenkins Pipeline 调用 Gradle 工具 将我的工件推送到 Artifactory 我正在关注 GitHub 上发布的示例 Example1 https github com JFrogDev projec
  • Jenkins 和 Github 不使用 SSH 密钥

    我已将 Jenkins 设置为从 Github 上的私有存储库中提取特定作业 尽管我已经生成了私钥 公钥并将其作为部署密钥添加到 github 但 Jenkins 似乎并未使用 SSH 密钥 当我从 Jenkins 用户进行 git clo
  • 访问 jelly 模板中的自定义环境变量

    使用 Jenkins 管道 您可以通过以下方式设置任何环境变量全局变量称为 env 果冻模板反过来 您可以访问 Jenkins API 包括hudson model AbstractBuild and hudson model Abstra
  • 如何从容器内运行 podman?

    我想跑podman https podman io作为运行 CI CD 管道的容器 但是 我不断从 podman 容器中收到此错误 podman info ERRO 0000 overlay is not supported over ov
  • Jenkins:如何使由于工作区问题而导致的失败构建的颜色从红色变为灰色?

    我们的詹金斯构建应该只是red当有一个构建代码时出现问题比如编译问题 如果存在管理员问题 例如工作空间已满 某些从属设备已关闭 我们需要将这份工作变成gray 表明有一个詹金斯本身的问题 但开发商应该not保持高度戒备 这是一个需要将作业变
  • 执行Jenkinsfile时如何获取管道配置字段“脚本路径”?

    如何从 Jenkinsfile groovy 获取 Jenkins 中管道配置字段 脚本路径 的内容 在此示例中 我想在执行 Jenkinsfile 本身时获取字符串 Apps mq logger Jenkinsfile 您可以通过这种方式
  • 如何仅根据拉取请求在 Jenkins 中运行阶段?

    我现在有一个基于 Jenkinsfile 的管道 其中包含多个阶段 每次提交到 Github 时都会由 webhook 触发 我想在每次提交时保持 构建 和 单元测试 阶段运行 但仅在分支准备拉取请求时运行 集成测试 阶段 我想要的是 st
  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 如何获取 Jenkins 的 API 令牌

    我正在尝试使用詹金斯REST https en wikipedia org wiki Representational state transferAPI 说明中说我需要 API 密钥 我浏览了所有配置页面才找到它 如何获取 Jenkins
  • 如何通过 JSON / JS 在 Jenkins 中添加 CSRF 面包屑

    我想在 Jenkins 中通过 API 创建作业 但无法连接 Jenkins 中的 CSRF 保护课程 我得到了一个面包屑 但不知道如何将其附加到 JSON 或 JavaScript 中的 url 请求 以通过 POST 方法获取数据传递
  • Jenkins 和 Gitlab 不获取代码

    当我设置自己的项目时 我遇到了问题 我开始配置我的 Jenkins 作业 我这样做了 在 Jenkins 上为 gitlab 用户帐户创建凭证 在 gitlab 上创建访问令牌并在 Jenkins 中使用此令牌来启用它 and this i
  • 在构建服务器上运行单元测试时出现 BadImageFormatException

    我在一个具有 AnyCPU 架构的项目中进行了一套 NUnit 测试 其中一些测试使用 x86 32 位 程序集中的类型 当我在本地运行测试 通过 ReSharper 时 它们都通过了 然而 当它们在 Jenkins 上执行时使用nunit
  • 有没有办法将 Hudson / Jenkins 配置文件保留在源代码管理中?

    我是 Hudson Jenkins 的新手 想知道是否有办法将 Hudson 的配置文件签入源代码管理 理想情况下 我希望能够单击 UI 中显示 保存配置 的某个按钮 并将 Hudson 配置文件签入源代码管理 最有帮助的答案 有一个插件叫
  • Jenkins 管道构建如何确定工作区文件夹?

    在 Jenkins 管道中 当在特定节点上运行构建时 会在该代理上分配工作空间 我们没有设置工作空间路径 因此它是自动确定的 据我了解 当同一作业在同一代理上同时运行时 工作区必须包含执行程序编号以隔离构建 但是 工作空间路径到底是如何构建
  • 在声明性詹金斯管道中 - 我可以动态设置代理标签吗?

    有没有办法动态设置代理标签而不是普通字符串 该工作有 2 个阶段 第一阶段 始终在 主 代理上运行 在此阶段结束时 我将知道第二阶段应在哪个代理上运行 第二阶段 应该在第一阶段决定的代理上运行 我的 不起作用 尝试如下所示 pipeline

随机推荐

  • 日常使用开源库

    常用库明细 框架名称 GitHub地址 导入地址 使用项目 备注 EventBus https github com greenrobot EventBus implementation org greenrobot eventbus 3
  • Python + selenium + requests实现12306全自动买票

    Python selenium requests实现12306全自动买票 2020 05 03更新 下面是新的测试结果 2021 03 28更新 谷歌浏览器升级导致之前的隐藏方法失效 更新了新的隐藏方法 2020 12 19更新 1 不再通
  • 不对等的爱情并不长久

    很多时候 我们或许会以为 不平等的爱情也许更会长久 因为总觉得有那么一个处于弱势的人会不计所以的为其付出 起初我也这样认为 当然如果真的有那么一方肯为另一方不计一切且永远地为其付出 或许爱情真的会永恒 只是可惜事实却不然 后来 我逐渐地发现
  • MMOCR: OpenMMLab 全流程的文字检测识别理解工具箱

    号外号外 继 港中文 商汤OpenMMLab开源全景图 之后 OpenMMLab 又有新成员加入咯 01 MMOCR 特点 全流程 支持文字检测 文字识别以及其下游任务 比如关键信息提取等 多模型 我们实现了 10 余种优秀算法 文字检测算
  • 多种方法查找窗口句柄

    一种 使用API函数FindWindowhw FindWindow nil PChar 窗口的标题名称 第二种 通过枚举所有窗口 查询特定条件的窗口function EnumWindowsProc Wnd HWND Param Intege
  • FATFS文件系统返回FR_DISK_ERROR错误的解决方案

    问题描述 我的团队一直在处理一个包含基于标准库的 SD 卡的项目 最近我们决定迁移到 HAL 并开始了 幸运的是 我们项目的所有部分都尽可能地更改为 HAL 它们运行良好 但我们不知道为什么 SD 卡不能正常运行 我们没有更改外设的配置时钟
  • 谷粒学院解析用户登录信息出现 Unexpected token o in JSON at position 1

    原因 JSON parse data data本身就是一个Object 不能解析 看看是不是在login vue中存储返回的登录信息时 需要转换为字符串然后再保存到cookie中JSON stringify this loginInfo 第
  • CVPR 2021

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 本文作者 李翔 来源 知乎 已授权 https zhuanlan zhihu com p 313684358 论文 https arxiv org abs 2011 1
  • 二叉树前中后序遍历的迭代写法

    前序遍历 入栈之前访问根节点 public List
  • apache ii评分和死亡率_高大上的风险分层系统:APACHE评分到底是啥?

    APACHE的英文全称为Acute Physiology and Chronic Health Evaluation 中文译为急性生理与慢性健康评分 有个别文献也将APACHE的全文写为Acute Physiology Age and Ch
  • C++菱形继承问题

    多重继承 一个派生类继承了两个或两个以上的基类 如图 如果在多重继承中Class A 和Class B存在同名数据成员 则对Class C而言这个同名的数据成员容易产生二义性问题 这里的二义性是指无法直接通过变量名进行读取 需要通过域 成员
  • redis持久化机制,修改配置文件之后需要这么做才有用

    1 修改配置文件 2 修改完配置文件 想在启服务器的时候 服务区读取到配置文件需要 这么做 2 1 2 2 2 3 2 4 2 5 打开redis服务器也是需要这么操作 拖动server 和 config 才能去读到保存到硬盘的数据 转载于
  • stm32是小端模式还是大端模式

    STM32 是大端模式 在计算机体系结构中 有两种不同的方法来存储多字节数据类型 即大端模式和小端模式 在大端模式中 最高有效字节 即最左边的字节 存储在内存的低地址处 而最低有效字节 即最右边的字节 存储在内存的高地址处 相反 在小端模式
  • [python] 时间序列分析之ARIMA

    1 时间序列与时间序列分析 在生产和科学研究中 对某一个或者一组变量 x t x t 进行观察测量 将在一系列时刻 t1 t2 tn t 1 t 2 cdots t n 所得到的离散数字组成的序列集合 称之为时间序列 时间序列分析是根据系统
  • fill填充函数解析及用法示例

    fill填充函数解析及用法示例 fill x y color 其中x y是填充的范围 color是填充的颜色 1 对x y范围的获取 示例 所以可以得出x 0 1 1 0 y 0 0 1 1 示例代码如下 画一个填充图形 思路 首先需要得到
  • vue3.0通信方式之 Ref

    Ref通信方式 父传子 子传父 父传子
  • 鸿蒙石之鉴流程,鸿蒙石之鉴完全攻略!

    现在小肥皂给大家说说日常神器任务之鸿蒙石之鉴攻略及成就攻略 这是唯一一个起神器可以获得两个及以上五宝的神器 1 在长安传令天兵处领取任务 2 领取任务后来到傲来进行第一场战斗 封印法弟子是天宫会错乱封人 雷霆法弟子是天宫会雷霆万钧 五雷法弟
  • 栈的最小值

    请设计一个栈 除了常规栈支持的pop与push函数以外 还支持min函数 该函数返回栈元素中的最小值 执行push pop和min操作的时间复杂度必须为O 1 示例 MinStack minStack new MinStack minSta
  • utf8字符串转gb2312代码

    因iconv方法有些编译器不支持 则采用下面映射方法 完全代码参考 https download csdn net download weixin 55163060 84566848 unsigned short giGB2312 2124
  • 173.CI/CD(一):gitlab配置,jenkins的安装配置,jenkins实现基础的CI/CD,Sonarqube代码质量检测,Harbor镜像仓库

    目录 一 容器化持续集成的基础概念 1 敏捷开发 持续集成 持续交付 DevOps区别 2 为什么需要持续集成 3 如何设计持续集成流水线 4 什么是持续部署 1 概念 2 要素 3 常见自动化部署方法 4 如何测试部署的效果 5 项目进度