Docker + Jenkins 持续部署 React 应用

阅读时长 7 分钟读完

背景

在前端开发中,我们常常需要将我们的应用部署到服务器上供客户使用。而传统的部署方式需要手动打包,并将打包好的文件上传至服务器,这种方式很麻烦且容易出错。因此,我们需要一个更加高效和可靠的部署方式。

这时候,Docker 和 Jenkins 就发挥了重要作用。Docker 可以帮我们快速构建应用的镜像,并进行容器化部署,而 Jenkins 可以帮我们实现持续集成和持续部署。

搭建部署环境

我们需要先安装 Docker 和 Jenkins,这里不进行详细介绍。安装完之后,我们需要在 Docker 中创建一个名为 react-app 的镜像。假设我们的 React 应用代码已经准备好,代码目录为 /path/to/app。

首先,我们需要在该目录下创建一个 Dockerfile 文件,文件内容如下:

-- -------------------- ---- -------
---- ----------------------- -- -----
------- ----
--- ---- ----------------------------
---- ------------- --
--- --- -------
---- - -
--- --- --- -----

---- -------------------
---- ------------ ---------- ---------------------
------ --
--- --------- ----- ------- ------

这个 Dockerfile 的作用是:

  1. 首先,在 node:14.17.3-alpine3.14 镜像上构建一个中间镜像 build。
  2. 在中间镜像中安装应用所需的依赖并执行 npm run build 命令构建应用。
  3. 在 nginx:1.21.3-alpine 镜像上构建一个最终镜像,并将之前中间镜像构建好的应用复制到该镜像中,并暴露容器的 80 端口。

接下来,我们需要使用该 Dockerfile 构建镜像:

构建完成后,我们可以使用 docker images 命令查看到刚才创建的名为 react-app 的镜像。

现在我们需要使用 Jenkins 来实现持续部署。

Jenkins 配置

首先,我们需要在 Jenkins 中安装 Docker 插件。安装完成后,我们需要在 Jenkins 中配置 Docker。

  1. 在 Jenkins 的系统管理中配置 Docker 地址和连接仓库的凭证。
  2. 在 Jenkins 的全局工具配置中配置 Docker CLI 工具。在 Name 填写 Docker,选择安装自动安装的 Docker CLI。

接下来,我们需要在 Jenkins 中配置构建任务。我们可以在 Jenkins 中使用 docker-compose 来进行容器化部署。我们需要在应用代码目录下创建一个 docker-compose.yml 文件,文件内容如下:

-- -------------------- ---- -------
-------- ---
---------
  ----
    ------ -----------------------
    -------- -- -- ---- ------- -- --- ------
    --------
      - ------
    ------
      - ---------
    -----------
      - ---
  ----
    ------ -----------------------
    -------- -- -- ---- ------- -- --- ------
    --------
      - ------
    ------
      - ---------
    ------------
      - ------------

这个 docker-compose.yml 文件的作用是:

  1. 构建两个镜像 web 和 api。
  2. 将应用代码目录挂载到容器内。
  3. 分别在 3000 和 3001 端口上暴露服务。
  4. web 和 api 之间互相依赖。

接下来,我们需要在 Jenkins 中配置构建任务:

  1. 新建任务,选择构建一个自由风格的项目。

  2. 在源码管理中配置 Git 仓库地址和凭证,并填写分支。

  3. 在构建触发器中可以选择自动触发任务,并配置触发条件。

  4. 在构建中选择执行 shell 命令,并填写:

    该命令的作用是:构建镜像、停止之前的容器并删除、启动容器。

  5. 在 Post-build Actions 中选择 Docker Push Publisher 插件,配置镜像名称和仓库地址,并勾选 push latest tag。

    该过程中,我们需要使用到 Jenkins 中的凭证来进行 Docker Hub 权限操作,因此需要先创建凭证并配置到 Jenkins 中。

  6. 保存配置。

现在,我们已经成功搭建好了 Docker 和 Jenkins 环境,并完成了部署自动化。

总结

Docker 和 Jenkins 的持续部署对于前端开发来说很重要,它可以帮我们实现自动化部署,提高开发效率,同时增加部署可靠性。在进行持续集成和持续部署之前,我们需要熟悉 Docker 和 Jenkins 的使用,并具备一定的容器化开发能力。

示例代码

  1. Dockerfile
-- -------------------- ---- -------
---- ----------------------- -- -----
------- ----
--- ---- ----------------------------
---- ------------- --
--- --- -------
---- - -
--- --- --- -----

---- -------------------
---- ------------ ---------- ---------------------
------ --
--- --------- ----- ------- ------
  1. docker-compose.yml
-- -------------------- ---- -------
-------- ---
---------
  ----
    ------ -----------------------
    -------- -- -- ---- ------- -- --- ------
    --------
      - ------
    ------
      - ---------
    -----------
      - ---
  ----
    ------ -----------------------
    -------- -- -- ---- ------- -- --- ------
    --------
      - ------
    ------
      - ---------
    ------------
      - ------------
  1. Jenkinsfile
-- -------------------- ---- -------
-------- -
  ----- ---
  ----- -
    ------ --------
  -
  ------ -
    ------------ ------------ -
      ----- -
        --- ------- --------- -------------- ------------------------ ---- ---------------------------
      -
    -
    ------------ ------ ------- -
      ----- -
        -- ---
          -------------- -----
          -------------- ----
          -------------- -- --
        ---
      -
    -
    ----------- ------ ----- -- ------ ----- -
      ----- -
        ------------------------------------------------ ------------------------ ----------------- ------------------ ----------------- -------------------- -
          -- ------- ----- -- ------------------ -- -------------------
        -
        -------------------------------------------- ------------------------ -
          -- --------------- -----
        -
      -
    -
  -
-

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cb06375ad90b6d041e6473

纠错
反馈