持续集成CI记录2

一、jenkins配置

本地编辑好dockerfile文件,推送到gitlab中,再从jenkins拉取代码部署到服务器上
需要安装的插件:Git Parameter, Publish Over SSH.
配置maven构建打包代码
maven下载地址:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

1.1、添加maven和jdk
  • 服务器内添加

jenkins映射本地目录:/var/vol_dockers/jenkins_home/
解压maven到jenkins目录下
解压jdk到jenkins目录下
重启jenkins,然后docker exec -it jenkins bash进入到jenkins容器里查验maven和jdk

  • maven修改配置文件

添加阿里云maven地址,直接在百度上搜: 阿里云maven地址
编辑conf/settings.xml

		~ ~ ~ ~
159     <mirror>
160       <id>AliRepo-aliyun</id>
161       <mirrorOf>*</mirrorOf>
162       <name>Mirror Name for the Alirepo.</name>
163       <url>https://maven.aliyun.com/repository/public</url>
164     </mirror>
165 
166   </mirrors>
167 

在这里插入图片描述

修改jdk版本,编辑settings。直接百度搜索, maven的jdk8编译插件settings.xml

<profile>
    <id>jdk18</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>

为了继承目的,并且要通过或命令行激活概要文件,概要文件必须有一个唯一的ID。

<activeProfiles>
<activeProfile>jdk18</activeProfile>
</activeProfiles>

在这里插入图片描述

  • jenkins控制台配置maven和jdk

Dashboard --> 系统配置 --> 全局工具配置
下图1配置jdk
下图2配置maven,dashboard页面拉到最下边

在这里插入图片描述

在这里插入图片描述

1.2、添加目标端ssh主机

在这里插入图片描述

1.3、新建任务,部署代码到指定服务器目录下

1、jenkins从gitlab拉取代码,maven构建打包
2、将打包后的代码和其他文件,推送到指定服务器目录下
3、执行预定于命令

dashboard首页 --> 新建任务 --> 任务名称 --> 自由风格的软件项目
configure --> 源码管理 --> git --> Repository URL(从gitlab克隆http连接)

在这里插入图片描述

build steps(构建步骤),构建代码为jar包。第一次构建需要下载很多依赖,时间较长
构建完jenkins目录下会多一个target目录/*jar包
目标这块暂不清楚为啥要这些写,待查阅

  • clean package -DskipTests 简单讲,是先清理,再打包,跳过测试
  • clean package -DskipTests chatgpt解释:
  • clean: 这是maven的一个生命周期阶段,用于清理项目目录,删除之前构建生成的文件。执行此阶段可确保构建的干净状态
  • package: 也是maven的一个生命周期阶段,用于将项目打包成可部署的格式,例如jar,war或ear文件。
  • -DskipTests: 这是一个系统属性,通常在Maven命令中使用 “-D” 标志来设置。在这种情况下,"-DskipTests"用于跳过执行项目中的测试。
  • 所以,“clean package -DskipTests” 表示在Jenkins中配置Maven时,执行Maven构建的命令时先清理项目,然后再将其打包为可部署的方式,并在构建过程中跳过执行测试。

在这里插入图片描述

构建后操作

在这里插入图片描述

二、代码端配置

2.1、指定构建后的jar包名称

编辑pom.xml

	## 文件最后端
	<build>
		<finalName>mytest</finalName>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

在这里插入图片描述

2.2、添加docker

1、新建docker目录,和src平级
2、新建dockerfile文件(制作自定义镜像)
3、新建docker-compose.yaml,运行容器

  • dockerfile
From daocloud.io/library/java:8u40-jdk
COPY mytest.jar /usr/local/
WORKDIR /usr/local
CMD java -jar mytest.jar
  • docker-compose
version: '3.1'
services:
  mytest:
    build:
      context: ./	# 当前目录
      dockerfile: dockerfile	# 指定构建镜像的文件
    image: mytest:v1.0.1	# 指定镜像版本名称
    container_name: mytest
    ports:
      - 8080:8080

在这里插入图片描述

2.3、验证代码拉取到jenkins目录下

进入到容器内 /var/jenkins_home/workspace

> docker exec -it jenkins bash
> cd /var/jenkins_home/workspace
> cd mytest

在这里插入图片描述
在这里插入图片描述

三、持续交付、部署,基础CD操作

3.1、gitlab代码打标签

程序代码在经过多次集成操作到达最终可以交付,持续交付整体流程和持续集成类似,不过需要选取指定的发行版本
jenkins根据tag标签拉取代码

添加tag标签
代码测试完成提交后,打一次标签

在这里插入图片描述
在这里插入图片描述

3.2、修改jenkins配置

项目 --> 配置 --> general --> 参数化构建过程

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

四、代码审核

目前两种工具
sonarqube,结合maven,修改settings.xml文件,在客户端检测并上传到sonarqube的web平台
sonar scanner,在jenkins端配置使用,将检测结果发送到sonarqube的web平台。

4.1、sonarqube运行启动
  • docker-compose启动

初始账户密码为 admin:admin
修改密码为:123456

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.6-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
  • 汉化

配置 —> 应用市场 —> 插件 --> 搜索chinese

4.2、修改maven的settings.xml文件,添加sonarqube参数

sonarqube结合maven审核本地代码
indellij idea 中配置有maven路径

  • 修改maven的settings.xml文件
<?xml version="1.0" encoding="UTF-8"?>
 
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <localRepository>D:\devZgq\Java\.m2\repository</localRepository>

  <!-- 阿里云的中央仓库 -->
  <mirrors>  
    <mirror>
      <id>aliyun</id>
      <name>aliyun</name>
      <mirrorOf>central</mirrorOf> 
      <url>https://maven.aliyun.com/repository/public</url>
    </mirror> 
  </mirrors> 


  <!-- 配置 jdk 版本 -->
  <profiles> 
    <profile>
      <id>jdk8</id>
      <activation>
        <activeByDefault>true</activeByDefault>
        <jdk>8</jdk>
      </activation>
      <properties>
        <maven.compiler.source>8</maven.compiler.source>
         <maven.compiler.target>8</maven.compiler.target>
          <maven.compiler.compilerVersion>8</maven.compiler.compilerVersion>
      </properties>
    </profile>  
	
	<!-- sonar配置 -->
    <profile>
        <id>sonar</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <sonar.login>admin</sonar.login>
            <sonar.password>123456</sonar.password>
            <sonar.host.url>http://192.168.12.110:9000</sonar.host.url>
        </properties>
    </profile>

  </profiles>
 
  <!-- 启用 -->
  <activeProfiles>
    <activeProfile>jdk8</activeProfile>
    <activeProfile>sonar</activeProfile>
  </activeProfiles>

</settings>

在这里插入图片描述

4.3、使用maven命令审核本地电脑代码

打开intellij idea的终端,切换到代码目录下,执行如下命令

> mvn -v
> mvn sonar:sonar # 审核代码后,会自动上传到sonarqube上

Sonar Qube的UI界面在这里插入图片描述

4.4、Sonar-Scanner

1、从官网下载安装包,解压到jenkins映射目录下
2、修改scanner配置文件,添加qube的IP端口
3、运行scanner命令,检测代码

  • 下载Sonar-Scanner压缩包

下载地址
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.8.0.2856-linux.zip

在这里插入图片描述

  • 解压到jenkins目录下(一级目录下),并修改Scanner配置

修改 conf/sonar-scanner.properties

vim sonar-scanner.properties 
#Configure here general information about the environment, such as SonarQube server connection details for example
#No information about specific project should appear here

#----- Default SonarQube server
sonar.host.url=http://192.168.12.110:9000	# sconarqube 地址

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
4.5、Sonar-Scanner检测jenkins拉取编译好的代码

执行完命令后,会在Sonar-Qube界面上显示。

  • 命令如下
> */jenkins_home/sonar-scanner/bin/sonar-scanner \
-Dsonar.sources=./ \ # 指定源文件目录
-Dsonar.projectname=linux-test \	# 自定义项目名称
-Dsonar.login="0ab1a777144b459db09cdd0cfc06a300887c54cb" \	# qube的token
-Dsonar.projectKey=linux-test -Dsonar.java.binaries=./target/	# 编译好的代码目录
  • 获取token
    在这里插入图片描述
4.6、jenkins添加sonarqube

插件 --> 搜索 sonarqube --> 安装 sonarqube scanner
配置 sonarqube的连接方式

  • 在系统配置中添加sonarqube的连接方式
    在这里插入图片描述
    在这里插入图片描述
  • 添加全局配置
    在这里插入图片描述
  • 在项目工程中配置,位置在maven构建代码后

sonar.projectname=${JOB_NAME}

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

在这里插入图片描述

4.7、测试
  • Jenkins重新构建mytest项目
  • SonarQube界面
    在这里插入图片描述

五、集成harbor

通过jenkins将在服务器上生成的docker镜像上传到harbor中
然后再通过jenkins执行脚本或命令,从harbor中拉取镜像部署到指定服务器

目前遇到问题:
看学习视频和博客,都要求宿主机docker命令映射到jenkins容器内
但我认为是jenkins调用宿主机的命令,而不是使用jenkins容器内的命令,
如下配置是按照 将宿主机docker命令映射到容器内

5.1、安装配置harbor
  • 安装–略
  • 在harbor中新建项目(仓库)repo
  • docker添加harbor仓库
 cat /etc/docker/daemon.json 
{
	"insecure-registries": ["192.168.12.104:180"]
}
  • 上传本地镜像到harbor

得到harbor认证

> docker login -u admin -p 123456 http://192.168.12.104:180

打标签

> docker tag mytest:v1.0.0 192.168.12.104:180/repo/mytest:v1.0.0

上传

> docker push 192.168.12.104:180/repo/mytest:v1.0.0 
5.2、Jenkins容器使用宿主机Docker命令
  • 设置宿主机docker.sock权限
> chown root.root /var/run/docker.sock 
> chmod o+rw /var/run/docker.sock 
> ls -l /var/run/docker.sock 
srw-rw-rw- 1 root root 0 May 28 22:48 /var/run/docker.sock
  • jenkins文件中,添加数据卷
version: '3'
services:
  docker_jenkins:
    user: root
    restart: always
    image: jenkins/jenkins:lts
    container_name: jenkins
    ports:
      - 8082:8080
      - 50000:50000
    volumes:
      - /var/vol_dockers/jenkins_home/:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker
      - /etc/docker/daemon.json:/etc/docker/daemon.json
      - /usr/bin/docker-compose:/usr/bin/docker-compose
5.3、通过jenkins生成的自定义镜像上传到harbor中

本质是在jenkins中配置 构建步骤,通过docker命令build镜像和上传到harbor
得删除掉jenkins中的 构建后操作。

  • 操作步骤

1、改动代码的返回值,版本改为 v3.0.0,然后提交到gitlab
2、gitlab打标签 v3.0.0
3、jenkins项目中新增 构建操作,主要执行shell命令
4、删除掉 构建后操作

  • jenkins新增构建操作,执行linux命令
mv target/*.jar docker/
docker build -t mytest:$release docker/
docker login -u admin -p 123456 http://192.168.12.104:180
docker tag mytest:$release 192.168.12.104:180/repo/mytest:$release
docker push 192.168.12.104:180/repo/mytest:$release

在这里插入图片描述

5.4、编写部署脚本,使目标服务器自动拉取镜像并执行

部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。

添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。

脚本似乎有问题,回头仔细思考下逻辑

#/bin/bash
harbor_url=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

imageName=$harbor_url/$harbor_repo/$project:$version

containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
if [ "$containerId" != "" ] ; then
    docker stop $containerId
    docker rm $containerId
    echo "Delete Container Success"
fi

imageId=`docker images | grep ${project} | awk '{print $3}'`

if [ "$imageId" != "" ] ; then
    docker rmi -f $imageId
    echo "Delete Image Success"
fi

docker login -u DevOps -p P@ssw0rd $harbor_url

docker pull $imageName

docker run -d -p $host_port:$container_port --name $project $imageName

echo "Start Container Success"
echo $project
5.6、jenkins控制台修改项目配置

1、在参数化构建过程中,新加2个字符参数
2、新加1个构建后操作,执行以上脚本

  • 新加2个字符参数
    在这里插入图片描述
  • 新加 构建后操作

执行命令:
deploy.sh 192.168.12.104:180 repo ${JOB_NAME} ${release} ${host_port} ${container_port}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值