Jenkins是一个使用java编写的开源的持续集成工具。支持主流软件配置管理,配合实现软件配置管理,持续集成功能。

作为开发人员我们很多的工作就是在命令与脚本间游走,这是与系统交互最为紧密的通信工具,但缺点也很明显,可以简单形容为一个黑盒。Jenkins的出现彻底打开了这个黑盒,让开发人员和运维人员协同工作在一个白盒之中,他在我们运维工作之中起到的是一个承上启下的作用。

他的前台页面可以方便我们直接收集到所有job的相关信息,而且它能够作为一个pip line将我们开发周期中各个环节利用stage组合到一起,无论你使用的是哪种工具,他都能将这些工具串联成一个框架,形成一个高效的可扩展的平台。

Jenkins是主流的运维开发平台,兼容所有主流的开发环境,插件市场可与海量业内主流开发工具实现集成。Job为配置单位与日志管理,使运维与开发人员能协同工作。

权限管理划分不同Job不同角色,强大的负载均衡功能,保证我们项目的可靠性。

安装与配置管理

同样在centos7系统中安装。首先进行环境准备工作。首先设置仓库源。

# 安装wget
yum install wget -y
# 设置镜像源
wget -o /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo
# 导入yum的key验证安全性
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

需要保证java版本在8.0,因为jenkins依赖java环境。

yum -y install java

java -version

关闭防火墙

systemctl stop firewalld
# 禁止开机启动
systemctl disable firewalld

关闭强制访问安全策略。

vi /etc/sysconfig/selinux

SELINUX=disabled # enforcing -> disabled
# 重启
reboot

稍等片刻重新链接主机

# 查看是否禁用成功
getenforce

下面开始安装jenkins

yum install jenkins -y

创建一个deploy用户作为jenkins系统服务用户

useradd deploy

vi /etc/sysconfig/jenkins

修改JENKINS_USER用户为deploy, 保证JENKINS_PORT端口为8080。

JENKINS_USER="deploy"
...
JENKINS_PORT="8080"

修改lib和日志的权限。

chown -R deploy:deploy /var/lib/jenkins
chown -R deploy:deploy /var/log/jenkins
# 启动jenkins
systemctl start jenkins
# 确认是否启动
lsof -i:8080

可以设置一条jenkins的dns配置

xx.xx.xx.xx jenkins.example.com

在浏览器中访问jenkins.example.com:8080, 第一次会要求我们输入管理员密码,密码在日志中查找/var/lib/jenkins/secrets/initialAdminPassword。会找到管理员的初始密码。

这样就进入到jenkins的插件安装界面,可以选择安装推荐的插件。就会自动安装社区中推荐的插件到本地。安装完成之后会要求创建第一个管理员用户。安装完成进入到管理界面。

管理界面的布局由若干个区域构成,左边餐单列表,新建任务可以创建一个job任务,用户可以创建用户,构建历史可以查看构建log日志,系统管理是系统配置选项。我的视图和新建视图,可以自定义管理界面的布局。凭据可以添加git的密码,ssh的公钥等,作为jenkins的凭据。

构建队列就是所有构建任务的队列,当有多个任务的时候都会在列表中显示。

系统管理中的系统设置用来定义jenkins的全局配置,全局安全配置用来设置用户是否可以注册等,可以配置每一个用户对jenkins任务的操作权限。管理插件就是插件市场平台,可以安装和更新插件。

JOB构建

jenkins是由多个job任务或者project构成的开发系统,可以将自己平时的开发,测试,部署,基础运维操作创建一个任务保存在任务列表当中,方便我们在jenkins平台中日常的维护。

可以使用内建模块或者脚本创建任务,在这个任务里面通过配置相关的参数以及工具模块,从而作为一个可执行的任务,共享到jenkins平台下。供不同权限的人重复build执行,每一次执行的结果记录称为一个build构建,里面有需要的结果信息。workspace目录中保存我们git拉取的代码和构建之后的文件。

  1. Freestyle job

他是jenkins用途最为广泛的任务类型,它支持在配置页面添加配置项和参数就可以完成一个满足不同工作人员的需求。缺点是每个Freestyle job仅能实现一个开发功能。Freestyle的job配置只能通过前台手动完成,无法通过编写一段代码去实现Freestyle的所有功能,所以不利于Job配置迁移和版本控制。(没有审计和历史记录)。逻辑相对简单,无需额外学习成本。

  1. Pipline Job

早期是jenkins的插件,后来集成到了jenkins中,可直接使用。可以实现持续集成和持续交付的管道。持续集成简称CI,开发的每一次提交都可以自动构建。持续交付CD,在持续集成的基础上将打包文件部署。

所有模块, 参数配置都可以体现为一个pipeline脚本,可以定义多个stage构建一个管道工作集。所有的配置代码化,方便Job配置迁移与版本控制。但是有一定的学习成本,需要学习pipline脚本基础。

环境配置

  1. 配置Jenkins server 本地gitlab DNS

将gitlab所在服务器的ip配置到本地的host中。

  1. 安装git client, curl工具依赖
yum install curl -y
  1. 关闭系统Git http.sslVerify安全认证
git config --system http.sslVerify false
  1. 添加Jenkins后台client user与email

jenkins后台的系统管理-系统设置,找到Git Plugin列表中,name中添加root,email中添加root@example.com。

  1. 添加git Credential凭据

jenkins后台的凭据菜单,jenkins -> 全局凭据 -> 添加凭据,类型选择username with password,范围全局,username输入root,password输入对应的密码,id和描述可以不填,确认即可。

freestyle构建配置

首先需要创建一个freestyle project, 左上角的新建项目就可以。test-freestyle-job, 供应舰一个自由风格的软件任务,确认即可。

编辑描述信息,随便输入点什么就可以了。this is first test freestyle job。

同样在general中添加参数配置,在配置页面勾选参数化构建过程,添加一个选项参数和文本参数。选项参数名称为deploy_env, 选项为dev(换行)prod, 描述随便写,choose deploy environment。文本参数的名称填写version,默认值填写1.0.0,描述随便写,build version。

配置源代码管理选项打开,将git上的代码clone到jenkins本地,进行随后的项目部署工作。输入gitlab的url地址,这里使用https的地址,credentials选择刚刚创建的账号密码。branch选中master。

最后通过添加一个shell模块,完成build配置。在构建选项中,点击增加构建步骤,选择执行shell。在编辑栏中添加任务脚本。声明脚本格式。

这里面的deploy_env和version就是前面添加的参数配置,这里会将选中的值传递进来。

#!/bin/sh
export PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"

# Print env variable
echo "[INFO] Print env variable"
echo "Current deployment environment is $deploy_env" >> test.properties
echo "THe build is $version" >> test.properties
echo "[INFO] Done"

# Check test properties
echo "[INFO] Check test properties"
if [ -s test.properties ]
then
    cat test.properties
    echo "[INFO] Done..."
else
    echo "test.properties is empty"
fi

echo "[INFO] Build finished"

点击应用就配置完成了,点击保存自动退出配置页面。

点击左侧的Build with Parameters菜单,这里会出现我们之前配置的可选参数和文本参数,需要我们自己选择一下。点击开始构建。可以点击左下角的圆球,查看构建结果。

Pipline Job构建配置

首先需要介绍一下pipline的语法编写规范。

所有代码包裹在pipeline{}内,stages{}用来包含pipline所有的stage层,用来将pipeline管道分为若干个管道块,每一个管道块都可以独立的做一些事情。stage中的steps子层用来添加pipeline的业务编写。

pipline {
    agent any
    environment {
        host='test.example.com'
        user='deploy'
    }
    stages {
        stage('build') {
            steps {
                sh "cat $host"
                echo $deploy
            }
        }
    }
}

angent的作用是定义pipeline在哪里运行,通常可以使用any,none或具体的jenkins node主机名等,如果特指在node1上执行。建议新手使用any。

agent {node {label 'node1'}}

environment用来定义当前的环境变量。变量名称=变量值的方式,与stages平级就可以应用到stages中。如果定义在stage中就值可以使用在steps中。

script是可选的,定义在steps区域下,可以编写groovy脚本语言,用来进行相应的脚本逻辑运算。

steps {
    echo "Hello world"
    script {
        def servers = ['node1', 'node2']
        For (int i=0; i < server.size(); ++i) {
            echo "testing ${servers[i]} server";
        }
    }
}

steps中可以使用echo输出,可以使用linux系统的shell命令。可以使用git模块进行git相关操作。

steps {
    echo "Hello world"
    sh "cat 'hello world'"
    git url: "https://root@gitlab.example.com/root/test.git"
}

可以在新建任务重创建一个Pipeline project, 名称为test-pipeline-job, 类型选择流水线任务。描述信息添加this is first pipeline job。在Pipeline任务栏填写脚本。

#!groovy

pipeline {
    agent {node {label 'master'}}

    environment {
        PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
    }

    parameters {
        choice (
            choices: 'dev\nprod',
            description: 'choose deploy environment',
            name: 'deploy_env',
        )
        string (name: 'version', defaultValue: '1.0.0', description: 'build version')
    }

    stages {
        stage("Checkout test repo") {
            steps {
                sh 'git config --global http.sslVerify false'
                dir ("${env.WORKSPACE}") {
                    git branch: 'master', credentialsId: "xxxxxxxxxx", url: 'https://root@gitlab.example.com/root/test-repo.git'
                }
            }
        }
        stage("Print env variable") {
            steps {
                dir ("${env.WORKSPACE}") {
                    sh """
                    echo "[INFO] Print env variable"
                    echo "Current deployment environment is $deploy_env" >> test.properties
                    echo "The build is $version" >> test.properties
                    echo "[INFO] Done..."
                    """
                }
            }
        }
        stage("Check test properties") {
            steps {
                dir ("${env.WORKSPACE}") {
                    sh """
                    echo "[INFO] Check test properties"
                    if [ -s test.properties ]
                    then
                        cat test.properties
                        echo "[INFO] Done..."
                    else
                        echo "test.properties is empty"
                    fi
                    """
                    echo "[INFO] Build finished..."
                }
            }
        }
    }
}

保存并退出,点击立即构建,会报错,这是因为我们还没有选择变量,点击顶部test-pipeline-job, 重新开始Build with Parameters,就可以看到每个任务的执行和状态。点击蓝色圆球就可以进入到日志界面中查看了。

shell集成和jenkins参数集成

shell作为jenkins中最常用的模块。

可以新建项目,名称随便起,shell-freestyle-job选择构建一个自由风格的项目。

描述随便填写,构建中选择执行shell,可以书写一些shell脚本。

#!/bin/sh
user=`whoami`

if [ $user == 'deploy' ]
then
    echo "Hello, my name is $user"
else
    echo "Sorry I am not $user"
fi

ip addr

cat /etc/system-release

free -m

df -h

py_cmd=``which python`

$py_cmd --version

Jenkins参数是Jenkins任务重要的组成部分,可以通过传入不同的参数,让Jenkins实现不同的效果。

新建一个parameter-freestyle-job同样选择自由风格的软件项目。参数化构建过程。可以选择选项参数,deploy_env, 值为dev,uat,stage,pord四个值。

文本参数输入version,默认值输入1.0.0。

布尔值参数bool,默认值勾选,表示默认为true

密码参数,名称为pass,默认值123456。

在构建里面选择执行shell。

#!/bin/sh

echo "Current deploy environment is $deploy_env"
echo "The build is $version"
echo "The password is $pass"

if $bool
then
    echo "Request is approved"
else
    echo "Request is rejected"
fi

Git和Maven集成

使用Jenkins内建的git插件,去将gitlab或者github的代码clone到本地。

新建任务git-freestyle-job选择构建自由风格的原件项目。

在码源管理里面选择git,添加仓库https地址,Credentials凭证选择之前创建的gitlab系统凭据。保存并退出。点击立即构建就开始执行了。

使用Jenkins内建的Maven插件将从代码仓库clone下来的java源代码编译成我们事先配置好的var包或者jar包到本地,准备好随后的部署工作。

填写完git配置之后,构建菜单选择调用顶层Maven目标,输入package, 保存并退出。

需要配置,系统管理,全局工具配置,选择新增JDK,取消自动安装勾选,别名选择jdk1.8,JAVA_HOME输入安装maven插件时候差生的runtime路径复制进去。

在西面Maven中选择新增Maven,同样取消自动安装,name输入maven-3.5.4, 复制命令行中的maven-home路径粘贴到MAVEN_HOME中。

apply保存配置。找到我们创建的这个项目,点击配置,在调用顶层Maven目标中选择maven-3.5.4也就是刚刚填写的那个值。点击保存,然后开始构建。

Jenkins Ansible集成

使用ansible内建shell模块调用本地的ansible命令行工具,从而能够实现Jenkins调用ansible从而实现远程服务器的步数管理功能。

首先登陆jenkins server远程主机的命令行,并且完成了ansible py3.6虚拟环境配置,以及配置了Jenkins主机下deploy系统用户到test.example.com主机的密钥认证。

su - delpoy
ll -a
cd .py3-a2.5-env
ll
# 可以发现ansible源代码的值。

可以使用.py3-a2.5-env目录进行py3.6环境以及ansible2.5环境加载工作。

查看Jenkins的deploy系统用户到test.example.com,不需要输入密码就可以链接。

ssh root@test.example.com这台主机的密钥认证。

exit

Jenkins的ansible集成配置页面。

在Jenkins的命令行

cd /home/deploy
ls
# 这里要有一个ansible的清单文件,也就是testservers文件夹

testservers文件内容, 指定服务名称和远程主机地址,以及要进入的远程主机用户名称。

[testserver]
test.example.com ansible_user=root

回到Jenkins的用户界面。新建任务,ansible-freestyle-job,选择自由风格软件项目。描述随便填写this is my first ansible job,构建中选择执行shell。

#!/bin/sh

set +x
source /home/deploy/.py3-a2.5-env/bin/activate
source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q

cd /home/deploy
ansible --version
ansible-playbook --version

cat testservers

ansible -i testservers testserver -m command -a "ip addr"
set -x