1.准备工作:
(1)虚拟机安装好docker容器并配置好私有仓库地址,我自己使用的jenkins是2.387.3版本,拉镜像时不要拉jenkins,要拉jenkins/jenkins才对。
(2)在docker容器里面安装了gitlab,harbor等镜像。
(3)由于所有东西都是安装在一台虚拟机里内存尽量大一点,gitlab很吃内存,可以更改一些gitlab的配置缓解一下。
(4)这里介绍跟jenkins安装完成后面有关的部分。由于是在一台虚拟机做的一个小demo,有不对的地方见谅。
(5)注意:gitlab要设置外发请求不然不能通过ip访问,点击管理中心、点击设置、点击网络 找到外发请求勾选
允许Webhook和服务对本地网络的请求
允许系统钩子向本地网络发送的请求
2.jenkins 插件安装
Build Timestamp Plugin 时间戳插件用时间戳当版本号
Docker 、GitLab 、NodeJS 、Publish Over SSH
把以上插件全部安装完成。
3.实现jenkins拉取gitlab代码仓库拉取功能
(1)点击jenkins系统管理>点击Configure System>找到 Gitlab配置选项
取消勾选enable authentication
输入名称,输入Gitlab访问地址,点击添加
API token在gitlab里生成。输入id,输入描述。点击添加。
在gitlab里面创建添加一个项目后点击项目,点击设置,点击访问令牌。输入令牌名称点击api,点击创建项目访问令牌
点击test看是否能连接上gitlab
新建任务,点击刚创建的任务,点击配置。
输入Git仓库地址,选择刚才添加的凭证,选择分支点击保存。
点击立即构建测试看看代码是否能从gitlab上面拉取下来。
4.构建触发器实现自动拉取代码
这个地址需要在gitlab里面添加webhooks使用。
这里生成一个sercet token。点击保存,上面的地址和sercet token需要在下面的gitlab里面使用。
网址就是jenkins上面的地址,secret令牌就是之前生成的sercet token
点击添加点击测试看看是否能触发自动构建。
5.配置nodejs实现前端代码打包生成dist文件夹
先看这个贴子:Docker Jenkins 安装NodeJs环境_/var/jenkins_home/tools/jenkins.plugins.nodejs.too_Hmg-L的博客-CSDN博客
解决nodejs版本选择问题
cd到jenkins 的目录下 /var/jenkins_home/updates
创建文件 hudson.plugins.nodejs.tools.NodeJSInstaller
文件内容为
{
"list":[
{
"id":"16.20.2",
"name":"NodeJS 16.20.2",
"url":"https://nodejs.org/dist/v16.20.2/"
}
]
}
这里的nodejs版本尽量跟前端本地的nodejs版本一致。
我这里是在虚拟机里面已经安装好了16.20.2版本的nodejs,没有使用它的安装。
所以如果出现插件安装nodejs失败的情况,可以试试直接在虚拟机安装。
这里的nodejs 16.20.2就是上面配置添加的文件,如果不添加那个文件这里是空的。点击保存
如果配置了还是没有就重启一下jenkins。
再到项目的配置里面找到构建环境勾选,点击保存。点击立即构建,测试nodejs是否能够正常工作。
完成nodejs工作正常后 再到配置里 找到build steps 点击增加构建步骤 选择shell
cd html/ #先到前端代码目录
if [ -f "dist/" ];then #判断dist文件是否存在
rm –rf dist/ #dist文件存在就执行删除
fi
npm install #执行install
npm run build:prod #执行build
点击保存,点击立即构建,测试是否能正常构建并生成dist文件夹。
在这里要说明一下为什么要这么用而不是用dockerfile文件里面用nodejs镜像构建。
(1)我这边用dockerfile执行npm run build时候报Cannot find module 'chokidar'组件找不到,但是我本地打包又正常。
(2)第二个原因时候如果用nodejs镜像打包会生成一个很大的虚悬镜像,和三个容器。在后面做删除虚悬镜像时会导致,下次执行npm install的时候重复下载vue插件。
(3)如果直接用shell脚本会把vue插件保存的工作空间里,下次构建时可以直接使用本地node_modules。加快打包速度。
在工作空间里查看dist文件夹是否正常生成。
6.配置好镜像打包服务器
(1)用时间戳作为版本号
修改时间戳样式。
(2)添加镜像打包节点
添加打包镜像的服务器,这里打包服务器的docker要开启2376端口。由于我这里用的是本地不太清楚外部服务器需不需要添加凭证。
点击测试显示docker版本号则表示成功。
开启Docker的tcp访问端口
vi /lib/systemd/system/docker.service
修改ExecStart
修改前
ExecStart=/usr/bin/dockerd -H fd:// --containerd /var/run/containerd/containerd.sock
修改后
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --containerd /var/run/containerd/containerd.sock
重新加载docker配置文件及重启Docker
systemctl daemon-reload && systemctl restart docker
7.添加dockerfile文件
FROM nginx:latest
RUN rm /usr/share/nginx/html/*
COPY dist/ /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
8.实现镜像打包并推送到harbor镜像仓库。
(1)在harbor里创建一个仓库,注意打包镜像的服务器要在docker配置私有仓库地址并重启docker,同时自己在镜像打包服务器上面测试登录私有仓库是否成功。
(2)点添加构建步骤、选择build/publish docker image
Directory for Dockerfile
输入dockerfile文件目录
Cloud to use to build image
选择你要打包镜像的服务器
Image
192.168.150.120:1180/my-test/my-html:${BUILD_TIMESTAMP}
192.168.150.120:1180/my-test 要推送的私有仓库配置ip地址+端口。
my-html 这个镜像名称不要用“.”会打包失败。
${BUILD_TIMESTAMP} 这个是之前配置的时间戳变量。
(3)勾选push image和clean local images
添加凭证,输入habor的登录账号密码。
清除本地镜像。
以上配置完成后,点击保存,点击立即构建。测试是否能正常打包并推送到镜像仓库。
9.拉取镜像并发布,清除虚悬镜像
(1)配置Publish Over SSH
点击新增,输入需要部署镜像的服务器名称,和服务器地址。
username输入登录用户名 登录密码在高级里面点击高级。
输入服务器登录密码,点击测试。点击保存。
(2)添加部署和清除虚悬镜像
选择需要部署的服务器。
echo ---------------delete container...------------------
docker rm -f my-html
echo ---------------delete images...------------------
containerId=docker iamges |grep "192.168.150.120:1180/my-test/my-html"| awk '{print $3}'
docker rm containerId
echo ---------------Launching Container...------------------
docker run -d -p 9999:80 --name my-html 192.168.150.120:1180/my-test/my-html:${BUILD_TIMESTAMP}
echo ---------------Clear-Images...------------------
clearImagesList=$(docker images -f "dangling=true" -q)
if [ ! -n "$clearImagesList" ]; then
echo "no images need clean up."
else
docker rmi $(docker images -f "dangling=true" -q)
echo "clear success."
fi
删除旧容器,旧镜像,拉取新镜像并运行。
清除虚悬镜像。
总结:
每一个步骤都尽量多测试一下以保证整个过程都成功。