2021-07-31 系统化装修 2021-06-13 初稿

www.jenkins.io_zh_ (1).png

0 基础概念

信息卡片

新技术QA
技术名称 Jenkins
文档官网 https://www.jenkins.io/zh/
作者、技术团队
能做解决什么问题 自动执行脚本,CI/CD
特点、优点 开源免费、自托管、生态优秀
同类选型 gitlab CI / teamcity 等
缺点、踩坑注意 尽量使用配置文件,纳入版本管理
宣传语 Jenkins构建伟大,无所不能
选型关键词 CI/CD

官方网站标语:

Jenkins构建伟大,无所不能 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

Jenkins 一直是公司的持续集成工具,同类选型工具有 gitlabCI / TeamCity ,但Jenkins凭借着可以自托管的优点,一直收到青睐。关于如何选型,可以看我的一篇文章:前端可以弄懂的CI/CD

Jenkins从使用程度来说,是其中的佼佼者,前端熟悉Jenkins还是值得的。

[

](https://www.yuque.com/xinbao37/roadmap/docker-basic.md)

1 安装、配置、使用

1.1 安装

本文尝试通过本地的docker运行一个Jenkins,需要你有docker知识,如果你不熟悉docker,可以看我的docker文章 前端可以弄懂的Docker基础

docker下载官方最新lts镜像,这里锁版本:

  1. docker pull jenkins/jenkins:2.298-alpine

如果想自己查找版本,点击这里 https://hub.docker.com/r/jenkins/jenkins/tags?page=1&ordering=last_updated(从经验来看 vscode+docker 合起来用最省心,体验太好了。)

image.png

上图是Docker面板,这里我指定了Jenkins的web端口是 8222

数据映射这里 jenkins-data:/var/jenkins_home。备忘 admin-123456a

剩下的就是等待重启访问即可。简单初始化操作见官方操作文档

  • docker run 安装完成,根据控制台密码,进入web页面
  • 安装插件,当然是全选!完事记得安装 Blue Ocean ,下面讲到

注意,我们需要在docker里运行jenkins,同时jenkins有需要使用docker环境,套娃。两种方案:dind 一个容器里跑,不够优雅,dood共享宿主docker资源,推荐 dood
思路是

  • 启动jenkins容器时候传递 docker.sock
  • 容器内部继续安装docker

细节看这里 https://gitee.com/help/articles/4332

  1. docker run -d --restart always -p 8085:8080 -v /var/run/docker.sock:/var/run/docker.sock --name jenkins --hostname jenkins --volume jenkins-data:/var/jenkins_home jenkins/jenkins:2.298-alpine

这里略过吧,如果使用第三方CI,会自动做好这件事。

1.2 配置

更新:这里我删掉了大量描述内容,也就是下图创建自由风格的选项。理由是过时了,我们专注流水线语法。
image.png

1.3 使用

2 配置文件

2.1 概念

除了第一次所必要的设置,后续就是持续优化 Pipe 流水线,也就是操作的step。使用纯文本而不是填写表单,好处不言而喻,纯文本能够集成进git中,纳入操作审计。

略过 blue ocean 创建,补充git仓库。提示没有流水线配置文件,点击创建。
image.png

image.png

2.1 配置文件怎么写

官方文档 https://www.jenkins.io/zh/doc/book/pipeline/syntax/#agent
下面是一个简单的示例,用于观察语法结构:

  1. pipeline {
  2. agent {
  3. docker {
  4. # registryUrl 'https://coding-public-docker.pkg.coding.net' # 这个牛逼了
  5. image 'node:14-alpine'
  6. args '-p 3000:3000'
  7. }
  8. }
  9. environment {
  10. ENV = 'production'
  11. }
  12. stages {
  13. stage('Build') {
  14. steps {
  15. sh 'npm install'
  16. }
  17. }
  18. stage('Test') {
  19. steps {
  20. sh './jenkins/scripts/test.sh'
  21. }
  22. }
  23. stage('Deliver') {
  24. steps {
  25. sh './jenkins/scripts/deliver.sh'
  26. input message: 'Finished using the web site? (Click "Proceed" to continue)'
  27. sh './jenkins/scripts/kill.sh'
  28. }
  29. }
  30. }
  31. }

总的来说,是下面的结构:

  1. pipeline {
  2. agent {}
  3. environment {}
  4. stages {
  5. stage('A') {
  6. steps {
  7. // sh 'npm install'
  8. }
  9. }
  10. }
  11. }

2.1.1 agent

操作的主机。一般来说,主机会自带一些常用的SDK,比如coding就明确指出,默认的机器会自带前端关心的node和yarn,可能版本会滞后。https://help.coding.net/docs/ci/ways.html

如果选择自己制定环境,也可以指定 dockerfile 路径。

  1. any # 使用默认环境
  2. # 走官方的image
  3. docker{image:"node:14-alpine"} 使用 docker 环境
  4. node:14 node环境
  5. # 通过docker设定镜像
  6. docker {
  7. reuseNode false
  8. registryUrl 'https://coding-public-docker.pkg.coding.net'
  9. image 'public/docker/nodejs:14'
  10. }
  11. # 可以选定 dockerfile
  12. dockerfile {
  13. filename 'Dockerfile'
  14. reuseNode true # 使用根节点的工作空间
  15. }

2.1.2 environment

环境变量

2.1.3 stages

操作步骤,由多个 stage 组成。
stage里也可以包含 agent

最常见的内容是

  1. stage('name') {
  2. steps {
  3. sh 'node -v'
  4. }
  5. }
  6. #retry(3){} 重试三次
  7. #timeout(time:3,unit:"MINUTES"){} 超时设置

缓存

  • npm /root/.npm/
  • yarn /usr/local/share/.cache/yarn/

两种方式

  • args '-v /root/.gradle/:/root/.gradle/ -v /root/.m2/:/root/.m2/'
  • 使用docker语法
    1. docker.image('node:14').inside('-v /root/.npm/:/root/.npm/') {
    2. sh 'npm install'
    3. }

yi


什么是 blue ocean
https://www.jenkins.io/zh/doc/book/blueocean/getting-started/


一段代码如何拿到git log

  1. sh """logs=`git log --pretty=format:'%s' ${env.MR_TARGET_BRANCH}... --no-merges`;
  2. echo "\$logs" | while read i; do echo \$i | npx commitlint; done
  3. """

  • post 传递信息
    • always{}
      • 比如运行测试用例
    • success{}
    • failure{}

检出代码

  1. checkout([
  2. $class: 'GitSCM',
  3. branches: [[name: GIT_BUILD_REF]],
  4. userRemoteConfigs: [[
  5. url: GIT_REPO_URL,
  6. credentialsId: CREDENTIALS_ID
  7. ]]
  8. )

仔细一看还行,大写字母是环境变量

  • $class
  • branches 设定分支
  • userRemoteConfigs 设定远程配置文件

基本信息 - 流程配置 - 触发规则 - 变量与缓存 - 通知提醒

操作步骤
前端可以弄懂的Jenkins - 图6

-1 参考文档

https://www.jenkins.io/zh/doc/tutorials/build-a-node-js-and-react-app-with-npm/https://plugins.jenkins.io/nodejs/

jenkins有很多常用插件,这里做个搬运

目前推荐安装 blueOcean ,一个重构版 https://www.jenkins.io/zh/doc/book/installing/

  1. docker pull jenkinsci/blueocean:1.24.7

插件:

  • Organization and Administration 组织和管理
    • Dashboard View 仪表盘,yes
    • Folders Plugin 文件夹插件,使用目录管理项目,yes
    • Configuation as Code 配置代码,no
    • OWASP Markup Fomatter Plugin,yes
  • Build Features 构建功能
    • build name and description setter 构建名称和描述设置 no
    • build timeout构建超时 yes
    • config file provider 配置文件提供程序 no
    • credentials binding plugin凭证绑定插件
    • embeddable build status可嵌入的构建状态 yes
    • rebuilder 重建者
    • SSH Agent ssh代理
    • throttle concurrent builds 限制并发构建
    • timestamper时间戳 ,控制台删除时间戳,yes
    • workspace cleanup 工作区清理。主动删除,yes
  • Build Tools 构建工具
    • ant ,过时内容 no
    • gradle ,java相关,no
    • MSBbuild,vs相关 no
    • node, 前端必备 yes
  • Build Analysis and Reporting 构建分析和报告
    • 覆盖范围no
    • html publlisher plugin no
    • jUnit plugiin no
    • 下一代警告no
    • xUnit no
  • Pipelines and Continuous Delivery 不翻译不较好
    • pipeline 必须yes
    • github branch source plugin yes
    • pipe: github groovy库 yes
    • pipe:stage view yes
    • 条件构建步骤
    • 多任务
    • 参数化触发器
    • copy artifact
  • Source Code Management 源代码管理
    • 只考虑 git 就行
  • Distributed Builds 分布式构建
    • 矩阵项目插件
    • ssh代理 yes
    • windows 代理 no
  • User Management and Security 用户管理和安全
    • 矩阵授权策略插件 yes
    • pam认证 yes
    • ldap, yes
    • 角色授权
    • 活动目录
    • 授权项目
  • Notifications and Publishing 通知和发布
    • email yes
    • emial 拓展
    • 邮件插件 yes
    • ssh 发布
    • ssh 远程执行shell
  • Languages
    • locale
    • chinease 必须

一般流程
code - git - jenkins -npm i -npm build - deploy - 测试

如果引入了docker
code - git - jenkins -npm i- docker build-docker push -harbor负责docker pull - docker run -测试