本文只对DevOps最基础的组件介绍及入门,不包含k8s的应用及讲解
1. 基础介绍
目前最基础的DevOps架构如下:
步骤:
- 程序员编写完代码之后将代码 push 到
Git
上 Jenkins
将代码 pull 到本地- 使用
Maven
将本地代码打包 - 使用
Docker
将jar包做成镜像 - 将镜像 push 到
Harbor
上 - 在应用服务器上 pull
Harbor
上的镜像 - 在应用服务器上启动镜像
2. 架构分析
我们通过观察架构图,其实不难发现,整个架构可以分为三个环境,分别是开发环境、构建环境、线上环境。
如图:
开发环境:程序员开发代码的环境。
构建环境:安装Gitlab
用以管理代码、Maven
用以打包、Docker
用以构建镜像、Harbor
用以管理镜像。最后由Jenkins
统一去调用、协调上述各组件的使用。
线上环境:运行应用的环境。
因此,只要我们在一台服务器上安装了Gitlab
、Maven
、Docker
、Harbor
、Jenkins
就能实现最基本的DevOps,这台服务器我们可以称之为构建环境的服务器。
3. 自动化脚本设计
我们通过观察上述三个环境,其实可以得出整个构建过程就只有打包过程(构建环境)和启动过程(线上环境),因此,我们设计脚本的时候,也可以设计自动打包脚本和启动脚本,这些脚本的运行直接交由给Jenkins
执行即可。
以下是Jenkins自动化脚本的案例,大家可以参考:
打包过程脚本:
pipeline {
agent any
tools {
jdk 'jdk1.8'
}
environment {
// 构建的工程
buildProject="core"
//项目名称
projectName = "transaction_test"
warName = "transactiontest"
// 拉取代码的git路径
gitUrl = 'http://172.18.35.123:1808/test/transaction_test.git'
// 项目分支名
gitBranch = 'master'
// harbor仓库地址配置
harborUrl = '172.18.35.123:1188'
harborDomain = 'harbor.test.com:1188'
harborUserName = 'admin'
harborPassword = '123456'
}
stages {
// 拉取git特定分支的代码
stage('pull') {
steps {
git branch: "$gitBranch", url: "$gitUrl"
sh 'echo "拉取分支成功"'
}
}
// maven编译代码
stage('clean-package') {
steps {
script {
if(forceBuild == "true" || currentBuild.changeSets.size() > 0) {
sh '/usr/local/apache-maven-3.6.3/bin/mvn clean package -P $active_profiles -Dmaven.test.skip=true -f pom.xml'
}
}
}
}
stage('docker-build') {
steps {
script {
if(forceBuild == "true" || currentBuild.changeSets.size() > 0) {
sh 'rm -rf ./buildTmp'
sh 'mkdir ./buildTmp'
sh 'cp ./${buildProject}/target/${warName}.war ./buildTmp'
sh 'cp -r ./tomcat ./buildTmp'
sh 'cp ./docker/Dockerfile ./buildTmp'
sh 'echo "复制构建镜像的文件到buildTmp文件夹成功"'
sh 'docker build -t ${projectName}:${harborProject} ./buildTmp'
sh 'echo "docker build 成功"'
}
}
}
}
// docker推送镜像到harbor
stage('docker-deploy') {
steps {
script {
try {
if(forceBuild == "true" || currentBuild.changeSets.size() > 0) {
sh 'docker tag ${projectName}:${harborProject} ${harborUrl}/${harborProject}/${projectName}:${harborProject}'
// docker登录harbor
sh "docker login -u ${harborUserName} -p ${harborPassword} ${harborUrl}"
// 推送镜像到harbor仓库
sh 'docker push ${harborUrl}/${harborProject}/${projectName}:${harborProject}'
// 删除旧容器
sh 'docker rmi ${projectName}:${harborProject}'
}
}catch (exc) {
echo '第一次部署没有以前的镜像,会报错,不影响后续流程'
}
}
}
}
}
}
启动过程脚本:
脚本中的变量deployUser(部署服务器的用户名)、deployIP(部署服务器的IP地址)、harborProject(镜像名)都应该是Jenkins
构建时由用户自行选择的
pipeline {
agent any
tools {
jdk 'jdk1.8'
}
environment {
// 构建的工程
buildProject="core"
//项目名称
projectName = "transaction_test"
warName = "transactiontest"
// 拉取代码的git路径
gitUrl = 'http://172.18.35.123:1808/test/transaction_test.git'
// harbor仓库地址配置
harborUrl = '172.18.35.123:1188'
harborDomain = 'harbor.test.com:1188'
harborUserName = 'admin'
harborPassword = '123456'
}
stages {
// docker 部署docker并运行镜像
stage('docker-run') {
steps {
echo '开始执行run'
script{
sh 'ssh ${deployUser}@${deployIP} -tt "docker pull ${harborDomain}/${harborProject}/${projectName}:${harborProject}"'
try {
sh 'ssh ${deployUser}@${deployIP} -tt "docker stop ${projectName};docker rm ${projectName}"'
}catch (exc) {
echo '删除容器出错,不影响后续流程,继续运行'
}
try {
// 删除镜像名为none的镜像
sh 'docker rmi $(docker images |grep none|grep ${harborProject}| awk \'{print $3}\')'
sh 'ssh ${deployUser}@${deployIP} -tt "docker rmi $(docker images |grep none|grep ${harborProject}| awk \'{print $3}\')"'
}catch (exc) {
echo '删除名为none的镜像出错,不影响后续流程,继续运行'
}
def volumn = "-v /mnt/software/apache-tomcat-8.5.88/logs:/usr/local/tomcat/logs -v /mnt/Pictures/resources/uploadingImage:/mnt/Pictures/resources/uploadingImage -v /etc/localtime:/etc/localtime:ro"
def ports = "-p 8080:8080 -p 12345:12345"
def imageName = "$harborDomain/${harborProject}/$projectName:${harborProject}"
sh "ssh ${deployUser}@${deployIP} -tt ' docker run -d ${ports} ${volumn} --name $projectName --restart=always ${imageName}'"
}
}
}
}
}