利用 Docker + Jenkins 打造高效的 Node.js 自动化部署

介绍

前端开发中,部署是一个不可避免的环节。传统的手动部署方式效率低,易出错,且不利于项目的持续迭代。近年来,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 仓库的变化。

构建步骤配置

在构建步骤中,我们需要执行以下操作:

  1. 安装构建所需 Node.js 版本

    在 NodeJS 插件配置中指定 Node.js 版本即可。

  2. 安装依赖

    在执行构建命令之前,我们需要先安装项目的依赖。可以通过 Execute Shell 步骤执行以下命令:

    $ npm install
  3. 构建 Docker 镜像

    执行以下构建 Docker 镜像的命令:

    $ docker build -t my-node-app:latest .
  4. 部署 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

    这个命令将会停止并删除之前的容器(如果存在),然后运行新的容器。

  5. 清理 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


纠错反馈