版本控制系统 Gitlab Github
持续集成工具 Jenkins
部署工具 Ansible Saltstack Chef
本文通过Jenkins + Ansible + Gitlab
实现自动化部署。
Jenkins是一个开源可扩展的,持续集成、交付、部署(软件/代码的编译、打包、部署)工具,由Java开发,它提供了软件开发的持续集成服务,支持主流软件配置管理、配合实现软件配置管理及持续集成功能。
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
# systemctl stop firewalld && systemctl disable firewalld
# setenforce 0 && sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
# 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
# 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
# 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)
# yum install -y jenkins
# useradd deploy
# 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
# systemctl start jenkins && systemctl enable jenkins
# netstat -lntp |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 1441/java
打开网页,访问jenkins.lzxlinux.com:8080
。
查看/var/lib/jenkins/secrets/initialAdminPassword
,复制密码登录。
选择安装推荐的插件
创建admin用户,自定义密码
url保持默认,进入jenkins页面。
jenkins的每个job代表一个任务或项目,它是可配置与可执行的。执行job后的记录称之为build(构建)。
jenkins job分为两种:freestyle job
与pipeline job
。
freestyle job:
1. 需在页面添加模块配置项与参数完成配置
2. 每个job仅能实现一个开放功能
3. 无法将配置代码化,不利于job配置迁移与版本控制
4. 逻辑相对简单,无需额外学习成本
pipeline job:
1. 所有模块、参数配置都可以体现为一个pipeline脚本
2. 可定义多个stage构建一个管道工作集
3. 所有配置代码化,方便job配置迁移与版本控制
4. 需要pipeline脚本语法基础
# echo '192.168.30.130 gitlab.lzxlinux.com' >> /etc/hosts
# yum install -y git curl
# git config --system http.sslVerify false
系统管理
→ 系统设置
→ Git plugin
,填入user与email
凭据
→ 全局
→ 添加凭据
,类型为Username with password
, 范围为全局
点击新建任务
,任务名称输入test-freestyle-job
,选择自由风格的软件项目
。
添加描述信息:This is my first test freestyle job
,勾选参数化构建过程
,添加选项参数
和文本参数
接着源码管理
,勾选Git
,写入之前gitlab的test-repo这个项目地址,然后选择前面添加的git凭据
接着构建
→ 增加构建步骤
→ 执行 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..."
点击应用
,再点击保存
。
点击Build with Parameters
,选择对应的选项参数
,选择好后点击开始构建
。
等待构建完成,查看控制台输出
可以看到,构建的工作区路径为/var/lib/jenkins/workspace/test-freestyle-job
,该job的配置文件都会保存在该路径中。
git部分相当于对gitlab的test-repo项目仓库做了git clone
操作,接着执行了定义的shell脚本,最终的构建结果是SUCCESS。
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脚本语言,用来进行脚本逻辑运算
点击新建任务
,任务名称输入test-pipeline-job
,选择流水线
。
添加描述信息:This is my first test pipeline job
接着定义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。
点击应用
,再点击保存
。
点击立即构建
,等待构建完成,会发现构建失败,原因是第一次构建时选项参数
没有引入到当前的pipeline job中。
点击test-pipeline-job
回到该项目中,会发现立即构建
变成了Build with Parameters
,选择对应的选项参数
,选择好后点击开始构建
。
第二次构建则成功了,查看控制台输出
通过前面两次构建,对比freestyle job和pipeline job,可以看到,pipeline job将所有配置代码化,方便job配置迁移与版本控制,pipeline job更具有优势。
# 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"
JAVA_HOME
及MAVEN_HOME
:系统管理
→ 全局工具配置
→ 新增JDK
,填入内容
接着新增Maven
,填入内容
点击应用
,再点击保存
。
后续在打包时,构建
这一步选择调用顶层 Maven 目标
,版本选择maven3.6.2
,目标填入package
即可。
# su - deploy
$ vim testservers
[testserver]
test.lzxlinux.com ansible_user=root
点击新建任务
,任务名称输入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
点击应用
,再点击保存
。
点击立即构建
,查看控制台输出
可以看到,shell脚本中执行的命令在控制台中输出。