gitlab+jenkins 实现前端项目打包成 docker 镜像;gitlab部署就不赘述了;因部署的gitlab版本的webhooks有问题,无法进行配置,所以文章的构建是手动触发的。并且nodejs部署应该也能跟docker一样直接安装进jenkins的镜像(但是多版本可能就有其他问题)。
Jenkins 镜像准备
拉取 jenkins 镜像
docker pull jenkins/jenkins:2.414.3-jdk17
- 在镜像里面安装 docker
-
在空文件下新建一个 Dockerfile 文件
FROM jenkins/jenkins:2.414.3-jdk17 USER root # 安装 Docker CLI(注意不装 daemon) RUN apt-get update && apt-get install -y docker.io USER jenkins -
构建包含 docker 的镜像,并导出
docker build -t jenkins-with-docker:2.414.3-jdk17 . docker save jenkins-with-docker:2.414.3-jdk17 | gzip > jenkins-with-docker.tar.gz
-
联网环境下先运行官方 jenkins 容器(下载插件和工具环境)
-
启动容器
docker run -d --name jenkins -p 8928:8080 jenkins/jenkins:2.414.3-jdk17 -
密码获取
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword 安装插件
选择常用的插件,Nodejs、Git、Docker、Docker Pipeline 等。按需安装。(本想使用pipeline脚本,结果没用上,直接使用shell了)-
安装 node(这里使用 jenkins 自动下载;也可以手动部署到 jenkins 容器里)
-
在管理页面的 Tools 里,添加 nodejs
image -
回到首页新建一个自由风格的项目
-
环境选择新建的 node 版本
image -
构建步骤添加一个 shell
image 立即构建,执行完出现 node 和 npm 版本就成功了
-
-
plugin 和 tools 打包
进入容器将/var/jenkins_home 路径下的 plugins 和 tools 都打成 tar 包(软链接不会丢失)
本人使用 windows 系统,故直接在 docker-desktop 进入容器后下载两个文件夹在打包(npm 软链接丢失了)
离线环境内部署 jenkins
使用前面二次打包的镜像
-
docker-compose.yml
version: "3" services: jenkins: image: jenkins-with-docker:2.414.3-jdk17 container_name: jenkins restart: unless-stopped user: "1000:994" ports: - "8928:8080" - "50000:50000" volumes: - /home/opt/jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock environment: - JAVA_OPTS=-Xmx1024m deploy: resources: limits: memory: 2G security_opt: - seccomp:unconfined/var/run/docker.sock:/var/run/docker.sock为可以在 jenkins 里执行 docker 语句的关键,它可以链接 jenkins 宿主机的 docker,构建时可以拉取宿主机存在的镜像,并且打包后的镜像也会存在宿主机
-
离线环境里启动 jenkins
docker-compose up -d 初始化后设置密码,参照前面
-
将 plugins、tools 释放到/home/opt/jenkins_home 下
# 将在线环境的plugins拷贝进离线环境后,需执行授权 docker exec -u root jenkins chown -R 1000:1000 /var/jenkins_home/plugins # 离线环境手动添加的nodejs,没有权限,先执行查看权限是否有x(-rw-r--r--),没有继续执行下面的内容 ls -l /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/node # 给node添加x权限 chmod +x /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/node # 将联网环境下载的nodejs,在tools文件夹下,直接拷贝npm、npx的软件链接会丢失要重新指定(打tar包好像可以保留软链接),下一句修复软链接 ln -sf /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/lib/node_modules/npm/bin/npm-cli.js /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/npm # 给npm添加x权限 chmod +x /var/jenkins_home/tools/jenkins.plugins.nodejs.tools.NodeJSInstallation/18.20.7/bin/npm- 配置nodejs版本,指定安装位置
image
- 配置nodejs版本,指定安装位置
-
准备完毕后,前端项目的 node_modules 也需要做缓存
# 会在项目根路径生成.npm文件夹 npm install --cache .npm # 将.npm打tar包 tar -czvf .npm.tar.gz ./.npm
构建前端部署镜像
-
在内网jenkins首页新建一个自由风格的项目
-
配置gitlab
image -
配置nodejs
image -
构建步骤
imagecd /var/jenkins_home/workspace/test #进入Jenkins工作空间下test项目目录 node -v #检测node版本(此条命令非必要) npm -v #检测npm版本(此条命令非必要) # 从.npm安装node_modules npm install --offline --cache .npm # vite命令需要权限 chmod +x ./node_modules/.bin/* # 内存不足会打包失败 NODE_OPTIONS="--max-old-space-size=4096" npm run build:prod #项目根目录有Dockerfile docker build -t frontend .
-
构建
在构建之前,需要将前面打包的.npm.tar.gz拷贝进/var/jenkins_home/workspace/test,test是jenkins项目名称,
# 解压
tar -xzvf .npm.tar.gz ./.npm
在项目页点击立即构建,等待结果即可。
jenkins用户管理以及webhooks配置
- 安装角色管理插件
Role-based Authorization。离线部署参照上面直接拷贝授权,重启。 - 管理-安全-授权-选择
Role-based-Strategy选项。
user.png -
管理-角色管理-设置相应的权限
user-1.png
这个developer是角色,我们用户名也叫developer「它属于注册用户组(默认)」,因此设置有效于developer用户
user-2.png -
添加用户token(用于webhooks)(创建时可见,记得复制保留)
user-3.png - gitlab设置webhook(http://<jenkins_user>:<api_token>@192.168.1.69:8928/job/test/build)
注:因为安全模式选择了Role-Based,所以必须使用user:token方式;?token=xx方式不可用。此时jenkins项目的tiggers可不配置
user-4.png











