Devops
一、DevOps介绍
软件开发最开始是由两个团队组成:
开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。
运维团队将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。
这看似两个目标不同的团队需要协同完成一个软件的开发。
在开发团队指定好计划并完成coding后,需要提供到运维团队。
运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。
这时开发团队需要经常等待运维团队的反馈。这无疑延长了事件并推迟了整个软件开发的周期。
会有一种方式,在开发团队等待的时候,让开发团队转移到下一个项目中。等待运维团队为之前的代码提供反馈。
可是这样就意味着一个完整的项目需要一个更长的周期才可以开发出最终代码。
基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。
那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。
DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。
虽然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。
网上可以查看到DevOps的符号类似于一个无穷大的符号。
这表明DevOps是一个不断提高效率并且持续不断工作的过程。
DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。
核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。
整体的软件开发流程包括:
PLAN:开发团队根据客户的目标制定开发计划
CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
BUILD:编码完成后,需要将代码构建并且运行。
TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
OPERATE:运维团队将代码部署到生产环境中。
MONITOR:项目部署上线后,需要持续的监控产品。
INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心,即持续集成、持续部署。
为了保证整体流程可以高效的完成,各个阶段都有比较常见的工具,如下图:
最终可以给DevOps下一个定义:DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。
自动化的工具协作和沟通来完成软件的生命周期管理
二、Code阶段工具
在code阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓(github、gitee)。
2.1 Git安装
https://git-scm.com/
2.2 GitLab安装
环境: 宿主机ip 192.168.100.10
单独准备服务器,采用Docker安装
首先先安装docker,步骤如下
sudo yum update -y
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //配备阿里云仓库
sudo yum install docker-ce docker-ce-cli containerd.io
docker version
systemctl enable docker --now
systemctl status docker
配备阿里云容器镜像加速服务,可以自己注册属于自己的阿里云加速服务:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
关闭防火墙
systemctl disable firewalld --now
1.查看GitLab镜像
docker search gitlab
2.拉取gitlab镜像
docker search gitlab
docker pull gitlab/gitlab-ce
docker images
3.启动容器
运行容器
docker run -d \
--hostname 192.168.100.10 \
--name gitlab \
--restart always \
-p 8081:443 -p 8080:80 -p 8082:22 \
-v /etc/localtime:/etc/localtime:ro \
-v /usr/local/gitlab_data/gitlab/config:/etc/gitlab \
-v /usr/local/gitlab_data/gitlab/logs:/var/log/gitlab \
-v /usr/local/gitlab_data/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce
参数说明
-d 指定后台运行
–hostname 指定主机名
–name 指定容器名
-p 端口映射 443 https端口 80 http端口 22 ssh端口
–restart always 容器停止后的重启策略: 容器退出时总是重启
-v 指定挂载存储卷首先在宿主主机创建对应的目录
查看容器状态
docker ps -a
然后打开浏览器访问 192.168.100.10:8080 (如果浏览器显示502,稍等片刻即可)
4.查看gitlab密码
查看容器id
docker ps -a
进入容器
docker exec -it 容器id bash
查看密码文件
cat /etc/gitlab/initial_root_password
然后在浏览器登录 root+查询到的密码
*注意:查询到的密码,24小时后就会消失,所以要及时修改密码
另外!如果忘记密码用以下方法!!!
1.进入容器
docker exec -it 容器ID bash
2.输入命令修改密码
gitlab-rails console -e production
3.选择管理员用户
user = User.where(id: 1).first
4.修改密码为指定密码
user.password='l*******s'
5.保存,如果没有问题返回为True
user.save!
三、Build阶段工具
环境:宿主机ip:192.168.100.11
构建Java项目的工具一般有两种选择,一个是Maven,一个是Gradle。
这里我们选择Maven作为项目的编译工具。
具体安装Maven流程不做阐述,但是需要确保配置好Maven仓库私服以及JDK编译版本。法后生成一个完美的目录。
JDK下载地址:https://www.oracle.com/cn/java/technologies/downloads/#jdk17-linux
这里我下载了 jdk-17_linux-x64_bin.tar.gz
Maven下载地址:https://maven.apache.org/download.cgi
这里我下载了 apache-maven-3.9.7-bin.tar.gz
接着把两个tar包拉进虚拟机192.168.100.11里面
tar -zxvf jdk-17_linux-x64_bin.tar.gz -C /usr/local/
注意:这里宿主机不需要进行编译操作,所以不需要配置环境变量了
tar -zxvf apache-maven-3.9.7-bin.tar.gz -C /usr/local/
mv jdk-17/ jdk/
mv apache-maven-3.9.7/ maven/
配置maven
cd maven/conf/
vi setting.xml
1.设置私服,设置为maven阿里云的仓库地址
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
添加如图
2.配置maven编译插件
maven 这使用 jdk17版本,找到标签,往其中添加:
<profile>
<id>jdk17</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>17</jdk>
</activation>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.compilerVersion>17</maven.compiler.compilerVersion>
</properties>
</profile>
配置如图:
3.配置默认开启active profile
<activeProfiles>
<activeProfile>jdk17</activeProfile>
</activeProfiles>
4.最后保存退出
四、Operate阶段工具
部署过程,会采用Docker进行部署,暂时只安装Docker即可,后续还需安装Kubenetes
4.1 Docker安装
准备测试环境&生产环境
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo //配备阿里云仓库
sudo yum install docker-ce docker-ce-cli containerd.io
docker version
systemctl enable docker --now
systemctl status docker
测试安装成功
4.2 Docker-Compose安装
下载Docker/Compose:https://github.com/docker/compose
将下载好的docker-compose-Linux-x86_64文件移动到Linux操作系统:……
设置docker-compose-Linux-x86_64文件权限,并移动到$PATH目录中
chmod +x docker-compose-linux-x86_64
mv docker-compose-linux-x86_64 docker-compose
echo $PATH
mv docker-compose /usr/bin/ //把docker-compose放到/usr/bin/目录下
在任意地方可执行docker-compose version 证明测试安装成功
五、Integrate工具
持续集成、持续部署的工具很多,其中Jenkins是一个开源的持续集成平台。
Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。
Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。
yum-config-manager --add-repo http://mirrors.aliyun.com/dockerce/linux/centos/docker-ce.repo
yum -y install docker-ce
5.1 Jenkins介绍
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具
Jenkins应用广泛,大多数互联网公司都采用Jenkins配合GitLab、Docker、K8s作为实现DevOps的核心工具。
Jenkins最强大的就在于插件,Jenkins官方提供了大量的插件库,来自动化CI/CD过程中的各种琐碎功能。
Jenkins最主要的工作就是将GitLab上可以构建的工程代码拉取并且进行构建,再根据流程可以选择发布到测试环境或是生产环境。
一般是GitLab上的代码经过大量的测试后,确定发行版本,再发布到生产环境。
CI/CD可以理解为:
CI过程即是通过Jenkins将代码拉取、构建、制作镜像交给测试人员测试。
持续集成:让软件代码可以持续的集成到主干上,并自动构建和测试。
CD过程即是通过Jenkins将打好标签的发行版本代码拉取、构建、制作镜像交给运维人员部署。
持续交付:让经过持续集成的代码可以进行手动部署。
持续部署:让可以持续交付的代码随时随地的自动化部署。
5.2 Jenkins安装
拉取镜像地址:https://hub.docker.com/r/jenkins/jenkins (拉取LTS版本)
拉取镜像
docker pull jenkins/jenkins
准备docker-compose.yml文件
cd /usr/local
mkdir docker/
cd /docker
mkdir jenkins_docker
cd jenkins_docker
vi docker-compose.yml
文件内容如下:(注意缩进格式)
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.452.2-lts
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
执行文件
docker-compose up -d
查看容器日志发现首次启动会因为数据卷data目录没有权限导致启动失败,所以要设置data目录写权限
赋予权限(暴力点)
chmod 777 -R data
重启容器
docker-compose restart
查看日志获取密码
docker-compose logs -f jenkins
浏览器登录jenkins
上面方法不行就用下面的,下面比较简单
方法二
使用docker run方式
docker run -d \
-p 8080:8080 \
-p 50000:50000 \
--name jenkins \
-v $(pwd)/data:/var/jenkins_home \
jenkins/jenkins:2.452.2-lts
-d 参数表示以后台模式运行容器。
-p 8080:8080 映射容器内的 8080 端口到主机的 8080 端口,用于访问 Jenkins Web 界面。
-p 50000:50000 映射容器内的 50000 端口到主机的 50000 端口,用于 Jenkins 的 agent 节点通信。
–name jenkins 指定容器的名称为 jenkins。
-v $(pwd)/data:/var/jenkins_home 将本地目录 ./data 映射到容器内的 /var/jenkins_home,用于持久化 Jenkins 数据。 jenkins/jenkins:2.452.2-lts 是 Jenkins 镜像名称和标签。
查看容器状态会发现容器启动失败,查看容器日志知道原因也是/data权限问题
docker ps -a
docker logs 容器id
修改权限
chmod 777 -R data
重启容器
docker restart 容器id
查看容器日志获得密码
docker logs 容器id
或者
docker logs jenkins
附:重新启动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/update-center.json
然后重启容器,查询密码,再访问浏览器
docker-compose restart
选择插件安装,然后什么都不另外选择进行安装
注意:下载不成功的话可以去jenkins.io官网选择plugins选择插件进行安装
直接点击“继续”
创建用户