DevOps
整体的软件开发流程包括:
PLAN:开发团队根据客户的⽬标制定开发计划
CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在⼀个库中。
BUILD:编码完成后,需要将代码构建并且运⾏。
TEST:成功构建项⽬后,需要测试代码是否存在BUG或错误。
DEPLOY:代码经过⼿动测试和⾃动化测试后,认定代码已经准备好部署并且交给运维团队。
OPERATE:运维团队将代码部署到⽣产环境中。
MONITOR:项⽬部署上线后,需要持续的监控产品。
INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核⼼,即持续集
成、持续部署
什么是devops
DevOps 强调的是⾼效组织团队之间如何通过⾃动化的⼯具协作和沟通来完成软件的⽣命周期管理,从⽽更快、更频繁地交付更稳定的软件。
Code阶段⼯具
在code阶段,我们需要将不同版本的代码存储到⼀个仓库中,常⻅的版本控制⼯具就是SVN或者Git,这⾥我们采⽤Git作为版本控制⼯具,GitLab作为远程仓库。
1 Git安装
yum -y install git
2 GitLab安装
单独准备服务器,采⽤Docker安装
查看GitLab镜像
docker search gitlab
拉取GitLab镜像
docker pull gitlab/gitlab-ce
准备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://10.1.106.68: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 up -d
访问GitLab⾸⻚
http://10.1.106.70:8929/
查看root⽤户初始密码
docker exec -it gitlab cat /etc/gitlab/initial_root_password
Build阶段⼯具
构建Java项⽬的⼯具⼀般有两种选择,⼀个是Maven,⼀个是Gradle。
这⾥我们选择Maven作为项⽬的编译⼯具。
具体安装Maven流程不做阐述,但是需要确保配置好Maven仓库私服以及JDK编译版本
Operate阶段⼯具
部署过程,会采⽤Docker进⾏部署,暂时只安装Docker即可,后续还需安装Kubenetes
# Docker安装
1、移除以前docker相关包
sudo yum remove docker*
2、配置yum源
可选择备份repo文件(有备无患)
sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
首先下载阿里云的repo配置文件
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
更新完repo文件后,需要清空并重建YUM的元数据缓存,以便让它认识新的仓库配置
sudo yum clean all
sudo yum makecache
重新安装
yum install -y yum-utils
配置yum源
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
启动docker(开机自启,现在就执行)
systemctl enable docker --now
配置加速
这里额外添加了docker的生产环境核心配置cgroup
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [ "https://docker.1panel.live","https://docker.m.daocloud.io","https://hub.rat.dev"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# 2 Docker-Compose安装
下载Docker/Compose:https://github.com/docker/compose
将下载好的docker-compose-Linux-x86_64⽂件移动到Linux操作系统:……
设置docker-compose-Linux-x86_64⽂件权限,并移动到$PATH⽬录中
# 设置⽂件权限
chmod a+x docker-compose-Linux-x86_64
# 移动到/usr/bin⽬录下,并重命名为docker-compose
mv docker-compose-Linux-x86_64 /usr/bin/docker-compose
Integrate⼯具
资源规划
10.1.106.70 Jenkins sonarqube gitlab 服务器
10.1.106.67 部署节点
10.1.106.68 Harbor节点
注意gitlab和harbor 装在⼀个节点端⼝冲突
持续集成、持续部署的⼯具很多,其中Jenkins是⼀个开源的持续集成平台。
Jenkins涉及到将编写完毕的代码发布到测试环境和⽣产环境的任务,并且还涉及到了构建项⽬等任务。
Jenkins需要⼤量的插件保证⼯作,安装成本较⾼,下⾯会基于Docker搭建Jenkins。
Jenkins介绍
Jenkins是⼀个开源软件项⽬,是基于Java开发的⼀种持续集成⼯具
Jenkins应⽤⼴泛,⼤多数互联⽹公司都采⽤Jenkins配合GitLab、Docker、K8s作为实现DevOps的核⼼⼯具。
Jenkins最强⼤的就在于插件,Jenkins官⽅提供了⼤量的插件库,来⾃动化CI/CD过程中的各种琐碎功能。
Jenkins最主要的⼯作就是将GitLab上可以构建的⼯程代码拉取并且进⾏构建,再根据流程可以选择发布到测试环
境或是⽣产环境。
⼀般是GitLab上的代码经过⼤量的测试后,确定发⾏版本,再发布到⽣产环境。
CI/CD可以理解为:
CI过程即是通过Jenkins将代码拉取、构建、制作镜像交给测试⼈员测试。
持续集成:让软件代码可以持续的集成到主⼲上,并⾃动构建和测试。
CD过程即是通过Jenkins将打好标签的发⾏版本代码拉取、构建、制作镜像交给运维⼈员部署。
持续交付:让经过持续集成的代码可以进⾏⼿动部署。
持续部署:让可以持续交付的代码随时随地的⾃动化部署。
Jenkins安装
拉取Jenkins镜像
docker pull jenkins/jenkins
#使⽤
docker pull jenkins/jenkins:2.396-centos7
编写docker-compose.yml
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.396-centos7
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
⾸次启动会因为数据卷data⽬录没有权限导致启动失败,设置data⽬录写权限
mkdir -p data
chmod -R a+w data/
重新启动Jenkins容器后,由于Jenkins需要下载⼤量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站
# 修改数据卷中的hudson.model.UpdateCenter.xml⽂件
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>https://updates.jenkins.io/update-center.json</url>
</site>
</sites>
# 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
</site>
</sites>
# 清华⼤学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/updatecenter.json
再次重启Jenkins容器,访问Jenkins
查看密码登录Jenkins,并登录下载插件
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
配置Maven构建代码
https://maven.apache.org/download.cgi
#maven 下载
https://dlcdn.apache.org/maven/maven-3/3.6.3/binaries/
#jdk下载
Java Archive | Oracle
Java Archive Downloads - Java SE 8u211 and later (oracle.com)
代码拉取到Jenkins本地后,需要在Jenkins中对代码进⾏构建,这⾥需要Maven的环境,⽽Maven需要Java的环
境,接下来需要在Jenkins中安装JDK和Maven,并且配置到Jenkins服务。
准备JDK、Maven压缩包通过数据卷映射到Jenkins容器内部
解压压缩包,并配置Maven的settings.xml
[root@180-143 data]# tar xf apache-maven-3.6.3-bin.tar.gz
[root@180-143 data]# tar xf jdk-8u231-linux-x64.tar.gz
[root@180-143 data]# mv apache-maven-3.6.3 maven
[root@180-143 data]# mv jdk1.8.0_231 jdk
[root@180-143 conf]# pwd
/root/docker/jenkins/data/maven/conf
<!-- 阿⾥云镜像地址 -->
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
<!-- JDK1.8编译插件 -->
<profile>
<id>jdk-1.8</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>
CI、CD⼊⻔操作
# 持续集成
为了让程序代码可以⾃动推送到测试环境基于Docker服务运⾏,需要添加Docker配置和脚本⽂件让程序可以在集
成到主⼲的同时运⾏起来。
添加Dockerfile⽂件
# 使⽤官⽅的Java 8镜像作为基础镜像
FROM openjdk:8
# 将本地的jar⽂件复制到容器中
COPY *.jar /usr/local/demo.jar
# 设置⼯作⽬录
WORKDIR /usr/local/
# 运⾏jar⽂件
CMD ["java", "-jar", "demo.jar"]
集成Sonar Qube
Sonar Qube是⼀个开源的代码分析平台,⽀持Java、Python、PHP、JavaScript、CSS等25种以上的语⾔,可以检
测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。
Sonar Qube可以与多种软件整合进⾏代码扫描,⽐如Maven,Gradle,Git,Jenkins等,并且会将代码检测结果
推送回Sonar Qube并且在系统提供的UI界⾯上显示出来
Sonar Qube安装
Sonar Qube在7.9版本中已经放弃了对MySQL的⽀持,并且建议在商业环境中采⽤PostgreSQL,那么安装Sonar
Qube时需要依赖PostgreSQL。
并且这⾥会安装Sonar Qube的⻓期⽀持版本8.9
拉取镜像
docker pull postgres
docker pull sonarqube:8.9.3-community
编写docker-compoe.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.3-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
Sonar Qube基本使⽤
Sonar Qube的使⽤⽅式很多,Maven可以整合,也可以采⽤sonar-scanner的⽅式,再查看Sonar Qube的检测效
果
Maven实现代码检测
修改Maven的settings.xml⽂件配置Sonar Qube信息
<profile>
<id>sonar</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonar.login>admin</sonar.login>
<sonar.password>wingpwd123</sonar.password>
<sonar.host.url>http://10.1.106.70:9000</sonar.host.url>
</properties>
</profile>
Sonar-scanner实现代码检测
下载Sonar-scanner:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/
下载4.6.x版本即可,要求Linux版本
解压并配置sonar服务端信息
由于是zip压缩包,需要安装unzip解压插件
yum -y install unzip
解压压缩包
unzipsonar-scanner-cli-4.6.0.2311-linux.zip
配置sonarQube服务端地址,修改conf下的sonar-scanner.properties
sonar.login=admin
sonar.password=密码
执⾏命令检测代码
# 在项⽬所在⽬录执⾏以下命令
cd /root/docker/jenkins/data/workspace/test
/root/docker/sonarqube/sonar-scanner-4.6.0.2311-linux/bin/sonar-scanner -
Dsonar.sources=./ -Dsonar.projectname=demo -Dsonar.projectKey=java -
Dsonar.java.binaries=target/
# Jenkins集成Sonar Qube
Jenkins继承Sonar Qube实现代码扫描需要先下载整合插件
配置Sonar-scanner
将Sonar-scaner添加到Jenkins数据卷中并配置全局配置
[root@180-143 sonarqube]# cp sonar-scanner-4.6.0.2311-linux/
/root/docker/jenkins/data/sonar-scanner -r
集成Harbor
下载Harbor安装包:https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz
tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/
修改Harbor配置⽂件:
⾸先复制⼀份harbor.yml配置
cp harbor.yml.tmpl harbor.yml
编辑harbor.yml配置⽂件
hostname 设置harbor地址
注释https
harbor_admin_passwd harbor默认密码
启动Harbor
./install.sh
Jenkins容器使⽤宿主机Docker
构建镜像和发布镜像到harbor都需要使⽤到docker命令。⽽在Jenkins容器内部安装Docker官⽅推荐直接采⽤宿主机带的Docker即可。
设置Jenkins容器使⽤宿主机Docker
设置宿主机docker.sock权限:
sudo chown root:root /var/run/docker.sock
sudo chmod o+rw /var/run/docker.sock
添加数据卷
version: "3.1"
services:
jenkins:
image: jenkins/jenkins
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
添加构建操作
mv target/*.jar docker/
docker build -t demo:$tag docker/
docker login -utest -pWazxpwd123 10.1.106.68
docker tag demo:$tag 10.1.106.68/repository/demo:$tag
docker push 10.1.106.68/repository/demo:$tag
编写部署脚本
部署项⽬需要通过Publish Over SSH插件,让⽬标服务器执⾏命令。为了⽅便⼀次性实现拉取镜像和启动的命令,
推荐采⽤脚本⽂件的⽅式。
添加脚本⽂件到⽬标服务器,再通过Publish Over SSH插件让⽬标服务器执⾏脚本即可。
编写脚本⽂件,添加到⽬标服务器
harbor_url=$1
harbor_project_name=$2
project_name=$3
tag=$4
port=$5
host_port=$6
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
docker login -u wing -pWingpwd123 $harbor_url
docker pull $imageName
docker run -d -p $host_port:$port --name $project_name $imageName
echo "Start Container Success"
echo $project_name
并设置权限为可执⾏
chmod a+x deploy.sh
sh /app/test/deploy.sh 10.1.106.68 repository ${JOB_NAME} $tag $contailer_port
$host_port
sh -x deploy.sh 10.1.106.68 repository demo v1.0 8080 8888
Jenkins流⽔线
之前采⽤Jenkins的⾃由⻛格构建的项⽬,每个步骤流程都要通过不同的⽅式设置,并且构建过程中整体流程是不可⻅的,⽆法确认每个流程花费的时间,并且问题不⽅便定位问题。
Jenkins的Pipeline可以让项⽬的发布整体流程可视化,明确执⾏的阶段,可以快速的定位问题。并且整个项⽬的⽣命周期可以通过⼀个Jenkinsfile⽂件管理,⽽且Jenkinsfile⽂件是可以放在项⽬中维护。
所以Pipeline相对⾃由⻛格或者其他的项⽬⻛格更容易操作。
Jenkins流⽔线任务
构建任务
⽣成Groovy脚本
Groovy脚本基础语法
// 所有脚本命令包含在pipeline{}中
pipeline {
// 指定任务在哪个节点执⾏(Jenkins⽀持分布式)
agent any
// 配置全局环境,指定变量名=变量值信息
environment{
host = '10.1.106.68'
}
// 存放所有任务的合集
stages {
// 单个任务
stage('任务1') {
// 实现任务的具体流程
steps {
echo 'do something $host'
}
}
// 单个任务
stage('任务2') {
// 实现任务的具体流程
steps {
echo 'do something 2'
}
}
// ……
}
}
编写例⼦测试
pipeline {
agent any
// 存放所有任务的合集
stages {
stage('拉取Git代码') {
steps {
echo '拉取Git代码'
}
}
stage('检测代码质量') {
steps {
echo '检测代码质量'
}
}
stage('构建代码') {
steps {
echo '构建代码'
}
}
stage('制作⾃定义镜像并发布Harbor') {
steps {
echo '制作⾃定义镜像并发布Harbor'
}
}
stage('基于Harbor部署⼯程') {
steps {
echo '基于Harbor部署⼯程'
}
}
}
}

浙公网安备 33010602011771号