说明

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. is interest important?

    学习是不是一定要看兴趣呢?高中时觉得只要肯学即使不喜欢又能如何,大学之后被深深打脸,面对一周那么多的实习和报告,我悄悄告诉自己不是这块料 有一些事情我就是学不会.我却很容易相信一个人. 因此,无论我如 ...

  2. [福大软工] Z班 评测作业对应表

    学号 测试组号 011500908 8 031501102 3 031501118 8 031502106 6 031502109 9 031502113 3 031502142 2 03150220 ...

  3. mac安装sublime text 3,含注册码

    软件下载地址: https://www.sublimetext.com/3 注册码如下: —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-89 ...

  4. Activiti的部署问题

    http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html 既可以通过每次Spring应用程序启动时,执行部署命令. ...

  5. Linux shell 菜鸟学习笔记....

    20171123 Linux shell 基础学习笔记1. shell 的开始 一般是 #!/bin/bash 通过 #! 来唯一指定使用的shell路径 其他的 # 都表示注释.2. shell 的 ...

  6. Jfrog Artifactory 创建docker 镜像仓库以及 push 镜像到 该仓库.

    1. 安装aitifactory 以及 启动 使用30天有效期激活 不在阐述. 2. 登录artifactory username:admin password:password 3. 创建 仓库 在 ...

  7. [转帖] “王者对战”之 MySQL 8 vs PostgreSQL 10

    原贴地址:https://www.oschina.net/translate/showdown-mysql-8-vs-postgresql-10?lang=chs&page=2# 英文原版地址 ...

  8. python模块_多重继承的MRO

    MRO(Method Resolution Order):方法解析顺序.Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多问题,比如二义性,Python中一切皆引用 ...

  9. GlusterFS卷的优化

    GlusterFS可以通过配置选项来优化卷 配置选项 用途 默认值 合法值 network.ping-timeout    客户端等待检查服务器是否响应的持续时间,节点挂了数据不能写入 42 0-42 ...

  10. 用java编网页的学习流程,我的一些小心得(初学java到高深运用)

    (1)java基础:首先得会写int,String,for循环,数组,**等等(熟练各种基础的关键字,各种java自带的排序,随即等等算法)什么是封装,继承,多态,然后private,public,p ...