jenkins Pipeline 使用
说明
Jenkins pipeline 是一套插件,支持将连续输送管道实施和整合到Jenkins。Pipeline提供了一组可扩展的工具,用于通过管道DSL为代码创建简单到复杂的传送流水线。他目前支持jenkins 2.x以上版本。pipeline是由groovy语言编写
参考:https://www.cnblogs.com/YatHo/p/7856556.html
基础使用范例
pipeline分为两种一种为jenkinsfile使用,一种直接在网页界面中输入脚本内容,本文介绍第二种使用方法
新建一个项目:

使用jenkins Groovy脚本实现源码拉取、源码打包、包上传与部署
首先源码拉取:
由于使用groovy语言,需要先生成pipeline可以用的git链接地址,生成方法如下:


链接格式如下:
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'b96e05e1-193f-4e06-9195-fcaf31f579e9', url: 'http://10.10.10.217/test/test.git']]])
需要将此链接加到pipeline脚本里
编写pipeline脚本(本示例只做了拉取和打包):
pipeline {
agent any
//此处为环境变量设置,定义变量需要用加上 "def"
environment {
def ITEMNAME = "flagship"
def SRCCODE_DIR = "/root/.jenkins/workspace/test_pipeline/flagship-bigdata/"
}
//此处即可开始进行代码部署操作
stages {
stage('代码拉取并打包'){
steps {
echo "checkout from ${ITEMNAME}"
//生成的git链接地址
checkout ([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'b96e05e1-193f-4e06-9195-fcaf31f579e9', url: 'http://10.10.10.217/test/test.git']]])
echo "开始打包 "
//执行shell命令
sh 'export JAVA_HOME=/usr/local/java/jdk1.7.0_80 && cd $SRCCODE_DIR && mvn clean install -DskipTests -Denv=beta'
}
}
}
}
其他部署操作按照stage{ steps{} }的格式进行编写即可

构建完成后如图所示(查看log)

建议方案:jenkins+gitlab+ansible(playbook)
语法示例:
https://jenkins.io/doc/book/pipeline/
https://jenkins.io/doc/book/pipeline/syntax/#stage

上图中①表示定义执行jenkins pipeline等流程的节点

pipeline+gitlab+ansible简单部署案例
pipeline脚本内容
pipeline {
agent any
environment {
def maven_home = "/usr/local/maven3.5/"
def ITEMNAME = "hzjry"
}
stages {
stage('代码拉取并打包'){
steps {
echo "checkout from ${ITEMNAME}"
checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '9a3eb706-aa23-4a07-8e00-188d91fbd98d', url: 'http://10.10.10.217/hz-cloud/hz-cloud.git']]])
echo "开始打包 "
sh 'export JAVA_HOME=/usr/local/java/jdk1.7.0_80 && cd ${WORKSPACE} && /usr/local/maven3.5/bin/mvn clean install -Dmaven.test.skip=true -Pbeta'
}
}
stage('部署项目'){
steps {
echo "上传部署"
sh 'ansible-playbook -i /etc/ansible/hosts /etc/ansible/hzjry/main.yml -e "host=hzjry_admin"'
}
}
}
}
说明:因为构建的时候定义了参数化构建,所以在选定源码仓库分支的时候用了变量(branch),所以生成的pipeline script里的git 地址为 ${branch}
ansible-playbook内容
[root@bogon hzjry]# tree roles/tomcat
roles/tomcat
├── files
│ └── index.html
├── handlers
│ └── main.yaml
├── tasks
│ └── main.yml
├── templates
│ ├── a.txt
│ ├── b.txt
│ └── nginx.conf.j2
└── vars
└── main.yml [root@bogon hzjry]# cat main.yml
---
- hosts: "{{ host }}"
gather_facts: False
roles:
# - init
- tomcat [root@bogon tomcat]# cat tasks/main.yml
- name: 查看目录
shell: ls /opt/tomcat-/webapps | grep admin
register: admin_dir
ignore_errors: True - name: 创建目录
file: "path={{ tomcat_dir }}/webapps/admin state=directory"
when: admin_dir|failed - name: 关闭tomcat
shell: chdir={{ tomcat_dir }}/bin nohup ./shutdown.sh & - name: 检查进程是否还存在
shell: ps -ef |grep {{ tomcat_dir }}|grep -v "grep"|awk '{print $2}'
register: pid_exist
ignore_errors: True - name: 进程存在就杀死
shell: ps -ef |grep {{ tomcat_dir }}|grep -v "grep"|awk '{print $2}'|xargs kill -
when: pid_exist|success #- name: backup old code
# shell: chdir={{ tomcat_root }}/webapps tar -czf /root/xxx_$(date -d "today" +"%Y%m%d_%H%M%S").tar.gz - name: clean cache|清除缓存
shell: chdir={{ tomcat_dir }} rm -rf work - name: 解压war包
unarchive: src={{ war_dir }}/cloud-admin-0.0.-SNAPSHOT.war dest={{ tomcat_dir }}/webapps/admin copy=yes
# when: {{ service }}="admin" - name: 启动tomcat
shell: export {{ item }} && chdir={{ tomcat_dir }}/bin nohup ./startup.sh &
with_items:
- JAVA_HOME=/usr/local/java/jdk1..0_151
- CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
- PATH=$PATH:${JAVA_HOME}/bin
[root@bogon tomcat]# cat vars/main.yml
---
tomcat_dir: /opt/tomcat-
war_dir: /var/lib/jenkins/workspace/test-pipeline/hz-cloud-management/cloud-admin/target/
jenkins构建时,在部署上传steps处报错,如下所示:
fatal: [10.20.200.224]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).\r\n", "unreachable": true}
[WARNING]: Failure using method (v2_runner_on_unreachable) in callback plugin
(</usr/lib/python2./site-
packages/ansible/plugins/callback/log_plays.CallbackModule object at
0x1e32fd0>): [Errno ] Permission denied:
u'/var/log/ansible/hosts/10.20.200.224'
[WARNING]: Could not create retry file '/etc/ansible/hzjry/main.retry'.
[Errno ] Permission denied: u'/etc/ansible/hzjry/main.retry'
但是在服务器终端页面执行ansible-playbook则没有出现问题,推测可能是权限问题
jenkins yum安装,在执行部署的时候默认使用jenkins用户进行部署,默认jenkins用户是无法连接远程服务器的,所以需要配置连接认证
解决方法一
//修改Jenkins配置文件
# 打开配置文件
vim /etc/sysconfig/jenkins
# 修改$JENKINS_USER,并去掉当前行注释
$JENKINS_USER="root" //修改Jenkins相关文件夹用户权限
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins //重启Jenkins服务并检查运行Jenkins的用户是否已经切换为root
# 重启Jenkins(若是其他方式安装的jenkins则重启方式略不同)
service jenkins restart# //查看Jenkins进程所属用户
ps -ef | grep jenkins #若显示为root用户,则表示修改完成机修
继续执行可部署成功
解决方法二
配置jenkins的用户终端,修改jenkins用户shell为bash
jenkins:x:::Jenkins Automation Server:/var/lib/jenkins:/bin/bash
配置jenkins用户连接ssh免秘钥
[root@bogon tomcat]# su jenkins
bash-4.2$ ssh-keygen -t rsa bash-4.2$ ssh-copy-id root@10.20.200.224
修改ansible主机组信息
cat /etc/ansible/hosts [hzjry_admin]
10.20.200.224 ansible_ssh_private_key_file=/var/lib/jenkins/.ssh/id_rsa ansible_ssh_user='root'
继续执行

jenkins Pipeline 使用的更多相关文章
- 在容器中运行 Jenkins pipeline 任务
持续集成中的 pipeline 技术和 docker 都是当前正在发展的主流方向,当然把它们结合起来在 CI/CD 过程中发挥出更强大的威力也是大家共同的目标.本文将介绍如何在 Jenkins pip ...
- 基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...
- Jenkins pipeline job 根据参数动态获取触发事件的分支
此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...
- Jenkins pipeline:pipeline 使用之语法详解
一.引言 Jenkins 2.0的到来,pipline进入了视野,jenkins2.0的核心特性. 也是最适合持续交付的feature. 简单的来说,就是把Jenkins1.0版本中,Project中 ...
- Jenkins pipeline:pipeline 语法详解
jenkins pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...
- [持续交付实践] Jenkins Pipeline 高可用设计方法
前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...
- Jenkins pipeline shared library
Jenkinsfile https://jenkins.io/doc/book/pipeline/jenkinsfile/ Jenkins Pipeline is a suite of plugins ...
- Jenkins pipeline概念理解
1.Jenkins Pipeline总体介绍 Pipeline,简而言之,就是一台运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程 ...
- Jenkins pipeline 语法详解
原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节 ...
随机推荐
- HTML编码规则
<!DOCTYPE html><!-- 为每一个HTML页面的第一行添加标准模式 --> <html lang="en-us"> <!-- ...
- asp.net webform设计思路的思考
我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...
- python 中的列表(list)
一.生成一个列表 直接生成 L1 = [1, 2, 3, 4, 5] 列表解析式 >>> L2 = [x for x in range(1, 10, 2)] #从1到10的迭代,步长 ...
- 变更RHEL(Red Hat Enterprise Linux 5.8)更新源使之自动更新
HP 4411s Install Red Hat Enterprise Linux 5.8) pick up from http://blog.chinaunix.net/uid-423637-id- ...
- centos 7 修改系统屏幕分辨率
centos 7 修改系统屏幕分辨率,命令方式和图形方式的修改方法. 命令:xrandr 通过命令 xrandr 修改系统的分辨率,输入xrandr: bash [admin@localhost ~] ...
- Alpha、伪Beta 发布个人感想与体会
1.Alpha版本 在Alpha版本发布时,我在Fantacy组,那时的体会我已在前面写过,现在回想起来,我觉得自己的决定似乎做的并不是很糟糕,因为来到新的团队里,我学到了很多东西,认识了很多技术很好 ...
- 同步工具:CountDownLatch、CyclicBarrier和Semaphore
1. CountDownLatch 1.1 功能及使用场景 一个同步工具,使得一个或多个线程等待一组线程执行完成后再执行. 使用场景:等待一些前置任务执行完成后,再执行特定的功能.比如,系统启动时,各 ...
- pgm15
这部分我们讨论结构学习,也就是 graph 的边我们并不清楚.很自然我们可以用 fully observed 数据来做,但是也可能碰到有 missing data 的情况.一般来说前者是比较常见的.就 ...
- BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra
题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...
- 我的G++编译选项
-Wall -Wextra -g3 -DLOCAL -Wshadow -Wpointer-arith -Wcast-qual -Waggregate-return -Winline -Wunreach ...