Jenkins - DevOps【1】

 #1.[GitLab]-192.168.40.110

#1.[GitLab]-192.168.40.110
docker 20.10.17
docker-compose version 1.28.6

docker-compose.yml
version: '3.1'

services:
  gitlab:
    image: gitlab/gitlab-ce:latest
    restart: always
    container_name: gitlab
    environment:
      TZ: Asia/Shanghai
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'https://192.168.40.110:8989' # 访问gitlab-ce的完整地址
        gitlab_rails['gitlab_shell_ssh_port'] = 2224    
    ports:
      - '8929:8929'  # ssh监听端口映射
      - '2224:2224' # web监听端口映射
    volumes:       # 配置文件、日志文件和数据文件挂载
      - './config:/etc/gitlab'
      - './logs:/var/log/gitlab'
      - './data:/var/opt/gitlab'

docker-compose up -d

docker exec -it gitlab bash
	cat /etc/gitlab/initial_root_password
管理端修改密码

#2.[Java & Maven]

#2.[Java & Maven]
Maven:https://maven.apache.org/
apache-maven-3.6.2-bin.zip

unzip apache-maven-3.6.2-bin.zip -d /usr/local/
mv apache-maven-3.6.2/ mvn

vim settings.xml
[1] 159行
<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>*</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
[2] 253行
  
         <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>
  
[3] 275行
  <activeProfiles>
    <activeProfile>jdk8</activeProfile>
  </activeProfiles>

#配置JDK17
#jdk-8u241-linux-x64.tar.gz
#tar -zxvf jdk-8u241-linux-x64.tar.gz -C /usr/local/

tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk-17.0.11
#export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tool.jar

#3.配置代理

#设置代理
[服务器本地代理]
curl -ksSL http://120.232.240.71:8887/linux/install.sh | bash
pigchacli
unset https_proxy http_proxy
export https_proxy=http://127.0.0.1:15777 http_proxy=http://127.0.0.1:15777

[Docker代理]-service下添加环境变量
vim /lib/systemd/system/docker.service
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:15777"
Environment="HTTPS_PROXY=http://127.0.0.1:15777"

docker info | grep Proxy
	HTTP Proxy: http://127.0.0.1:15777
	HTTPS Proxy: http://127.0.0.1:15777
docker pull registry.k8s.io/metrics-server/metrics-server:v0.7.0

[Git代理]
清理git代理执行:git config --global --unset https.proxy && git config --global --unset http.proxy
设置git代理执行:git config --global http.proxy http://127.0.0.1:15777 && git config --global https.proxy http://127.0.0.1:15777

#4.安装Jenkins(使用war包下载 成功下载插件)

#3.安装Jenkins 使用war包下载 成功下载插件

# jenkinswar-2.401.1
# https://get.jenkins.io/war-stable/2.401.1/jenkins.war
java -jar jenkins.war

#5.配置Jenkins全局配置  JDK、MAVEN、Publish Over SSH

#4.配置Jenkins全局配置  JDK MAVEN
JDK17 /usr/local/jdk
MVN3.6.2 /usr/local/mvn

#5.安装 Publish Over SSH 插件
Publish Over SSH
Dashboard-系统管理-System - Configuration - Publish over SSH

JDK17

MVN-3.6.2

Pushlish over SSH

提前创建 目录/usr/local/test

#自由风格-案例一 (实现CI端-)

#实现CI端 
#代码提交=>手动立即构建=>从GitHub拉去代码到本地=>Maven构建打包tar=>放入指定目录 使用docker build构建镜像=>进行测试
deploy/

#5.GitHub上传代码
https://github.com/BirkhoffXia/SpringBoot-HelloWorld.git

#6.【构建拉起GitHub代码】
vim Dockerfile
FROM daocloud.io/library/java:8u40-jdk
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

服务器上安装插件

git 自动拉取到 jenkins目录 :/root/.jenkins/workspace

[root@jenkins workspace]# ls -l /root/.jenkins/workspace/
total 0
drwxr-xr-x. 6 root root 184 Aug  4 13:42 first
[root@jenkins workspace]# ls -l /root/.jenkins/workspace/first/
total 32
drwxr-xr-x. 2 root root   164 Aug  4 13:42 deploy
-rw-r--r--. 1 root root   333 Aug  4 13:42 Dockerfile
-rw-r--r--. 1 root root  2917 Aug  4 13:42 Jenkinsfile
-rw-r--r--. 1 root root 11357 Aug  4 13:42 LICENSE
-rw-r--r--. 1 root root  2645 Aug  4 13:42 old-Jenkinsfile
-rw-r--r--. 1 root root  2502 Aug  4 13:42 pom.xml
-rw-r--r--. 1 root root  1266 Aug  4 13:42 README.md
drwxr-xr-x. 2 root root    56 Aug  4 13:42 rollouts
drwxr-xr-x. 4 root root    30 Aug  4 13:42 src

需要安装docker 和 docker-compose

如果遇到这个报错 不要紧 只需要在服务器上重新进行跑一下命令

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

#Sonarqube-代码审查

#Sonarqube
vim /etc/sysctl.conf
	vm.max_map_count=262144
sysctl -p

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.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

docker-compose up -d

登录网页:http://192.168.40.110:9000/

#安装中文插件
 Administration=> Chinese

wget https://github.com/xuhuisheng/sonar-l10n-zh/releases/download/sonar-l10n-zh-plugin-8.9/sonar-l10n-zh-plugin-8.9.jar
docker cp sonar-l10n-zh-plugin-8.9.jar 4a62a7941275:/opt/sonarqube/extensions/plugins
docker-compose restart

#如果本地开发添加配置-本地无IDE无需配置 
         <profile>    
            <id>sonar</id>    
            <activation>    
               <activeByDefault>true</activeByDefault>    
            </activation>    
            <properties>    
                    <sonar.login>admin</sonar.login>    
                    <sonar.password>sheca</sonar.password>    
                    <sonar.host.url>http://192.168.40.110:9000</sonar.host.url>    
                </properties>    
        </profile>

  <activeProfiles>
    <activeProfile>sonar</activeProfile>
  </activeProfiles>

sonarqube-xxx-token是从 Sonarqube 管理端我的-安全-令牌生成的

sonarqube 我的-安全-令牌 生成一个token 用于jenkins配置认证

#Sonar-scanner

#Sonar-Scanner
#安装sonar-scanner 用于扫描分析项目
#不一定要和sonarqube装到一个系统下,在哪扫就装哪
https://docs.sonarsource.com/sonarqube/latest/analyzing-source-code/scanners/sonarscanner/
https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-6.1.0.4477-linux-x64.zip
unzip sonar-scanner-cli-6.1.0.4477-linux-x64.zip

#将sonar-scanner-cli-4.8.0.2856-linux 移动到/usr/local/src
mv sonar-scanner-6.1.0.4477-linux-x64/ /usr/local/
cd /usr/local/
mv sonar-scanner-6.1.0.4477-linux-x64/ sonar-scanner/

#配置环境变量
vim /etc/profile
#Sonar-scanner
export SONAR_HOME=/usr/local/sonar-scanner/
export PATH=$PATH:$SONAR_HOME/bin

source /etc/profile

sonar-scanner -x

#配置sonar-scanner.properties 要配置 login名称和password 否则后面启动会报错
vim /usr/local/sonar-scanner/conf/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.40.110:9000

#----- Default source code encoding
sonar.sourceEncoding=UTF-8
sonar.login=admin
sonar.password=sheca

#使用以下成功审查代码
cd /root/.jenkins/workspace/myuser-vm 
sonar-scanner -Dsonar.sources=./ \
-Dsonar.projectname=linux-projectname \
-Dsonar.login=admin \
-Dsonar.password=sheca \
-Dsonar.projectKey=linux-projectkey \
-Dsonar.java.binaries=./target/
#注释
	-Dsonar.sources=./ :表示当前目录为项目目录
	-Dsonar.projectname=linux-test :随便去一个项目名字 在管理端显示
	-Dsonar.login=xxxxxxxxx : 此参数需要在snarqube页面中 => 我的账号-安全-生成令牌进行生成 或者使用登录账户
	-Dsonar.projectKey=linux-test :取一个名字
	-Dsonar.java.binaries=./target/  :编译过后的内容,检查好存放的路径
    
#Sonarqube管理端 用户-安全生成一个token [未成功]
cd /root/.jenkins/workspace/myuser-vm 
sonar-scanner -Dsonar.sources=./ \
-Dsonar.projectname=linux-projectname \
-Dsonar.login=f1836ac86326a03be981be7ea733119780546b60 \
-Dsonar.projectKey=DZZZ \
-Dsonar.java.binaries=./target/
 
#Jenkins配置Sonar-scanner
插件:Sonarqube Scanner
Dashboard 系统管理 System中 SonarQube  servers 配置
Dashboard 系统管理 全局工具配置 SonarQube Scanner配置
Dashboard myuser-vm Configuration Build Steps添加Execute SonarQube Scanner

添加一步sonarqube scanner结合Jenkins

 

#部署Harbor - 2.3.4版本(可以参考之前部署、本实验使用Aliyun ACR作为镜像平台)

#部署Harbor - 2.3.4版本
https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
http协议

#编写脚本、通知目标服务器 

push Harbor

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

vim deploy.sh
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

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

echo $imageName

#
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerId

if [ "$containerId" != "" ] ; then
  docker stop $containerId
  docker rm $containerId
fi

#
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag

if [[ "$tag" =~ "$version" ]] ; then
  docker rmi $imageName
fi

#
docker login --username=夏恺晟 --password=xks940319 $harbor_addr
docker push $imageName
docker run -d -p $host_port:$container_port --name $project $imageName

#把脚本添加到Jenkins中 使用构建后操作
mv deploy.sh /usr/bin
#添加2个字符参数
#要有执行权限所有需要把脚本放到有环境变量的路径
deploy.sh registry.cn-hangzhou.aliyuncs.com birkhoff ${JOB_NAME} $tag $container_port $host_port
#或者
pwd
cd /usr/local/running/
bash deploy.sh registry.cn-hangzhou.aliyuncs.com birkhoff ${JOB_NAME} $tag $host_port  $container_port 

push Aliyun

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

vim deploy.sh
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

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

echo $imageName

#
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerId

if [ "$containerId" != "" ] ; then
  docker stop $containerId
  docker rm $containerId
fi

#
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag

if [[ "$tag" =~ "$version" ]] ; then
  docker rmi $imageName
fi

#
docker login --username=夏恺晟 --password=xks940319 $harbor_addr
docker push $imageName
docker run -d -p $host_port:$container_port --name $project $imageName



#把脚本添加到Jenkins中 使用构建后操作
mv deploy.sh /usr/bin
#添加2个字符参数
#要有执行权限所有需要把脚本放到有环境变量的路径
deploy.sh registry.cn-hangzhou.aliyuncs.com birkhoff ${JOB_NAME} $tag $container_port $host_port
#或者
pwd
cd /usr/local/running/
bash deploy.sh registry.cn-hangzhou.aliyuncs.com birkhoff ${JOB_NAME} $tag $host_port  $container_port 
#
chmod 777 /etc/local/running/deploy.sh

#自由风格-案例二(实现CI端-)

General

源码管理

Build Step

构建后操作

deploy.sh

vim deploy.sh
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

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

echo $imageName

#
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerId

if [ "$containerId" != "" ] ; then
  docker stop $containerId
  docker rm $containerId
fi

#
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag

if [[ "$tag" =~ "$version" ]] ; then
  docker rmi $imageName
fi

#
docker login --username=夏恺晟 --password=xks940319 $harbor_addr
docker push $imageName
docker run -d -p $host_port:$container_port --name $project $imageName

#测试
deploy.sh registry.cn-hangzhou.aliyuncs.com birkhoff mytest v3.0.0 8083 8080
registry.cn-hangzhou.aliyuncs.com/birkhoff/mytest:v3.0.0

#Freesytle Pipeline

#自由风格
Pipeline: Stage View Plugin 版本2.34

pipeline {
    agent any

		environment {
			key = 'value'
		}
    stages {
        stage('[1]-拉去Git仓库代码') {
            steps {
                echo '[1]-拉去Git仓库代码 - SUCCESS'
            }
        }
        stage('[2]-通过MAVEN构建项目') {
            steps {
                echo '[2]-通过MAVEN构建项目 - SUCCESS'
            }
        }
        stage('[3]-通过SonarQube代码质量检测') {
            steps {
                echo '[3]-通过SonarQube代码质量检测 - SUCCESS'
            }
        }
        stage('[4]-通过Docker制作自定义镜像') {
            steps {
                echo '[4]-通过Docker制作自定义镜像 - SUCCESS'
            }
        }
        stage('[5]-将自定义镜像推送到Aliyun') {
            steps {
                echo '[5]-将自定义镜像推送到Aliyun - SUCCESS'
            }
        }    
        stage('[6]-通过Publish Over SSH通知目标服务器') {
            steps {
                echo '[6]-通过Publish Over SSH通知目标服务器 - SUCCESS'
            }
        }     
    }
}

#DingDing发送邮件

#安装插件 DingDing
#配置DingDing

#钉钉上配置机器人 和 关键字 webhook

#DingDing发送邮件
https://oapi.dingtalk.com/robot/send?access_token=3b6af47f31550290d622212b0400846405f3c7776bfe04f16170c8dd713a8927

#[Final-pipeline]

#[Final-pipeline]
pipeline {
    agent any

		environment {
			harborUser = 'xxx'
			harborPaswd = 'xxx'
			harborAddress = 'registry.cn-hangzhou.aliyuncs.com'
			harborRepo = 'birkhoff'
		}
    stages {
        stage('[1]-拉去Git仓库代码') {
            steps {
		checkout scmGit(branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'https://github.com/BirkhoffXia/SpringBoot-HelloWorld.git']])
                echo '[1]-拉去Git仓库代码 - SUCCESS'
            }
        }
        stage('[2]-通过MAVEN构建项目') {
            steps {
		sh '/usr/local/mvn/bin/mvn clean package -DskipTests'    
                echo '[2]-通过MAVEN构建项目 - SUCCESS'
            }
        }
        stage('[3]-通过SonarQube代码质量检测') {
            steps {
		sh '/usr/local/sonar-scanner/bin/sonar-scanner -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target -Dsonar.source=./ -Dsonar.login=admin -Dsonar.password=sheca '
                echo '[3]-通过SonarQube代码质量检测 - SUCCESS'
            }
        }
        stage('[4]-通过Docker制作自定义镜像') {
            steps {
		sh '''mv ./target/*.jar ./deploy
docker build -t ${JOB_NAME}:${tag} ./deploy/'''
		echo '[4]-通过Docker制作自定义镜像 - SUCCESS'
            }
        }
        stage('[5]-将自定义镜像推送到Aliyun') {
            steps {
		    sh '''docker login --username=${harborUser} --password=${harborPaswd} ${harborAddress}
docker tag ${JOB_NAME}:${tag}  ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
                echo '[5]-将自定义镜像推送到Aliyun - SUCCESS'
            }
        }    
        stage('[6.6]-通过Publish Over SSH通知目标服务器') {
            steps {
		sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh ${harborAddress} ${harborRepo} ${JOB_NAME} ${tag} ${host_port}  ${container_port}", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
		echo '[6]-通过Publish Over SSH通知目标服务器 - SUCCESS'
            }
        }     
    }
	post {
		success{
			dingtalk(
				robot: 'Jenkins-DingDing',
				type: 'MARKDOWN',
				title: "success: ${JOB_NAME}",
				text: ["- 成功构建: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString}"]
			)
		}
		failure{
			dingtalk(
				robot: 'Jenkins-DingDing',
				type: 'MARKDOWN',
				title: "success: ${JOB_NAME}",
				text: ["- 构建失败: ${JOB_NAME}! \n- 版本: ${tag} \n- 持续时间: ${currentBuild.durationString}"]
			)
		}
	}
}

#补充#Docker 安装Jenkins【未成功】

#Docker 安装Jenkins 
#替换插件无作用插件下载不下来 
[Jenkins]-192.168.40.101
docker pull jenkins/jenkins:2.319.1-lts
cat docker-compose.yml
version: "3.1"
services:
  jenkins:
    image: jenkins/jenkins:2.319.1-lts
    container_name: jenkins
    ports:
      - 8080:8080
      - 50000:50000
    volumes:
      - ./data/:/var/jenkins_home/

mkdir data && chmod -R 777 data
docker-compose up -d

#没有作用
vim data/hudson.model.UpdateCenter.xml
	http://mirror.esuni.jp/jenkins/updates/update-center.json

vim data/updates/default.json
	https://www.google.com => http://www.baidu.com/”
	https://updates.jenkins.io/download => https://mirrors.tuna.tsinghua.edu.cn/jenkins

docker-compose restart

docker logs -f jenkins
	d76b94c485b446d186d0b3b1f66ddddd
http://192.168.40.101:8080

#全自动触发流水线-GitLab通知出发自动构建

#参考 Magedu
https://www.bilibili.com/video/BV1HV4y1w716/?p=11&vd_source=61fd905c9c1b23355baeeb053f095db4

配置要点

1、配置GitLab允许外发

2、为GitLab用户添加Jenkins服务器的SSH公钥

#在Jenkins上生成公私钥

3、在Jenkins上通过凭证添加SSH私钥以认证到GitLab

#复制SSH密钥对的私钥信息,保存为Jenkins上的凭据

4、在GitLab上创建Access Token

#User Account  => Settings => Access Tokens

5、在Jenkins上授权启用/project端点以创建GitLab连接

#Manger Jenkins - Manage Plugins 安装GitLab插件

#将之前Gitlab生成的 Access Token 在Jenkins上配置成GitLab API Token

 

6、在Jenkins上授权启用/project端点以创建GitLab链接

#Manger Jenkins - Configure System

#这里配置需要加高级选项Ognore SSL Certificate Errors -否则会报错:

7、配置Jenknins项目可经由GitLab上的时间触发

8、GitLab 配置Webhooks

 

构建一个自由式风格流水线

流程图

General

源码管理

Build Steps

构建后操作

delpoy.sh 脚本

[root@maven ~]# cat /usr/local/running/deploy.sh
harbor_addr=$1
harbor_repo=$2
project=$3
version=$4
host_port=$5
container_port=$6

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

echo $imageName

#
containerId=`docker ps -a | grep ${project} | awk '{print $1}'`
echo $containerId

if [ "$containerId" != "" ] ; then
  docker stop $containerId
  docker rm $containerId
fi

#
tag=`docker images | grep ${project} | awk '{print $2}'`
echo $tag

if [[ "$tag" =~ "$version" ]] ; then
  docker rmi $imageName
fi

#
docker login --username=夏恺晟 --password=xxxxx $harbor_addr
docker push $imageName
docker run -d -p $host_port:$container_port --name $project $imageName

 

posted @ 2024-07-15 18:23  しみずよしだ  阅读(51)  评论(1)    收藏  举报