jenkins 自动化部署

384 阅读6分钟

先说下整体链路

使用环境为 虚拟机 vmware + ubuntu 系统

  1. 系统中安装 git 工具,以拉取代码;
  2. 用 git 的 ssh 生成私钥和公钥,公钥需要添加关联到 git 代码源;
  3. 搭建 jenkins 服务,可以用 docker 镜像方式安装,或者直接在系统中安装。前者安装更干净灵活;其间需要配置国内安装原,以加快安装插件的速度;本次是在系统中直接安装。
  4. jenkins 中安装 node 服务,添加任务,给任务绑定 代码的 git 仓库源,以及前面生成的私钥;
  5. 给任务添加 运行的shell 命令,在执行任务后,就可以将这些命令同步运行起来,这些命令依次为:
    • 删除上一次构建的镜像和打包目录;
    • 拉取 spa 前端代码
    • 安装依赖;
    • 打包构建;
    • 执行 dockerfile 文件以此构建镜像;
      • 基于 nginx 镜像做底座;
      • 复制构建后的代码到指定的 nginx 容器目录中;
      • 复制 自定义的nginx 配置到 nginx 容器目录中;
    • 运行上一步的镜像生成容器,暴露端口给宿主机,以供外界访问;

集成 git 仓库

生成公钥私钥

ssh-keygen -t rsa -C "xxx@163.com"  # 生成公钥和私钥发到指定邮箱

中间输入两次 公钥密码 12345,也可以不输入直接回车,如果输了密码就要记住,推荐直接回车;公私钥默认保存到 root/.ssh 下

cd /root/.ssh  # 查看生成的私钥,有 id_rsa  id_rsa.pub
》```

将公钥复制出来, 从ssh 开始,到 .com 结束
```sh
cat id_rsa.pub

将复制出的公钥添加到 gitee 或者 gitlab 仓库的 ssh 公钥,账号设置--->安全设置-->ssh公钥;

jenkins 上需要配置私钥,以便后续从仓库中拉取代码

ubuntu 安装 jenkins

  1. 先安装 java
sudo apt install openjdk-11-jdk  # jdk11

查看 java 版本

java --version
  1. 安装 jenkins 在Ubuntu上安装Jenkins相对简单。我们将启用Jenkins APT存储库,导入存储库GPG密钥,并安装Jenkins包。

使用以下wget命令导入Jenkins存储库的GPG键:

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -

接下来,使用以下命令将Jenkins存储库添加到系统中:

sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'

启用Jenkins存储库后,通过输入以下命令更新apt包列表并安装最新版本的Jenkins:

sudo apt-get update
sudo apt-get install jenkins

Jenkins服务将在安装过程完成后自动启动,或者手动启动

systemctl start jenkins.service

可以通过如下命令来验证:

systemctl status jenkins

你应该看到这样的消息:

jenkins.service - LSB: Start Jenkins at boot time

或者查看进程信息

ps -ef |grep jenkins

如果你在一个被防火墙保护的远程Ubuntu服务器上安装Jenkins,你需要打开端口8080。

查询开启的端口

sudo ufw status

打开8080端口

sudo ufw allow 8080

访问 jenkins, 浏览器访问 ip:8080 即可,找到管理员密码,输入

ip addr # 查看 ip

cat /var/lib/jenkins/secrets/initialAdminPassword # 查看 admin 密码

修改 jenkins 插件源地址,否则安装插件会很慢

sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json

安装推荐插件或者自定义安装 创建第一个用户后 jenkins 就安装部署成功了;

创建测试任务

  1. 新建 item ,选择 freestyle project,立即构建;
  2. 给 jenkins 添加 shell 命令,如执行 docker , 如果没有权限就操作如下,将 jenkins 添加 到 docker 组,然后就有了docker 权限;
groupadd docker
gpasswd -a jenkins docker
newgrp docker
  1. 修改构建任务的 构建步骤,添加 shell 命令;
  2. 插件管理中安装 nodejs , 访问 ip://8080/restart 重启 jenkins , 系统管理--->全局工具 tools 配置-->新增 nodejs, 选择 版本安装,在构建任务的配置中给构建环境勾选上
Provide Node & npm bin/ folder to PATH
  1. 其间可能会遇到 GLIBC_2.28 not found 的问题,是因为本地的 GLIBC 版本低了,可以查看本地的版本;
ldd --version
或者
strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_

解决办法是升级高版本的源,不能直接升级,不然 linux 系统可能会不稳定,给源配置文件增加一行;

sudo vi /etc/apt/sources.list 

#添加该行到上述 list 文件末尾
deb http://th.archive.ubuntu.com/ubuntu jammy main    

再执行更新
sudo apt update
sudo apt install libc6

然后再查看本地版本,应该就包含了所需的版本;再在构建任务的 shell 中运行 node -v 就会成功了,此后就可以在构建的时候使用 node 环境和命令了;

让 jenkins 可以拉取 git 仓库的代码

  1. 在构建任务中,源码管理--->勾选 git---> 填写 代码的 git 仓库 ssh 地址 ---->添加仓库权限凭据--->选择类型为 ssh username with private key,范围选全局,id 随便填写--->username 为邮箱---> private key 填写前面生成的 私钥,从 ----- 开始,到 ----- 结束---> 保存
cat /root/.ssh/id_rsa   # 查看私钥

配置完了如果爆红,可能需要重启下 jenkins ;

编写 dockerfile 构建文件

  1. dockerfile 文件
# 基于 nginx 镜像
FROM nginx:1.15 

# 将 dist 目录中的内容复制到指定目录
COPY dist /etc/nginx/html
  
# 将 conf 目录中的配置文件拷贝 nginx 中
COPY conf /etc/nginx/

jenkins 启动遇到问题 修改 vim /etc/default/jenkins 文件

vim /etc/default/jenkins 然后修改
 JENKINS_USER="root"
 JENKINS_GROUP="root"
再执行  systemctl daemon-reload

再启动

cd /etc/init.d 
# 启动后就可以访问了
./jenkins start 
# 停止 
./jenkins stop 
# 查看状态 
./jenkins status

构建任务中前端执行 shell 举例,都是同步执行

#!/bin/bash
npm install --registry=https://registry.npm.taobao.org
npm run build # 打包项目
rm -rf /home/nginx/html/* # 将上一次打包的代码删除掉
docker stop vueApp  # 停止运行的此项目容器
docker rm vueApp  # 删除上一次构建的容器
docker build -t xxxx .    # 从当前路径寻找 dockerfile 文件构建 docker 镜像,用xxxx作为标签,也是镜像名
docker run -p 3000:80 -d --name vueApp xxxx   # 使用上面的 xxxx 镜像在后台运行创建名为 vueApp的容器,将容器的 3000 端口映射到主机的 80 端口
echo 'xxxx 项目运行成功====='

docker 构建前端镜像成功后,run 一下此镜像就将前端项目跑起来了,访问宿主机的 80 端口就可以看到页面了;

项目根目录

project-name/
├── nginx/
│   ├── default.conf
├── dockerfile
# nginx 配置
server {

  listen 80;

  server_name _; # _是通配符,匹配所有域名

  root /etc/nginx/html; #静态根目录

}