说明

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 使用的更多相关文章

  1. 在容器中运行 Jenkins pipeline 任务

    持续集成中的 pipeline 技术和 docker 都是当前正在发展的主流方向,当然把它们结合起来在 CI/CD 过程中发挥出更强大的威力也是大家共同的目标.本文将介绍如何在 Jenkins pip ...

  2. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

  3. Jenkins pipeline job 根据参数动态获取触发事件的分支

    此文需要有Jenkins pipeline job 的简单使用经验 场景 我们日常的测试函数, 一般是不能仅仅在本地跑的,还需要一个公共的跑测试的环境,作为合并新的PR的依据. 如果用Jenkins ...

  4. Jenkins pipeline:pipeline 使用之语法详解

    一.引言 Jenkins 2.0的到来,pipline进入了视野,jenkins2.0的核心特性. 也是最适合持续交付的feature. 简单的来说,就是把Jenkins1.0版本中,Project中 ...

  5. Jenkins pipeline:pipeline 语法详解

    jenkins  pipeline 总体介绍 pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化. ...

  6. [持续交付实践] Jenkins Pipeline 高可用设计方法

    前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...

  7. Jenkins pipeline shared library

    Jenkinsfile https://jenkins.io/doc/book/pipeline/jenkinsfile/ Jenkins Pipeline is a suite of plugins ...

  8. Jenkins pipeline概念理解

      1.Jenkins Pipeline总体介绍 Pipeline,简而言之,就是一台运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程 ...

  9. Jenkins pipeline 语法详解

    原文地址http://www.cnblogs.com/fengjian2016/p/8227532.html pipeline 是一套运行于jenkins上的工作流框架,将原本独立运行于单个或者多个节 ...

随机推荐

  1. BF算法和KMP算法 python实现

    BF算法 def Index(s1,s2,pos = 0): """ BF算法 """ i = pos j = 0 while(i < ...

  2. 毕设之c#多线程学习(官方+转载)

    官方文档,原址:打开 如何:对 Windows 窗体控件进行线程安全调用   使用多线程提高 Windows 窗体应用程序的性能时,必须注意以线程安全方式调用控件. 示例 访问 Windows 窗体控 ...

  3. Tools (StExBar vs Cmder)which can switch to command line window on context menu in windows OS

    https://tools.stefankueng.com/StExBar.html https://github.com/cmderdev/cmder

  4. 无法获得锁 /var/lib/dpkg/lock

    sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock

  5. shell if [[ ]]和[ ]区别 || &&

    []和test 两者是一样的,在命令行里test expr和[ expr ]的效果相同. test的三个基本作用是判断文件.判断字符串.判断整数.支持使用 ”与或非“ 将表达式连接起来. test中可 ...

  6. Java 死锁

    什么是死锁? 当一个线程永远地持有一个锁,并且其他线程都尝试去获得这个锁时,那么它们将永远被阻塞,当线程A持有锁1想获取锁2,当线程B持有锁2想获取锁1 这种情况下就会产生2个线程一直在阻塞等待其他线 ...

  7. 02 基于umi搭建React快速开发框架(国际化)

    前言 之前写过一篇关于React的国际化文章,主要是用react-intl库,雅虎开源的.react-intl是用高阶组件包装一层来做国际化. 基于组件化会有一些问题,比如在一些工具方法中需要国际化, ...

  8. codeforces9A

    Die Roll CodeForces - 9A Yakko,Wakko和Dot,世界著名的狂欢三宝,哈哈,不知道你是否看过这个动画片. 某一天,过年了,他们决定暂定卡通表演,并去某些地方旅游一下.Y ...

  9. SOC四大弱点分析

    导读 今年的年度安全运营中心(SOC)调查中,SANS研究所指出了4个最为常见的SOC弱点.这些弱点的根源可被追溯到我们非常熟悉的人.过程.适度规划和技术实现上.下面我们就来看看SOC的四大弱点究竟是 ...

  10. linux 运维常用的一些命令收集

    1.删除0字节文件find -type f -size 0 -exec rm -rf {} ; 2.查看进程按内存从大到小排列ps -e   -o “%C   : %p : %z : %a”|sort ...