Jenkins + Ansible + Gitlab(三)

版本控制系统    Gitlab Github

持续集成工具    Jenkins

部署工具    Ansible Saltstack Chef

本文通过Jenkins + Ansible + Gitlab实现自动化部署。


Jenkins介绍

Jenkins是一个开源可扩展的,持续集成、交付、部署(软件/代码的编译、打包、部署)工具,由Java开发,它提供了软件开发的持续集成服务,支持主流软件配置管理、配合实现软件配置管理及持续集成功能。

  • jenkins的优势:
1. 主流的运维开发平台,兼容所有主流开发环境

2. 插件市场可与海量业内主流开发工具实现集成

3. Job为配置单位与日志管理,使运维与开发人员协同工作

4. 权限管理划分不同的Job不同角色

5. 强大的负载均衡功能,保障项目的可靠性

环境准备

3台机器需要做环境准备。

  • 角色划分:
Jenkins + Ansible   192.168.30.128

test host   192.168.30.129

gitlab  192.168.30.130
  • 关闭防火墙和selinux:
# systemctl stop firewalld && systemctl disable firewalld

# setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
  • 添加本地dns:
# vim /etc/hosts

192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com

在Windows电脑hosts文件中添加本地dns:

192.168.30.128 jenkins.lzxlinux.com
192.168.30.129 test.lzxlinux.com
192.168.30.130 gitlab.lzxlinux.com

Jenkins安装配置

  • 添加yum仓库源:
# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo

# cat /etc/yum.repos.d/jenkins.repo

[jenkins]
name=Jenkins
baseurl=http://pkg.jenkins.io/redhat
gpgcheck=1				#为1时会检测key

# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
  • 安装java(java版本在8.0及以上):
# yum install -y java

# java -version

openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)
  • 安装jenkins:
# yum install -y jenkins
  • 创建jenkins系统用户:
# useradd deploy
  • 更改jenkins启动用户与端口:
# vim /etc/sysconfig/jenkins

JENKINS_USER="deploy"               #保证jenkins启动用户与ansible部署用户一致
JENKINS_PORT="8080"

# chown -R deploy:deploy /var/lib/jenkins

# chown -R deploy:deploy /var/log/jenkins

# chown -R deploy:deploy /var/cache/jenkins
  • 启动jenkins并开机启动:
# systemctl start jenkins && systemctl enable jenkins

# netstat -lntp |grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      1441/java

打开网页,访问jenkins.lzxlinux.com:8080

Jenkins + Ansible + Gitlab(三)_第1张图片

查看/var/lib/jenkins/secrets/initialAdminPassword,复制密码登录。

选择安装推荐的插件

Jenkins + Ansible + Gitlab(三)_第2张图片

创建admin用户,自定义密码

Jenkins + Ansible + Gitlab(三)_第3张图片

url保持默认,进入jenkins页面。


Jenkins Job介绍

jenkins的每个job代表一个任务或项目,它是可配置与可执行的。执行job后的记录称之为build(构建)。

jenkins job分为两种:freestyle jobpipeline job

  • 两者区别:
freestyle job:
    1. 需在页面添加模块配置项与参数完成配置
    2. 每个job仅能实现一个开放功能
    3. 无法将配置代码化,不利于job配置迁移与版本控制
    4. 逻辑相对简单,无需额外学习成本

pipeline job:
    1. 所有模块、参数配置都可以体现为一个pipeline脚本
    2. 可定义多个stage构建一个管道工作集
    3. 所有配置代码化,方便job配置迁移与版本控制
    4. 需要pipeline脚本语法基础
  • jenkins环境准备:
  1. 配置jenkins server本地gitlab dns
# echo '192.168.30.130 gitlab.lzxlinux.com' >> /etc/hosts
  1. jenkins server安装git client、curl工具依赖
# yum install -y git curl
  1. jenkins server关闭系统git http.sslVerify安全认证
# git config --system http.sslVerify false
  1. 添加jenkins后台git client user与email

系统管理系统设置Git plugin,填入user与email

Jenkins + Ansible + Gitlab(三)_第4张图片

  1. 添加jenkins后台git credential凭据

凭据全局添加凭据,类型为Username with password, 范围为全局

Jenkins + Ansible + Gitlab(三)_第5张图片


Freestyle Job配置与构建

  • 配置freestyle job:

点击新建任务,任务名称输入test-freestyle-job,选择自由风格的软件项目

添加描述信息:This is my first test freestyle job,勾选参数化构建过程,添加选项参数文本参数

Jenkins + Ansible + Gitlab(三)_第6张图片

Jenkins + Ansible + Gitlab(三)_第7张图片

接着源码管理,勾选Git,写入之前gitlab的test-repo这个项目地址,然后选择前面添加的git凭据

Jenkins + Ansible + Gitlab(三)_第8张图片

接着构建增加构建步骤执行 shell,写入下面内容

#!/bin/bash

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..."

Jenkins + Ansible + Gitlab(三)_第9张图片

点击应用,再点击保存

  • 构建freestyle job:

点击Build with Parameters,选择对应的选项参数,选择好后点击开始构建

Jenkins + Ansible + Gitlab(三)_第10张图片

等待构建完成,查看控制台输出

Jenkins + Ansible + Gitlab(三)_第11张图片

可以看到,构建的工作区路径为/var/lib/jenkins/workspace/test-freestyle-job,该job的配置文件都会保存在该路径中。

git部分相当于对gitlab的test-repo项目仓库做了git clone操作,接着执行了定义的shell脚本,最终的构建结果是SUCCESS。


Pipeline Job构建与配置

  • pipeline基础架构:
1. 所有代码包裹在pipeline{}层内

2. stages{}层用来包含该pipeline所有stage{}子层

3. stage{}层用来包含具体需要编写任务的steps{}子层

4. steps{}层用来添加具体需要调用的模块语句
agent区域
    agent定义pipeline在哪里运行,可以使用any、none或具体的jenkins node主机名
    
environment区域
    "变量名称=变量值",定义环境变量。可在pipeline{}层定义全局环境变量,应用于所有stages任务
    
steps区域
    echo模块:打印输出
    sh模块:调用linux系统shell命令
    git url:调用git模块进行git相关操作
    
script区域(可选)
    该区域定义在steps{}层内,可编写groovy脚本语言,用来进行脚本逻辑运算
  • 配置pipeline job:

点击新建任务,任务名称输入test-pipeline-job,选择流水线

添加描述信息:This is my first test pipeline job

Jenkins + Ansible + Gitlab(三)_第12张图片

接着定义Pipeline script,写入下面内容

#!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.sslVertify false'
                dir ("${env.WORKSPACE}") {
                    git branch: 'master', credentialsId: "00ee2c7c-c475-440c-a88f-dd6c9a49f669", url: 'https://[email protected]/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..."
                    """
                }
            }
        }
    }
}

上面的credentialsId即00ee2c7c-c475-440c-a88f-dd6c9a49f669,是复制凭据页面创建该凭据(gitlab管理员全局凭据)时自动生成的凭据id。

Jenkins + Ansible + Gitlab(三)_第13张图片

点击应用,再点击保存

  • 构建pipeline job:

点击立即构建,等待构建完成,会发现构建失败,原因是第一次构建时选项参数没有引入到当前的pipeline job中。

Jenkins + Ansible + Gitlab(三)_第14张图片

点击test-pipeline-job回到该项目中,会发现立即构建变成了Build with Parameters,选择对应的选项参数,选择好后点击开始构建

Jenkins + Ansible + Gitlab(三)_第15张图片

第二次构建则成功了,查看控制台输出

Jenkins + Ansible + Gitlab(三)_第16张图片

Jenkins + Ansible + Gitlab(三)_第17张图片

通过前面两次构建,对比freestyle job和pipeline job,可以看到,pipeline job将所有配置代码化,方便job配置迁移与版本控制,pipeline job更具有优势。


Jenkins Maven集成

  • jenkins server安装maven:
# cd /software

# wget https://www-eu.apache.org/dist/maven/maven-3/3.6.2/binaries/apache-maven-3.6.2-bin.tar.gz

# tar zxf apache-maven-3.6.2-bin.tar.gz

# mv apache-maven-3.6.2 /usr/local/maven

# echo 'PATH=$PATH:/usr/local/maven/bin' >> /etc/profile

# source /etc/profile

# mvn --version

Apache Maven 3.6.2 (40f52333136460af0dc0d7232c0dc0bcf0d9e117; 2019-08-27T23:06:16+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_222, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.222.b10-1.el7_7.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1062.1.1.el7.x86_64", arch: "amd64", family: "unix"
  • jenkins配置JAVA_HOMEMAVEN_HOME

系统管理全局工具配置新增JDK,填入内容

Jenkins + Ansible + Gitlab(三)_第18张图片

接着新增Maven,填入内容

Jenkins + Ansible + Gitlab(三)_第19张图片

点击应用,再点击保存

后续在打包时,构建这一步选择调用顶层 Maven 目标,版本选择maven3.6.2,目标填入package即可。


Jenkins Ansible集成

  • 编辑ansible主机清单:
# su - deploy

$ vim testservers

[testserver]
test.lzxlinux.com ansible_user=root
  • 配置ansible-freestyle-job:

点击新建任务,任务名称输入test-freestyle-job,选择自由风格的软件项目

添加描述信息:This is my first ansible job,接着构建增加构建步骤执行 shell,写入下面内容

#!/bin/bash

set +x              #关闭命令行扩展环境功能

source /home/deploy/.py3-a2.8-env/bin/
source /home/deploy/.py3-a2.8-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

Jenkins + Ansible + Gitlab(三)_第20张图片

点击应用,再点击保存

  • 构建ansible-freestyle-job:

点击立即构建,查看控制台输出

Jenkins + Ansible + Gitlab(三)_第21张图片

可以看到,shell脚本中执行的命令在控制台中输出。


你可能感兴趣的:(Jenkins,Ansible)