在实现 Jenkins 构建部署前端项目之后,逐渐对使用 Jenkins 部署后端服务有了一定兴趣;总体流程没有什么很大的变化,不过是后端服务需要以 Docker 的形式进行启动,在此记录一下具体过程(部分过程与构建部署前端相同不做详细阐述,建议阅读前篇)。
1.目标
希望实现:本地 Git 推送代码或 Jenkins 直接构建,将后端服务代码(本文用 Express.js 演示)推送至后端服务器,并通过 Docker 容器将服务启动,结合宝塔将服务暴露给外部访问。
2.准备
- Gitee 项目仓库
- Jenkins (安装 NodeJs、Gitee、Publish Over SSH 等插件)
- Docker 服务
- Dockerfile 文件
- 后端服务器(用于运行后端服务;也可以是Jenkins服务器,使用不同端口即可)
在【Jenkins 构建部署前端项目】篇幅中已经对 jenkins 服务的插件安装以及配置进行了阐述,在这里不再重复进行,主要简单介绍一下 Docker 服务的安装以及 Dockerfile 文件的编写:
Ubuntu 22.04 安装 Docker
sudo apt update
sudo apt upgrade
sudo apt full-upgrade
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装完成后,可以通过 docker version 查看服务是否成功安装,如下图:
Dockerfile 编写
FROM node:latest # 指定基础镜像;FROM 指令必须是第一条,可以有多个(创建多个镜像,每个镜像一次)
RUN node -v # 执行指定命令,通过 shell 终端执行(/bin/sh -c)
RUN mkdir -p /app/server
COPY ./. /app/server/ # 通过用于本地目录文件复制,格式为 COPY <src> <dest> 复制本地主机的 <src>(为 Dockerfile 所在目录的相对路径)到容器中的 <dest>
WORKDIR /app/server/ # 配置工作目录,与 linux 的 cd 指令有异曲同工之妙
RUN npm install # 根据 package.json 安装依赖
EXPOSE 8082 # 告诉 Docker 服务端口号,用于端口映射等情况
CMD ["node","index.js"] # 【容器启动时】执行的命令
3.操作
A.新建项目
B.填写基本描述信息(可选)
C.配置源码管理【Source Code Management】
选择【Git】,配置远程仓库地址,从未添加过仓库链接配置的或者是新链接配置的需要创建新的【Credentials】,随后选择相应的配置;分支的话默认使用的是 master ,可以自行变更,最终配置如下:
D.配置构建触发【Build Triggers】
这里使用的是 Gitee 的仓库,将 Gitee webhook URL 回填到 Gitee 中,并且点击【Generate】生成 Secret Token 填写到 Gitee 配置项中,具体如下图:
E.配置构建环境【Build Environment】
F.配置构建步骤【Build Steps】
由于演示的文件是 Javascript 文件,无需进行编译并且项目结构是最初始的 Express.js 框架,因此也无需进行构建,直接将文件传至服务器即可;如果项目是需要构建的那么执行构建指令(通常为 npm install + npm run build,如有自行构建的脚本另行处理)得到构建后的代码,将其打包发送至服务器。本例具体操作如下:【Add build step】-【Send files or execute commands over SSH】
Exec command 命令如下:
cd /root/code/back_end
sudo docker rmi -f back_end_image
sudo docker build -t back_end_image .
sudo docker rm -f back_end_api
sudo docker run -itd -p 8082:8082 --name back_end_api back_end_image:latest
G.执行构建
在本地推送代码至 Gitee 或者在 Jenkins 对应的项目中点击 【Build Now】,开始执行构建,下图为执行成功示例:
如果有执行不成功的情况,那么大概率有可能是端口被占用,从而导致端口映射失败,容器无法正常运行,可以通过以下指令查看(本示例使用8082端口,并未被占用,这里只是提供了排查问题的方法):
netstat -tanlp # 查看端口使用情况
kill pid号 # 杀死对应进程
4.成果
在容器启动成功后,我们通过 IP + 端口的形式访问接口,能够查看到:
这样就已经能够成功启动后端的服务,对应在服务器上也能通过 Docker 指令查看容器的状态:
5.总结
总体过程:
- Dockerfile 文件准备
- Git 代码推送或者 Jenkins 上点击【构建】
- Jenkins 推送代码至服务器
- Docker 镜像生成
- Docker 容器启动