Jenkins 流水线 获取git 分支列表_微信小程序CI流程搭建教学(2) -- jenkins一键发布

教学仓库: https:// github.com/jinxuanzheng 01/blog-xcx-ci-demo/tree/master ,可以clone下来跟着教程 一起尝试下

CI流程搭建教学三部曲:

  • 实现云构建
  • 如何接入CI(jenkins版)
  • 搭建一个版本发布管理后台 + 企业微信机器人群通知

背景

相信长期在做小程序的同学都有过以下经历:

  • 只有固定的几台机器能发版,换台机器总担心出现点问题 (心力成本)
  • 多个小程序发版,切换多个仓库,甚至要用开发者工具去打开不同的项目(体力成本)
  • 频繁发版 + 发版流程琐碎 + 可能存在的多个小程序,一天的时间被机械劳动的事耗掉半天(时间成本)

本文主要来分享一下我这边的一套解决,实现一键发布,统一管理,在读之前最好先看下上一篇文章,不然可能会有些阻碍

关于jenkins:https://www.jenkins.io/zh/

案例

f391e738a6431d508ab4bdacd17140f4.png

这个是目前我们已经搭建好的一套服务,可以看到整个流程都做了那些事?

  • 拉取代码
  • 询问当前需要变更的版本号
  • 构建(gulp, webpack,npm)
  • 存储当前版本镜像到静态资源服务器
  • 版本信息插入数据库
  • 更改后的版本文件提交到git仓库

其中红色为必须项,黑色看情况添加,如果你想也可以加入你想要添加的任何环节,下图是我们的版本发布管理后台的界面,存储的mysql的版本信息大概是这个样子:

3a0c09e9745fe77717873c3071e3b738.png

关于管理后台第三章再讲,本文先着重描述怎么接入jenkins

Let’go

首先你需要一台云服务器用来搭建jenkins环境,推荐2核4g,不过1核2g也能跑

安装java

jenkins依赖于java环境,所以先安装java

yum install -y java-1.8.0-openjdk.x86_64

安装jenkins包

官方教程: https://www.jenkins.io/zh/doc/book/installing/ 仓库地址: http://pkg.jenkins-ci.org/redhat-stable/

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

# 运行
service jenkins start

运行成功后访服务器端口号8080

15498ca8d249c54e93f1e8d5a91ebecf.png

如果想修改端口号 vim /etc/sysconfig/jenkins, 找到JENKINS_PORT,修改后执行 service jenkins restart 即可

7cdfdbd57e6024f7a70539cced914ced.png

关于插件安装个人比较懒,点推荐快速过,后面有用到的一些插件慢慢会介绍

1cdcb96dca4ac045bf3edd43cdfe27c2.png

插件装完,中间需要创建管理员账号,一路确定最终安装成功

a2c476b2239eab7c77632bcdc2acb8f9.png

创建流水线pipeline

首先创建一个任务, 这里选择流水线(有兴趣可以了解下其他项), 点击确定

16de80435520fd18b461b2317d2788f6.png

点击流水线找到编辑script的地方

ae0230ba003200d29d5314eb318d0de6.png

afc0f88b5ed4f7bea0b28df1ac0066b9.png

这里可以选择在服务器上编写,还是从项目代码中读取jenkinsfile文件,我这里为了方便调试直接在jenkins机器上编写了

pipeline script

流水线语法官方教程: https://www.jenkins.io/zh/doc/book/pipeline/,里面讲的比较详细,可以先按下面的代码运行,遇到问题再查教程

流水线结构

写流水线之前,先想好我们整个发布流程需要做什么? 以当前例的话,大致分为5个环节:

  • 拉取代码
  • 询问需要更改的版本号
  • 安装npm包
  • 执行发布
  • 提交修改的版本号信息到仓库

每一个环节都是一个stage,先把stage列好,接下来我们一个一个补充

pipeline {
   agent any
   stages {
        // 拉取git代码
        stage('git pull') {
            steps {
            }
        }
        // 询问当前版本信息
        stage('inquirer version') {
            steps {
            }
        }
        // 构建
        stage('build') {
            steps {
            }
        }

        // 推送版本信息到git仓库
        stage('push version2git') {
            steps {
            }
        } 
   }
}

流水线语法

很多插件的语法使用还是比较复杂和琐碎的,这里提供了一个自动生成pipieline语法的功能

1b9cb541c2b81844d09ef1d71da1ea93.png

以git为例,会自动生成相应的语法,避免很多查文档的时间

15ee15e4b1b676e203750c0a61bcde30.png

拉取git代码

根据上文所述,我们需要生成流水线脚本,但是想要让仓库和jenkins建立ssh链接,需要配置git仓库的公钥和jenkins的私钥凭据

配置git仓库公钥

jenkins拉取git仓库代码,为了方便需要配下ssh秘钥

# 生成秘钥(没有要求一路回车即可)
ssh-keygen -t rsa -C "616347058@qq.com"
# 查看生成的ssh文件
cd ~/.ssh && ls  # 一般会有id_rsa id_rsa.pub两个文件, 一个私钥一个公钥

点击个人头像点击setting找到ssh,粘贴 id_rsa.pub 里的内容到输入框,点击add添加完成

89513fb5a024a56958ee5c97d614ef15.png

fdaf1f57f2ea2baa8a0bfe3eb16331d3.png

配置jenkins私钥

除了在git上配置公钥外,还需要在jenkins上配置下凭据,点击添加

87e97c1278adc3f97f4eae291ada3577.png

选择类型为ssh username,其他input的可以自己定一下的,这里需要一下,关于private项填的是私钥,需要复制id_rsa的内容,填写完成后点击添加,并在 Credentials 一栏选择刚才添加的证书

8b99ac18f57de3eec042740e05a4bdf1.png

当前页面没有显示红字即为成功

d0a2c929c3e8f030aa81b4e82242822a.png

pipeline code

// 拉取git代码
stage('git pull') {
    steps {
        git branch: 'test', credentialsId: '1', url: 'git@github.com:jinxuanzheng01/blog-xcx-ci-demo.git'
    }
}

添加到指定位置后,点击保存,尝试构建一次查看是否成功,点左下角#5可以查看当前构建进程

39ca5b02d2a593f28771b3ad1e0fd98e.png

点击console output可以查看当前log,workspaces可以查看当前工作空间

4e3c08c535a9564462b71573497b3c60.png

可以看到当前工作空间为仓库代码

c938c156a937f272753d900d63ba0882.png

询问当前版本信息

jenkins是不支持交互式命令的,所以需要换一种实现,查了下文档jenkins是有api支持的,方法名为 input,不过在进行调用之前需要获取之前的版本信息,即读取version.config.json这个文件,整体代码如下:

// 询问当前版本信息
stage('inquirer version') {
    steps {
        script { 
            // 读取版本信息
            def versionJson = readJSON file: './version.config.json', text: ''

            // 设置问题描述
            def userInput = input(
                id: 'versionInput',
                message: '请设置版本信息', 
                parameters: [
                    [defaultValue: versionJson.version, description: '设置版本号', name: 'VERSION', $class: 'TextParameterDefinition'],
                    [defaultValue: 'jenkins CI is upload trial version as: ' + new Date().format('yyyy-MM-dd HH:mm:ss'), description: '设置版本描述(please use english)', name: 'VERSIONDESC', $class: 'TextParameterDefinition']
                ])

            // 设置全局变量
            env.VERSION = userInput.VERSION;
            env.VERSIONDESC = userInput.VERSIONDESC;

            // 重写本地版本文件(为后续进行版本提交做准备)
            writeJSON file: './version.config.json', json: [version:  env.VERSION, versionDesc: env.VERSIONDESC], pretty: 4;
        }
    }
}

运行下, 会发现会提示等待,鼠标点击后弹出模态框,可以看到里面有从本地文件里提取出来的上个版本的信息,手动修改下即可

14477a46e42e78421c9c076a4c3dfc19.png

注: readJSON和 writeJSON方法依赖 Pipeline Utility Steps 这个插件,没有的话会报错

执行构建

这里实际都是构建流程,直接统一用一个“build stage” 即可, 这里步骤很简单,可以想一下从git clone下来一个项目应该干什么,这里实际就是在做这样一件事情

// 构建
stage('build') {
    steps {
        sh "npm install"
        sh "npm run build"
    }
}

不过这里依赖node环境,需要先处理下,不然会报npm not found

安装nodejs环境

这里的运行环境和本机没有关系,类似于一个沙盒,所以如果要安装node环境需要安装Config File Provider Plugin和NodeJS Plugin这两个插件

配置全局工具

安装完成后添加全局工具,找到"系统管理 -> 全局工具配置 -> NodeJS" ,点击nodejs安装,默认项即可,点击保存,重启jenkins服务,回到服务器,输入命令 service jenkins restart

95141d7384a6484eed05b8feaa66b6e0.png

pipeline code

// 构建
stage('build') {
    steps {
        nodejs('NodeJS 14.3.0') {
            sh "npm install"
            sh "npm run build"
        }
    }
}

上传成功

这时候如果没问题的话代码应该已经发布到体验版了, 这里如果报ip错误记得去微信公众后台添加一下上传的ip白名单

4e210648ac56f75df49d47d510ca8c45.png

266f11d2570302c53bfdc7efe525b667.png

提交新的版本号信息到仓库

pipeline code

基本就是将之前手动输入的命令写到脚本里

// 推送版本信息到git仓库
stage('push version2git') {
    steps {
        sh "git config --local user.name ${GIT_USER_NAME} && git config --local user.email ${GIT_USER_EMAIL}"
        sh "git add version.config.json"
        sh "git commit -m 'docs: 更改版本号为${VERSION}'"
        sh "git push origin ${BRANCH_NAME}"
    }
}

关于上面代码中的"${}",其实是预设的环境变量,我们可以把一些固定的东西提出来,避免硬编码,例如:

pipeline {
   agent any
   // 环境变量 
   environment {
       GIT_USER_NAME = 'jenkinsCI'
       GIT_USER_EMAIL = 'test@163.com'
       GIT_ADDRESS = 'git@github.com:jinxuanzheng01/blog-xcx-ci-demo.git'
       BRANCH_NAME = 'master'
   }
}

更改jenkins账号权限

直接进行push的话,git会报权限不足,这里倒不是因为ssh秘钥有问题,而是jenkins在执行的时候使用的不是linux机器的root权限,而是一个jenkins的账号

49999cf7ac7aa1e90bf6b116e57d1ba7.png

所以最快速的做法是将jenkins运行环境修改为root权限

# 打开配置文件
vim /etc/sysconfig/jenkins

# 修改jenkins_user为root, 默认为jenkins
$JENKINS_USER="root"

# 修改相关文件夹权限组
chown -R root:root /var/lib/jenkins
chown -R root:root /var/cache/jenkins
chown -R root:root /var/log/jenkins
# 重启jenkins
service jenkins restart

运行pipeline

重新构建,jenkins无报错,查看git仓库,执行成功

8cb1490fe48c97e2b14aa3e2755b27c5.png

Running success

到此为止,整个pipeline已经work,你可以很轻松的尝试一键发布小程序

e8675b52770cac0d063a89d8708e5e8e.png

尤其是有多个小程序项目的时候,可以单独建个分组,方便集中管理,再也不需要手动切入不同的仓库,甚至使用小程序开发者工具去打开各个小程序,大概如下

b9d9f161eefc270a6408ebf5964119ae.png

项目集中管理不香么?

Tips: jenkins流水线代码已经放到仓库里了,地址 https://github.com/jinxuanzheng01/blog-xcx-ci-demo/blob/master/Jenkinsfile

额外补充

权限管理

jenkins有很多的功能插件,比如权限管理,这个还是个比较刚需的功能,可以自行Google下并不难

发送http请求

在pipeline中有时候需要去请求一些我们的其他服务,可以使用HTTP Request Plugin这个插件,文档地址:https://plugins.jenkins.io/http_request/里面有一些demo

npm切换私有仓库

方法一: npm可以直接用npm_token登录 方法二:项目内设置.npmrc,填写私有仓库 + 用户信息

jenkins使用docker报权限不足

80ad39b3fb9f257a79144c7ad229dc49.png

修改jenkins账号权限为root权限即可,上文有写,也可以直接修改docker.sock这个文件权限,如 chmod 777 /var/run/docker.sock

手动安装jenkins插件

使用jenkins的插件管理安装插件很慢,有的时候还会失败,这里提供一个手动安装的方法

jenkins插件库: http://updates.jenkins-ci.org/download/plugins/config-file-provider/ 搜索需要的插件下载(一般是*.hpi格式的),打开jenkins "系统管理 -> 插件管理 -> 高级",选择下载的文件上传即可

8d9b23a20de57d866231a9777c1b67d6.png
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值