Jenkins
Jenkins是基于Java开发的一种持续集成工具。
Jenkins功能包括:
- 持续的软件版本发布/测试项目。
- 监控外部调用执行的工作。
安装jenkins
在linux上使用docker进行安装,代码如下
docker pull jenkinsci/blueocean
或直接执行下边代码安装并运行
docker run \
-u root \
--rm \关闭时自动删除Docker容器
-d \后台运行容器,避免在终端窗口中输出正在运行的此容器的Docker日志
-p 8080:8080 \主机端口:容器端口
-p 50000:50000 \基于JNLP的Jenkins代理默认通过TCP端口50000与Jenkins主机通信
-v jenkins-data:/var/jenkins_home \将容器中的目录映射到Docker 卷jenkins-data
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
docker run \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
使用该docker exec 命令通过终端/命令提示符访问 容器
docker exec -it jenkins-blueocean bash
其中的Jenkins-blueocean是改好的容器名,docker改名命令如下:
docker rename OLDNAME NEWNAME
运用war包进行安装
- 将最新的稳定Jenkins WAR文件下载 到计算机上的相应目录中。
- 打开下载目录的终端/命令提示符窗口。
- 运行命令java -jar jenkins.war。
- 浏览http://localhost:8080并等待Unlock Jenkins页面出现。
- 继续下面的安装后设置向导。
注意:此过程不会自动安装Blue Ocean功能,需要通过Jenkins中的Manage Jenkins > Manage Plugins页面单独安装
使用Maven构建Java应用程序
在Docker中运行Jenkins
linux上
docker run \
--rm \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \ 使用名称 /var/jenkins_home将容器中的目录映射到Docker 卷jenkins-data。如果此卷不存在,则此docker run命令将自动为您创建卷
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \ $HOME将主机(即本地)计算机上的/Users/<your-username>目录(通常是目录)映射到/home容器中的目录。
jenkinsci/blueocean
docker run \
--rm \
-u root \
-p 8080:8080 \
-v jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$HOME":/home \
jenkinsci/blueocean
windows上
docker run ^
--rm ^
-u root ^
-p 8080:8080 ^
-v jenkins-data:/var/jenkins_home ^
-v /var/run/docker.sock:/var/run/docker.sock ^
-v "%HOMEPATH%":/home ^
jenkinsci/blueocean
访问Jenkins/Blue Ocean Docker容器
docker exec -it jenkins-tutorials bash
Jenkins Pipline
声明性管道Declarative
Jenkinsfile(声明性管道)
pipeline {
agent any # 在任何可用的代理上执行此管道或其任何阶段
stages {
stage('Build') { # 定义“构建”阶段。
steps {
// 执行与“构建”阶段相关的一些步骤。
}
}
stage('Test') { #“测试”阶段
steps {
//
}
}
stage('Deploy') { #部署阶段
steps {
//
}
}
}
}
脚本管道基础
# 以下内容我也看不懂是啥了
在Scripted Pipeline语法中,一个或多个node块在整个管道中执行核心工作。虽然这不是Scripted Pipeline语法的强制要求,但将Pipeline的工作限制在node 块内部有两个作用:
1. 通过向Jenkins队列添加项目来计划要运行的块中包含的步骤。只要执行程序在节点上空闲,步骤就会运行。
2. 创建工作空间(特定于该特定管道的目录),可以对从源控件检出的文件执行工作。
警告:根据您的Jenkins配置,某些工作空间可能会在一段时间不活动后自动清除。有关详细信息,请参阅JENKINS-2111链接的门票和讨论 。
三个阶段: build阶段:汇编、编译、打包源码的阶段
使用Jenkins文件
字符串插值
两种方式插入字符串:
def singlyQuoted = 'Hello'
def doublyQuoted = "World"
只有后一个字符串才支持基于dollar-sign($)的字符串插值,例如:
def username = 'Jenkins'
echo 'Hello Mr. ${username}'
echo "I said, Hello Mr. ${username}"
显示结果:
Hello Mr. ${username}
I said, Hello Mr. Jenkins
并行
stage('Build') {
/* .. snip .. */
}
stage('Test') {
parallel linux: {
node('linux') {
checkout scm
try {
unstash 'app'
sh 'make check'
}
finally {
junit '**/target/*.xml'
}
}
},
windows: {
node('windows') {
/* .. snip .. */
}
}
}
pipeline 大汇总
pipeline {
agent any
environment{
QJBL = '这个变量是全局的,整个stages都能用'
}
parameters { //加入parameters之后jenkins中立即构建变为了build
string(name: 'Greeting', defaultValue: 'Hello', description: 'How should I greet the world?')
booleanParam(name: 'DEBUG_BUILD', defaultValue: true, description: '')
}
options {
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('工作环境') {
steps {
echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
}
}
stage('验证参数') {
steps {
echo "${params.Greeting} World!"
}
}
stage('building阶段名') {
environment{
username = 'Mark'
}
steps {
echo "This is ${username}"
}
}
stage('Testing阶段名') {
steps {
echo 'Testing'
sh 'cd /root'
sh 'ls' //这里显示的时/root/.jenkins/workspace/项目名 里的内容。每次只执行sh的目录都在这里,因此需要我这里均使用了绝对路径或者
sh 'pwd'
sh 'cd /data/zzh && cp -r pipeline_test01/ pipeline_test02'
}
}
stage('Deploying部署阶段') {
if (currentBuild.result == null || currentBuild.result == 'SUCCESS') {
echo 'Deploying'
}
}
}
post{
always {
//运行,无论Pipeline运行的完成状态如何。
}
等等···
}
}
各个小的模块,具体在pipeline总的位置,见下图
post
post{
always {
//运行,无论Pipeline运行的完成状态如何。
}
changed {
//只有当前Pipeline运行的状态与先前完成的Pipeline的状态不同时,才能运行。
}
failure {
//仅当当前Pipeline处于“失败”状态时才运行,通常在Web UI中用红色指示表示。
}
success {
//仅当当前Pipeline具有“成功”状态时才运行,通常在具有蓝色或绿色指示的Web UI中表示。
}
unstable {
//只有当前Pipeline具有“不稳定”状态,通常由测试失败,代码违例等引起,才能运行。通常在具有黄色指示的Web UI中表示。
}
aborted {
//只有当前Pipeline处于“中止”状态时,才会运行,通常是由于Pipeline被手动中止。通常在具有灰色指示的Web UI中表示。
}
}
option
options {
timeout(time: 1, unit: 'HOURS')
}
buildDiscarder(logRotator(numToKeepStr: '1'))
// 持久化工件和控制台输出,用于最近Pipeline运行的具体数量。
disableConcurrentBuilds()
// 不允许并行执行Pipeline。可用于防止同时访问共享资源等
skipDefaultCheckout()
// 在agent指令中默认跳过来自源代码控制的代码
skipStagesAfterUnstable()
// 一旦构建状态进入了“不稳定”状态,就跳过阶段
timeout(time: 1, unit: 'HOURS')
// 设置Pipeline运行的超时时间,之后Jenkins应该中止Pipeline
retry(3)
// 失败后,重试整个Pipeline指定的次数
timestamps()
// 预处理由Pipeline生成的所有控制台输出运行时间与发射线的时间
触发器
triggers {
cron('H 4/* 0 0 1-5')
}
triggers {
pollSCM('H 4/* 0 0 1-5')
}
工具
支持的工具有maven、jdk、gradle
tools{
maven 'apache-maven-3.0.1'
}
when
stage('Example Deploy') {
when {
branch 'production'
}
steps {
echo 'Deploying'
}
}
还有:
branch 'master'
// 当正在构建的分支与给出的分支模式匹配时执行阶段。请注意,这仅适用于多分支Pipeline。
environment name: 'DEPLOY_TO', value: 'production'
// 当指定的环境变量设置为给定值时执行阶段
expression { return params.DEBUG_BUILD }
// 当指定的Groovy表达式求值为true时执行阶段
not { branch 'master' }
// 嵌套条件为false时执行阶段。必须包含一个条件
allOf { branch 'master'; environment name: 'DEPLOY_TO', value: 'production' }
// 当所有嵌套条件都为真时,执行舞台。必须至少包含一个条件
anyOf { branch 'master'; branch 'staging' }
// 当至少一个嵌套条件为真时执行舞台。必须至少包含一个条件