专业的编程技术博客社区

网站首页 > 博客文章 正文

持续集成工具 Jenkins 的使用(jenkins持续集成自动化测试)

baijin 2024-09-20 12:27:02 博客文章 3 ℃ 0 评论

Jenkins是一款开源CI&CD软件,用于自动化各种任务,包括构建、测试和部署软件.

Jenkins支持各种运行方式,可通过系统包,Docker或者通过一个独立的Java程序.

Jenkins Pipeline

Jenkins Pipeline (或简称为"Pipeline")是一套插件,将持续交付的实现和实施集成到Jenkins中。

持续交付Pipeline自动化的表达了这样一种流程:将基于版本控制管理的软件持续的交付到您的用户和消费者手中。

Jenkins Pipeline提供了一套可扩展的工具,用于将“简单到复杂”的交付流程实现为“持续交付即代码”。 Jenkins Pipeline的定义通常被写入到一个文本文件(称为 Jenkinsfile )中,该文件可以被检入到项目的源代码控制库中。

通过 war 部署 Jenkins

1. 下载Jenkins: http://mirrors.jenkins.io/war-stable/latest/jenkins.war

2. 打开终端进入到下载目录

3. 运行命令 java -jar jenkins.war --httpPort=8080

4. 打开浏览器进入链接 http://localhost:8080

通过 Docker 部署 Jenkins

使用以下命令启动一个 Jenkins 容器

docker run \
 --name jenkins \
 --rm \
 -u root \
 -p 8084:8080 \
 -p 50000:50000 \
 -v /usr/share/nginx/html/jenkins/data:/var/jenkins_home \
 -v /var/run/docker.sock:/var/run/docker.sock \
 -v "$HOME":/home \
 --privileged=true \
 jenkinsci/blueocean

以上命令, 执行以下操作:

1. 命名一个名叫 jenkins 的 docker 容器

2. 运行结束后删除此容器(若不想删除则不使用此参数)

3. 使用 root 用户登录

4. 将容器中 8080 端口映射到宿主机的 8084 端口

5. 将容器中 50000 端口映射到宿主机的 50000 端口

6. 挂载卷, 将其中的 /var/jenkins_home 目录挂载到宿主机 /usr/share/nginx/html/jenkins/data 下

7. 挂载卷, 将其中用户目录挂载到宿主机用户目录(`~`)

8. 由于本人使用 root 用户进行操作, 为了容器避免权限不足添加 `--privileged=true` 参数

9. 使用镜像 `jenkinsci/blueocean` 创建容器

如果推出容器, 可以使用 `docker start jenkins` 开启

如果在运行途中想要进入容器, 输入:

$ docker exec -it jenkins bash

安装过程

查看控制台, 出现:

INFO: Jenkins is fully up and running

即表明运行容器启动成功, 浏览器中输入 `http://192.168.42.130:8084` 即可看到

此处要求输入秘钥, 在控制台 `*` 中即可看到秘钥:

*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
a7fae2529edb4f0392d427b5355613d7
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************

如果没记住, 可以在容器内 /var/jenkins_home/secrets/initialAdminPassword 中看到

接下来进行插件安装(需要梯子, 否则可能提示 `This Jenkins instance appears to be offline`)

单分支流水线

克隆 git 仓库

以一个简单的 react 项目为例, 首先将仓库克隆到本地

$ git clone https://github.com/quanzaiyu/building-a-multibranch-pipeline-project.git
$ pwd
/home/data/building-a-multibranch-pipeline-project

创建单流水线

在 Jenkins 中创建一条流水线

找到 `Pipeline` 选项, Definition 选择 `Pipeline script from SCM`, 在 SCM 中选择 `Git`

创建 Jenkinsfile

在项目根目录创建 Jenkinsfile, 输入以下内容

$ vim Jenkinsfile
pipeline {
 agent {
 docker {
 image 'node:10.12.0'
 args '-p 3000:3000'
 }
 }
 environment {
 CI = 'true'
 }
 stages {
 stage('Build') {
 steps {
 sh 'npm config set registry https://registry.npm.taobao.org'
 sh 'npm install'
 sh 'npm run build'
 }
 }
 stage('Test') {
 steps {
 sh './jenkins/scripts/test.sh'
 }
 }
 }
}

修改 Jenkinsfile 后提交修改

$ git add .
$ git commit -m Jenkinsfile

运行流水线

在浏览器中打开 `Open Blue Ocean`, 选择运行, 可以看到输出结果:

使用 Jenkins 项目的检出位于 `/var/jenkins_home/workspace/`

多分支流水线

以上节仓库为例, 新建两个分支: `development` 和 `production`, 将 `master` 分支下的内容检出到当前分支:

$ git branch development
$ git checkout development
Switched to branch 'development'
$ git pull . master
From .
* branch master -> FETCH_HEAD
Already up to date.
$ git branch production
$ git checkout production
Switched to branch 'production'
$ git pull . master
From .
* branch master -> FETCH_HEAD
Already up to date.

创建 Jenkinsfile

创建 Jenkinsfile 如下:

pipeline {
 agent {
 docker {
 image 'node:10.12.0'
 args '-p 3000:3000 -p 5000:5000'
 }
 }
 environment {
 CI = 'true'
 }
 stages {
 stage('Build') {
 steps {
 sh 'npm config set registry https://registry.npm.taobao.org'
 sh 'npm install'
 }
 }
 stage('Test') {
 steps {
 sh './jenkins/scripts/test.sh'
 }
 }
 stage('Deliver for development') {
 when {
 branch 'development'
 }
 steps {
 sh './jenkins/scripts/deliver-for-development.sh'
 input message: 'Finished using the web site? (Click "Proceed" to continue)'
 sh './jenkins/scripts/kill.sh'
 }
 }
 stage('Deploy for production') {
 when {
 branch 'production'
 }
 steps {
 sh './jenkins/scripts/deploy-for-production.sh'
 input message: 'Finished using the web site? (Click "Proceed" to continue)'
 sh './jenkins/scripts/kill.sh'
 }
 }
 }
}

创建多分支流水线

自由风格的软件

General 基本配置

添加一个仓库, 可能会报权限问题:

添加证书即可, 输入ssh私钥:

选择刚才添加的证书:

Build Triggers 触发器

Build Environment 构建环境

Build 构建步骤

Post-build Actions 构建后行为

系统管理

全局工具配置

配置已安装的Jenkins工具

插件管理

下载、安装和管理Jenkins插件

常用插件

- Pipeline

- Coding Webhook Plugin

- NodeJS Plugin

- Workspace Cleanup Plugin

- Blue Ocean

- Build Timeout

Jenkinsfile 详解

Jenkinsfile 中所有有效的声明式流水线必须包含在一个 pipeline 块中:

pipeline {
 /* insert Declarative Pipeline here */
}

agent

agent 指令告诉Jenkins在哪里以及如何执行Pipeline或者Pipeline子集。 正如您所预料的,所有的Pipeline都需要 agent 指令。

在执行引擎中,agent 指令会引起以下操作的执行:

  1. 所有在块block中的步骤steps会被Jenkins保存在一个执行队列中。 一旦一个执行器 executor 是可以利用的,这些步骤将会开始执行。
  2. 一个工作空间 workspace 将会被分配, 工作空间中会包含来自远程仓库的文件和一些用于Pipeline的工作文件

docker

使用给定的容器执行流水线或阶段。

agent {
 docker {
 image 'maven:3-alpine'
 label 'my-defined-label'
 args '-v /tmp:/tmp'
 }
}

各语言代理示例

下面是一个简单的Pipeline各种语言示例。

Java

pipeline {
 agent { docker 'maven:3.3.3' }
 stages {
 stage('build') {
 steps {
 sh 'mvn --version'
 }
 }
 }
}

Node.js / JavaScript

pipeline {
 agent { docker 'node:10.12.0' }
 stages {
 stage('build') {
 steps {
 sh 'npm --version'
 }
 }
 }
}

Ruby

pipeline {
 agent { docker 'ruby' }
 stages {
 stage('build') {
 steps {
 sh 'ruby --version'
 }
 }
 }
}

Python

pipeline {
 agent { docker 'python:3.5.1' }
 stages {
 stage('build') {
 steps {
 sh 'python --version'
 }
 }
 }
}

PHP

pipeline {
 agent { docker 'php' }
 stages {
 stage('build') {
 steps {
 sh 'php --version'
 }
 }
 }
}

阶段级代理

pipeline {
 agent none
 stages {
 stage('Example Build') {
 agent { docker 'maven:3-alpine' }
 steps {
 echo 'Hello, Maven'
 sh 'mvn --version'
 }
 }
 stage('Example Test') {
 agent { docker 'openjdk:8-jre' }
 steps {
 echo 'Hello, JDK'
 sh 'java -version'
 }
 }
 }
}

stages

Pipelines由多重steps组成,包括构建、测试和部署等应用。 Jenkins Pipeline允许您使用一种简单的方式组合多重steps,以帮助您实现多种类型的自动化构建过程。

可以把“step”看作一个简单的命令去执行一个简单的动作,或者说是一个步骤。 当一个步骤运行成功时继续运行下一个步骤。 当任何一个步骤执行失败时,Pipeline的执行结果也为失败。

当所有的步骤都执行完成并且为成功时,Pipeline的执行结果为成功。

pipeline {
 agent any
 stages {
 stage('Example') {
 steps {
 echo 'Hello World'
 }
 }
 stage('Test') {
 steps {
 echo 'Test'
 }
 }
 }
}

steps

steps 部分在给定的`stage` 指令中执行的定义了一系列的一个或多个steps。

pipeline {
 agent any
 stages {
 stage('Example') {
 steps {
 sh 'whoami'
 echo 'Hello World'
 }
 }
 }
}

post

当Pipeline运行完成时,你可能需要做一些清理工作或者基于Pipeline的运行结果执行不同的操作, 这些操作可以放在 post 部分。

pipeline {
 agent any
 stages {
 stage('Test') {
 steps {
 sh 'echo "Fail!"; exit 1'
 }
 }
 }
 post {
 always {
 echo 'This will always run'
 }
 success {
 echo 'This will run only if successful'
 }
 failure {
 echo 'This will run only if failed'
 }
 unstable {
 echo 'This will run only if the run was marked as unstable'
 }
 changed {
 echo 'This will run only if the state of the Pipeline has changed'
 echo 'For example, if the Pipeline was previously failing but is now successful'
 }
 }
}

使用Jenkins构建Vue项目的示例

pipeline {
 agent { docker 'node:latest' }
 stages {
 stage('build') {
 steps {
 sh 'whoami'
 sh 'node --version'
 sh 'npm --version'
 sh 'npm config set chromedriver_cdnurl http://cdn.npm.taobao.org/dist/chromedriver'
 sh 'npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/'
 sh 'npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/'
 sh 'npm config set electron_mirror https://npm.taobao.org/mirrors/electron/'
 sh 'npm install'
 sh 'npm run build'
 sh 'mkdir -p www'
 sh 'rm -rf www/*'
 sh '\\cp -r -a dist/* www'
 sh 'ls www'
 sh 'pwd'
 }
 }
 }
}

部署时使用 www 目录即可

解决方案

卷权限问题

如果挂载卷时提示权限错误 `Permission denied`, 有以下解决方案:

1. 在运行容器的时候,给容器加特权,及加上 `--privileged=true` 参数

2. 临时关闭 selinux, 执行 `setenforce 0`

3. 添加selinux规则,改变要挂载的目录的安全性文本

查看容器内权限:

$ docker exec jenkins whoami && id
$ docker exec jenkins ls -la /var/jenkins_home
# or
$ docker run -ti --rm --entrypoint="/bin/bash" jenkinsci/blueocean -c "whoami && id"
$ docker run -ti --rm --entrypoint="/bin/bash" jenkinsci/blueocean -c "ls -la /var/jenkins_home"

结束语

这是我第一次发文, 发现头条貌似不支持Markdown, 特别不习惯富文本编辑器, 着实郁闷了一下, 排版可能不太好, 请大家谅解。

后续将继续发布各种技术方面的文章, 还请大家多多支持。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表