通过Jenkins Pipeline实现自动化部署

2021-08-18 14:57:13 浏览数 (1)

阅读本文大约需要2.3分钟

前言

在之前讲解自动化测试的文章中我多次提及agent这个工具,具体它主要提供哪些服务以及是如何部署的,今天来跟大家聊一聊。我个人比较喜欢通过具体的问题去实践和落地一项技术,然后再回过头来去丰富过程中涉及的理论知识,在我们的自动化测试系统中,我开发了一个小工具agent,用来管理宿主机挂载的测试设备(Android、iOS手机)的连接状态和使用状态(在线、离线、忙碌),然后服务端通过获取到的这些状态用一种负载均衡算法来调度自动化任务的执行。

因为我们的自动化系统有个小集群,每次agent更新版本后都要在这些集群中的所有机器上重新部署,我想每次在每台机器上的操作步骤都差不多,于是决定通过Jenkins Pipeline和Supervisor的方式来自动化的部署和管理这个工具(服务)。

Jenkins Pipeline 基于 Groovy 中的领域特定语言(DSL),提供了非常强大的方法来开发复杂、多步的DevOps Pipeline 。

而Supervisor可以在机器出现断电重启或者agent进程意外挂掉的情况下自动拉起,可以参考我之前写的一篇文章《自动化测试之进程管理》。

安装Jenkins Pipeline插件

在插件中心搜索并安装Jenkins Pipiline 插件套装。

与 Freestyle 任务不同,Pipeline 可以在单个Job中完成所有的任务编排。

增加Webhook触发器

增加webhook,当代码库有更新时,自动触发相应的单元测试任务、构建任务、部署任务、文档生成任务等。

Jenkinsfile文件中加入下面这段配置:

代码语言:javascript复制
triggers {    pollSCM ''
  }

像写代码一样开发你的 Pipeline

使用这个功能可以让你像做其他软件开发一样将 Pipeline 配置文件以 Jenkinsfile 的方式存储在 SCM 中,然后进行版本迭代。

这样做可以将 Pipeline 作为代码来看待,强制执行良好的规范。

注意:将流水线脚本命名为:Jenkinsfile 。

在 Stage 块内进行作业

Pipeline 内的任何非安装作业都应该在某一个 Stage 块内执行。

这是因为 Stage 是 Pipeline 的逻辑分割,可以将工作分为几个 Stage,这样可以将 Pipeline 分成清晰的几个步骤,如下所示:

代码语言:javascript复制
stages {stage('Build on robert') {
        agent {
            label 'master'
        }
        steps {
            sh 'bash -x -s < build_agent.sh'
        }
    }
    stage('Deploy on robert') {
        agent {
            label 'master'
        }
        steps {
            sh 'bash -x -s < deploy_agent.sh'
        }
    }
}

Blue Ocean 插件将各个 Stage 看作 Pipeline 的唯一分段。

在节点内执行实际作业

Pipeline 里的实质性作业都应该发生在一个 Node 块内。

因为在默认情况下,Jenkinsfile 脚本本身在 Jenkins 主机上运行。 在任何实质性作业过程中,例如从 Git 服务器克隆代码或编译项目,都应该利用 Jenkins 分布式构建能力,在代理节点中运行。

完整的配置文件

Jenkinsfile:

代码语言:javascript复制
// Declarative //pipeline {
    agent none
    triggers {
        pollSCM ''
    }
    stages {
        stage('Build on robert') {
            agent {
                label 'master'
            }
            steps {
                sh 'bash -x -s < build_agent.sh'
            }
        }
        stage('Deploy on bernard') {
            agent {
                label 'bernard'
            }
            steps {
                sh 'bash -x -s < deploy_agent.sh'
            }
        }
        stage('Deploy on dolores') {
            agent {
                label 'dolores'
            }
            steps {
                sh 'bash -x -s < deploy_agent.sh'
            }
        }
        stage('Deploy on robert') {
            agent {
                label 'master'
            }
            steps {
                sh 'bash -x -s < deploy_agent.sh'
            }
        }
        stage('Deploy Doc on dolores') {
            agent {
                label 'dolores'
            }
            steps {
                sh 'bash -x -s < build_doc.sh'
            }
        }
    }
}

build_agent.sh:

代码语言:javascript复制
if [ ! -d "venv" ]; then
    virtualenv -p /usr/bin/python2.7 venv
fi
. venv/bin/activate
pip install -r requirements.txt
rm -rf dist/*
make release

deploy_agent.sh:

代码语言:javascript复制
cd /Users/test
supervisorctl -u root -p test stop agent
sudo pip uninstall -y ***
pip install *** --no-cache-dir
lsof -i tcp:9096 | awk 'NR==2{print}' | awk '{print $2}'|xargs sudo kill -9
ps aux | grep adb | grep -v grep | awk '{print $2}'|xargs sudo kill -9
supervisorctl -u root -p test start agent

build_doc.sh:

代码语言:javascript复制
if [ ! -d "venv" ]; then
    virtualenv -p /usr/bin/python2.7 venv
fi
. venv/bin/activate
pip install -r requirements.txt
cd docs
make html
cp -fr _build/html/* /Users/test/ftp/agent.doc/

推荐阅读:

自动化测试之进程管理

自动化质量评估维度

终端自动化测试探索之路

想要明白些道理,遇见些有趣的事 —— 离岛

0 人点赞