您的当前位置:首页正文

Jenkins Pipeline and JenkinsX

来源:华拓网

Jenkins Pipleline插件介绍

Jenkins 2.x的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。

Pipeline的几个基本概念:

  • Stage: 阶段,一个Pipeline可以划分为若干个Stage,每个Stage代表一组操作。注意,Stage是一个逻辑分组的概念,可以跨多个Node。
  • Node: 节点,一个Node就是一个Jenkins节点,或者是Master,或者是Agent,是执行Step的具体运行期环境。
  • Step: 步骤,Step是最基本的操作单元,小到创建一个目录,大到构建一个Docker镜像,由各类Jenkins Plugin提供。

Jenkins Pipleline插件:

Jenkins Pipeline语法参考

以下是完整的Jenkins Pipeline语法参考卡。 当然,当您添加插件或插件更新时,新的流水线脚本元素将在您的环境中可用。 Pipeline代码段生成器和UI将自动添加这些和任何相关的帮助文本,以便您知道如何使用它们!

Basics

image

Advanced

image

File System

image

Flow Control

image

Docker

image image

Jenkins Pipleline 脚本示例

  1. stage 'build'
  2. node {
  3. git '
  4. withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
  5. sh "mvn -B –Dmaven.test.failure.ignore=true clean package"
  6. }
  7. stash excludes: 'target/', includes: '**', name: 'source'
  8. }
  9. stage 'test'
  10. parallel 'integration': {
  11. node {
  12. unstash 'source'
  13. withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
  14. sh "mvn clean verify"
  15. }
  16. }
  17. }, 'quality': {
  18. node {
  19. unstash 'source'
  20. withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
  21. sh "mvn sonar:sonar"
  22. }
  23. }
  24. }
  25. stage 'approve'
  26. timeout(time: 7, unit: 'DAYS') {
  27. input message: 'Do you want to deploy?', submitter: 'ops'
  28. }
  29. stage name:'deploy', concurrency: 1
  30. node {
  31. unstash 'source'
  32. withEnv(["PATH+MAVEN=${tool 'm3'}/bin"]) {
  33. sh "mvn cargo:deploy"
  34. }
  35. }

注:m3表示Jenkins配置的maven名称。

Jenkins Pipeline Docker脚本示例

Docker Pipeline插件公开了一个Docker全局变量,它为普通的Docker操作提供DSL,只需要在运行步骤的执行程序上使用一个Docker客户端(在您的节点步骤中使用一个标签来定位启用Docker的代理)。

默认情况下,Docker全局变量连接到本地Docker守护程序。 您可以使用docker.withServer步骤连接到远程Docker主机。 图像步骤为特定的Docker图像提供句柄,并允许执行其他与图像相关的其他步骤,包括image.inside步骤。 内部步骤将启动指定的容器并在该容器中运行一个步骤:

示例1:

  1. docker.image('maven:3.3.3-jdk8').inside('-v ~/.m2/repo:/m2repo') {
  2. sh 'mvn -Dmaven.repo.local=/m2repo clean package'
  3. }
  1. node{

  2. // 代码检出

  3. stage('get Code') {

  4. }

  5. // 镜像中进行单元测试

  6. stage('unit testing'){

  7. // 启动golnag:1.7并在golang内编译代码

  8. docker.image('golang:1.7').inside {

  9. sh './script/unittest.sh'

  10. }

  11. }

  12. // 镜像中代码构建

  13. stage('Build'){

  14. def confFilePath = 'conf/app.conf'

  15. def config = readFile confFilePath

  16. writeFile file: confFilePath, text: config

  17. // 启动golnag:1.7并在golang内编译代码

  18. docker.image('golang:1.7').inside {

  19. sh './script/build.sh'

  20. }

  21. }

  22. // 编译镜像并push到仓库

  23. def imagesName = '192.168.18.250:5002/ufleet/uflow:v0.9.1.${BUILD_NUMBER}'

  24. stage('Image Build And Push'){

  25. docker.build(imagesName).push()

  26. }

  27. }

  28. // 启动刚运行的容器

  29. stage('deploy iamegs'){

  30. // 需要删除旧版本的容器,否则会导致端口占用而无法启动。

  31. try{

  32. sh 'docker rm -f cicdDemo'

  33. }catch(e){

  34. // err message

  35. }

  36. docker.image(imagesName).run('-p 9091:80 --name cicdDemo')

  37. }

  38. }

更多使用方法请参考Jenkins Pipeline docker语法。

另外可以借助Pipeline Syntax来生成基本的脚本:

image

Jenkins Pipeline war 包部署示例

  1. stage name: 'Production', concurrency: 1
  2. node {
  3. unarchive mapping: ['target/x.war' : 'x.war']
  4. deploy 'target/x.war', 'production'
  5. echo 'Deployed to
  6. }

本博参考文章:

更多阅读Jenkinsfile参考:

1.在本地安装jx命令行工具

curl -L | tar xzv

mv jx /usr/local/bin

通过已存在的k8s上安装只需要执行 #jx install即可

这里说下使用JX创建一个k8s集群安装jenkins X的注意点:

.执行命令#jx create cluster minikube 会默认下载minikube,kubectl和helm到~/.jx/bin目录下,所以这里需要将该路径加入到系统PATH下;

.安装一款虚拟机软件支持kvm,virtualbox,no(使用docker的话选此选项,注意一定要为其指定专门的网桥)

.根据提示输入内存(默认4096M)输入CPU核数(默认3),选择虚拟机,确定会自动下载Minikube ISO(142.22M)并启动虚拟机加载该镜像