先说下整体链路
使用环境为 虚拟机 vmware + ubuntu 系统
- 系统中安装 git 工具,以拉取代码;
- 用 git 的 ssh 生成私钥和公钥,公钥需要添加关联到 git 代码源;
- 搭建 jenkins 服务,可以用 docker 镜像方式安装,或者直接在系统中安装。前者安装更干净灵活;其间需要配置国内安装原,以加快安装插件的速度;本次是在系统中直接安装。
- jenkins 中安装 node 服务,添加任务,给任务绑定 代码的 git 仓库源,以及前面生成的私钥;
- 给任务添加 运行的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
- 先安装 java
sudo apt install openjdk-11-jdk # jdk11
查看 java 版本
java --version
- 安装 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 就安装部署成功了;
创建测试任务
- 新建 item ,选择 freestyle project,立即构建;
- 给 jenkins 添加 shell 命令,如执行 docker , 如果没有权限就操作如下,将 jenkins 添加 到 docker 组,然后就有了docker 权限;
groupadd docker
gpasswd -a jenkins docker
newgrp docker
- 修改构建任务的 构建步骤,添加 shell 命令;
- 插件管理中安装 nodejs , 访问 ip://8080/restart 重启 jenkins , 系统管理--->全局工具 tools 配置-->新增 nodejs, 选择 版本安装,在构建任务的配置中给构建环境勾选上
Provide Node & npm bin/ folder to PATH
- 其间可能会遇到 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 仓库的代码
- 在构建任务中,源码管理--->勾选 git---> 填写 代码的 git 仓库 ssh 地址 ---->添加仓库权限凭据--->选择类型为 ssh username with private key,范围选全局,id 随便填写--->username 为邮箱---> private key 填写前面生成的 私钥,从 ----- 开始,到 ----- 结束---> 保存
cat /root/.ssh/id_rsa # 查看私钥
配置完了如果爆红,可能需要重启下 jenkins ;
编写 dockerfile 构建文件
- 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; #静态根目录
}