介绍
前端开发中,部署是一个不可避免的环节。传统的手动部署方式效率低,易出错,且不利于项目的持续迭代。近年来,Docker 和 Jenkins 等工具的出现带来了一种高效的自动化部署方式,本文将介绍如何利用 Docker 和 Jenkins 打造高效的 Node.js 自动化部署方案。
需求分析
自动化部署是基于代码的自动构建和发布流程。在 Node.js 项目中,我们需要对代码进行构建、打包和发布操作。具体而言,我们需要将代码克隆到服务器,进行构建和测试,然后启动应用。这些操作均可以通过脚本自动完成。Docker 可以通过容器化技术实现快速构建和发布应用。Jenkins 是一个流行的自动化构建工具,可以将每次代码提交触发自动构建和测试,并发布应用到服务器上。
技术分析
Docker 和 Jenkins 是本文实现自动化部署的关键技术。Docker 是目前非常流行的容器化技术,在部署应用时,可以大幅减小环境差异。本文将使用 Docker 镜像来部署 Node.js 应用。Jenkins 是一个流行的自动化构建工具,它支持多种编程语言的自动构建和测试,具有强大的插件扩展能力。
实现步骤
下面将介绍如何通过 Docker 和 Jenkins 实现自动化部署。
Docker 镜像构建
首先,我们需要构建一个 Docker 镜像。在项目的根目录下创建一个 Dockerfile 文件。
FROM node:12.16.1 WORKDIR /usr/src/app COPY package*.json ./ RUN npm install COPY . . EXPOSE 3000 CMD ["npm", "start"]
这个 Dockerfile 使用官方 Node.js 12.16.1 镜像为基础镜像,将工作目录设为 /usr/src/app,并将 package*.json 文件复制到工作目录下,运行 npm install 安装依赖,然后将当前目录下的所有文件复制到工作目录中。最后,设置容器对外暴露的端口为 3000,并在容器启动时运行 npm start 命令启动应用。
完成 Dockerfile 编写后,我们可以使用 docker build 命令构建镜像,在项目根目录下运行以下命令:
$ docker build -t my-node-app:latest .
这个命令将会构建一个名为 my-node-app 的镜像,并指定其标签为 latest。
Jenkins 配置
接下来,我们需要在 Jenkins 中配置自动化构建流程。
安装插件
本文将使用 Jenkins 配合 Git 插件,实现通过每次代码提交触发自动化构建和部署。我们需要安装以下插件:
- Git plugin:Jenkins 的 Git 插件,用于集成 Git 代码库。
- Docker plugin:Jenkins 的 Docker 插件,用于容器构建和发布。
- NodeJS Plugin:Jenkins 的 Node.js 插件,用于安装和管理 Node.js。
可以在 Jenkins 的插件管理页面中搜索并安装以上插件。
新建项目
在 Jenkins 中新建一个 Freestyle 项目,并配置 Git 代码库地址和构建触发器。我们选择 SCM Polling 触发器,并设置轮询频率为每分钟监测一次 Git 仓库的变化。
构建步骤配置
在构建步骤中,我们需要执行以下操作:
安装构建所需 Node.js 版本
在 NodeJS 插件配置中指定 Node.js 版本即可。
安装依赖
在执行构建命令之前,我们需要先安装项目的依赖。可以通过 Execute Shell 步骤执行以下命令:
$ npm install
构建 Docker 镜像
执行以下构建 Docker 镜像的命令:
$ docker build -t my-node-app:latest .
部署 Docker 容器
在 Docker 插件中配置相关参数,执行以下命令:
$ docker stop my-node-app || true $ docker rm my-node-app || true $ docker run -d -p 3000:3000 --name my-node-app my-node-app:latest
这个命令将会停止并删除之前的容器(如果存在),然后运行新的容器。
清理 Docker 容器
如果您希望在构建时清理旧的 Docker 容器,可以在 Docker 插件配置中勾选 Remove Docker Container 选项。
操作演示
为了更好地演示本方案,我们将使用一个简单的 Node.js 应用程序。该应用程序使用 Express 创建了一个基本的 Web 服务器,并在 / 路由上输出一个简单的文本。
// index.js const express = require('express') const app = express() const PORT = 3000 app.get('/', (req, res) => { res.send('Hello, Docker!') }) app.listen(PORT, () => { console.log(`App listening on port ${PORT}...`) })
请注意,为了支持自动化构建,我们还需要将 package.json 文件中的启动命令修改为 npm start,如下所示:
{ "name": "my-node-app", "version": "0.0.1", "description": "My Node.js app", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.17.1" } }
首先,我们需要在本地安装 Docker 和 Jenkins。
然后,我们可以使用以下命令在本地启动 Jenkins:
$ docker run \ -u root \ -p 8080:8080 \ -v jenkins-data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -e JENKINS_OPTS="--prefix=/jenkins" \ jenkinsci/blueocean
现在,我们可以访问 http://localhost:8080 来打开 Jenkins,进行一系列配置,创建 Jenkins 作业,或者在 Jenkins 中导入一个简单的 pipline 脚本。以 pipline 方式为例,我们可以使用以下代码:
pipeline { agent any stages { stage('Checkout') { steps { checkout( scm: [ $class: 'GitSCM', branches: [[name: '*/master']], userRemoteConfigs: [[url: 'https://github.com/example/my-node-app.git']] ], preferMergeCommit: false ) } } stage('Build') { steps { nodejs(nodeJSInstallationName: 'Node.js 12.x', configId: 'null') { sh 'npm install' sh 'docker build -t my-node-app:latest .' } } } stage('Deploy') { steps { withDockerRegistry([url: '', credentialsId: 'registry-cred']) { withDockerServer([uri: 'tcp://jnodeapp-docker:2375']) { sh 'docker stop jnodeapp || true' sh 'docker rm jnodeapp || true' sh 'docker run -d -p 3000:3000 --name jnodeapp my-node-app:latest' } } } } } }
实现过程中,我们需要事先创建好包含 Dockerfile 文件和应用代码的 Git 仓库。对于 Jenkins 的 Docker Server 环境和 Registry 权限申请,可以参考 Docker 官方文档。
总结
本文介绍了如何利用 Docker 和 Jenkins 实现 Node.js 自动化部署,以及相关的详细实现步骤。通过 Docker 镜像化技术和 Jenkins 的自动化构建平台,可以大大提高前端项目的部署效率,且代码发布的过程中不必再为环境配置问题而头疼。在实际使用时,需要根据具体项目的需求和实际情况进行相应的调整和修改。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65aa2b65add4f0e0ff3bcede