淘先锋技术网

首页 1 2 3 4 5 6 7

本文只对DevOps最基础的组件介绍及入门,不包含k8s的应用及讲解

1. 基础介绍

目前最基础的DevOps架构如下:
DevOps架构图

步骤:

  1. 程序员编写完代码之后将代码 pushGit
  2. Jenkins将代码 pull 到本地
  3. 使用Maven将本地代码打包
  4. 使用Docker将jar包做成镜像
  5. 将镜像 pushHarbor
  6. 在应用服务器上 pull Harbor上的镜像
  7. 在应用服务器上启动镜像

2. 架构分析

我们通过观察架构图,其实不难发现,整个架构可以分为三个环境,分别是开发环境、构建环境、线上环境。

如图:
在这里插入图片描述
开发环境:程序员开发代码的环境。
构建环境:安装Gitlab用以管理代码、Maven用以打包、Docker用以构建镜像、Harbor用以管理镜像。最后由Jenkins统一去调用、协调上述各组件的使用。
线上环境:运行应用的环境。

因此,只要我们在一台服务器上安装了GitlabMavenDockerHarborJenkins就能实现最基本的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}'"
                }
            }
        }
    }
}