Jenkins

DevOps

Jenkins 是一个简单易用的持续集成软件平台。是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成持续交付

# 一、Jenkins基础

# 1.1 持续交付流程

  • 拉取代码
  • 打包构建
  • 上传镜像
  • 运行容器
  • 维护清理

# 二、Jenkins部署

# 2.1 Docker部署Jenkins

部署jenkins服务

mkdir -p /usr/local/docker/jenkins
cd /usr/local/docker/jenkins
1
2

修改权限(1000:1000 是用户UID和用户组GID),赋予data目录设置归属用户Id。

mkdir -p /usr/local/docker/jenkins/data
chown -R 1000:1000 /usr/local/docker/jenkins/data/
1
2

​ 为什么是 1000,可以看看 Dockerfile 就明白了。https://hub.docker.com/_/jenkins/ (opens new window)

0

编写docker-compose.yml

vi docker-compose.yml
1
version: '3.1'
services:
  jenkins:
    restart: always
    image: jenkins/jenkins:lts
    container_name: jenkins
    ports:
      # 发布端口
      - 8080:8080
      # 基于 JNLP 的 Jenkins 代理通过 TCP 端口 50000 与 Jenkins master 进行通信
      - 50000:50000
    environment:
      TZ: Asia/Shanghai
    volumes:
      - ./data:/var/jenkins_home
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

查看默认密码:

cat /usr/local/docker/jenkins/data/secrets/initialAdminPassword
1

启动成功后访问 Jenkins 服务器,访问Ip:8080

# 三、Jenkins配置

# 3.1 初始化配置

1

选择插件来安装

2

保持默认插件不动并务必勾选 Publish Over SSH 插件

3

等待下载插件

4

安装完成后设置自己的账号密码

5

6

7

# 3.2 配置 Jenkins插件

# 1、配置JDK& Maven

  • 上传 JDK 和 Maven 的 tar 包到服务器(容器数据卷目录)

由于/var/jenkins_home被挂载到data目录,所以将JDK包上传至容器所在宿主机的数据卷目录即可(即/usr/local/docker/jenkins/data

上传步骤:

  1. 上传JDK包至/usr/local/docker/jenkins/data目录;
  2. 进行解压tar -zxvf xxxx.tar.gz
  3. 删除原压缩包rm -rf xxxx.tar.gz
  • 全局配置安装JDK

Manage Jenkins -> Global Tool Configuration

11

JDK 1.8.0_201
/var/jenkins_home/jdk1.8.0_201
1
2

12

  • 全局配置安装MAVEN
Apache Maven 3.3.9
/var/jenkins_home/apache-maven-3.3.9
1
2

13

# 2、配置NodeJS

  • 安装NodeJS插件

16

安装之后进行重启jenkins。

  • 上传Linux 二进制文件的NodeJS包

上传步骤:

  1. 上传NodeJS包至/usr/local/docker/jenkins/data目录;
  2. chown -R 1000:1000 /usr/local/docker/jenkins/data/node-v16.13.1-linux-x64.tar.xz
  3. 进行解压xz -d node-v16.13.1-linux-x64.tar.xz
  4. tar -xvf node-v16.13.1-linux-x64.tar
  5. 删除原压缩包rm -rf node-v16.13.1-linux-x64.tar
  • 全局配置安装NodeJS

Manage Jenkins -> Global Tool Configuration

17

NodeJS 16.13.1
/var/jenkins_home/node-v16.13.1-linux-x64
1
2

# 3、配置其他插件

  • 配置本地化插件Locale

该插件的主要目的是显示中文。

14

  • 安装动态参数插件Extended Choice Parameter

该插件的主要目的是为了方便我们后面在做项目构建时可以按照版本进行构建(支持一键回滚哦)。

15

安装完插件后,再重启jenkins容器

docker-compose down
docker-compose up -d
1
2

# 3.3 配置Gitee SSH免密登录

获取当前jenkins容器的SSH,配置当前jenkins容器的 GitLab/gitee 的 SSH 登录。

  • 交互式进入 Jenkins 容器
docker exec -it jenkins /bin/bash
1

生成 SSH KEY

ssh-keygen -t rsa -C "superc@gmail.com"
1
  • 查看公钥
cat /var/jenkins_home/.ssh/id_rsa.pub
1
  • 复制公钥到 GitLab/gitee SSH公钥

  • 手动克隆一次项目,该步骤的主要作用是为了生成和服务器的验证信息

git clone git@gitee.com:xxx/xxxProject.git
1
  • 查看刚才生成的文件(known_hosts

30

  • 删除刚才下载的项目
rm -rf cccPress
1

最终生成的.ssh文件夹中的文件,会外挂至宿主机的data目录,所以只是初次生成即可,后续重启jenkins容器,不需再进行生成了。

# 3.4 配置 Publish over SSH

配置所需部署项目所在的服务器的信息。后续持续交付操作,会使用SSH进行登录。

  • 新增SSH Servers

Manage Jenkins -> System Configuration

31

进入以后,拉到底下的Publish over SSH配置服务器的信息,点击新增SSH Servers

32

其中 Remote Directory 是指 Jenkins 在目标服务器操作的目录。

  • 测试是否能够正常通信

点击下方的Test Configuration按钮进行测试,出现Success,则表示配置通信成功。

  • 保存配置

配置完System Configuration,最好还是重启Jenkins容器。

# 四、Jenkins使用

# 4.1 创建项目-初次构建

新建任务 -> 构建一个自由风格的软件项目

41

丢弃旧的构建:若保持构建的最大个数设置为5,表示只保留最新的5次构建记录。

  • 配置源码管理

在gitee项目中,复制SSH地址

43

配置源码

42

  • 构建环境

选择nodejs

44

  • 构建

点击增加构建步骤 -> 执行shell

输入如下命令:

echo $PATH
node -v
npm -v
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm -v
cnpm install #编译
rm -rf dist #删除上一次构建生成的文件夹
cnpm run build   #构建
cd dist
tar -zcvf dist.tar.gz * #压缩当前目录的所有文件
1
2
3
4
5
6
7
8
9
10

45

  • 构建后操作

点击增加构建后操作步骤 -> Send build artifacts over SSH

dist/dist.tar.gz

/usr/local/docker/ui/cccPress/nginx_press_ssl/html

cd /usr/local/docker/ui/cccPress/nginx_press_ssl/html
tar -zxvf dist.tar.gz
rm -rf dist.tar.gz
1
2
3
4
5
6
7

46

Remote directory:远程目录(即SSH Server部署项目的地址目录),需注意:如果在Publsh over SSH中配置了远程目录,那么该路径的相对路径为当时配置的Remote Directory

上面的操作就是要将dist里的内容放到这个工作目录上。

  • 立即构建

配置完成后点击保存,点击立即构建,查看构建日志是否Success。

# 4.2 配置项目—持续交付

上面的初次构建,主要是为了下载node_modules,以及构建基础环境。

真正的持续交付部署,是构建tag版本的代码,指定tag构建部署,还可以回滚版本构建。

  • 配置参数化构建过程

添加参数 -> Extended Choice Parameter,选择我们之前添加的插件Extended Choice Parameter,进行配置。该插件可以实现动态获取tag,从而实现动态部署、一键回滚。

RELEASE_VERSION
发布的版本号
1
2

选择Basic Parameter Types,用脚本来获取tag;

选择Single Select,单选一个版本;

选择Groovy脚本,该脚本语言用来获取gitee项目的tag;

def ver_keys = [ 'bash', '-c', 'cd /var/jenkins_home/workspace/部署cccPress;git pull>/dev/null; git remote prune origin >/dev/null; git tag -l|sort -r |head -10 ' ]
ver_keys.execute().text.tokenize('\n')
1
2

55

  • 关闭源码

源码管理改为none

56

  • 增加构建步骤

修改shell脚本如下:

echo $RELEASE_VERSION
cd /var/jenkins_home/workspace/部署cccPress
git checkout $RELEASE_VERSION
git pull origin $RELEASE_VERSION
cnpm -v
cnpm install
rm -rf dist
cnpm run build
cd dist
tar -zcvf dist.tar.gz *
1
2
3
4
5
6
7
8
9
10

57

配置完成后点击保存

  • 使用参数构建

保存后发现原来的Build已经变为Build with Parameters,点击使用参数构建。

58

提示开始构建之前,可以使用Groovy脚本才可以。

59

点击In-Process Script Approval进入,点击Approve进行验证。

60

然后再回到任务列表,点击Build with Parameters,发现版本号已经有了。

61

此时,就是做到了真正的持续交付、一键部署、一键回滚(如果发现新版本有BUG,马上构建上一个版本即可回退)。

# 五、Jenkins相关资料

Jenkins官网 (opens new window)

Jenkins学习视频—撸帝 (opens new window)

Jenkins搭建Vue项目教程文档 (opens new window)