使用Docker + Jenkins,用freeStyle CI/CD的方式实现node + github 的自动化部署

7,008 阅读6分钟

- 前言

作为一名前端工程师,除了页面开发,在资历达到一定程度时,对后端技术以及运维CI/CD的掌握,都是必不可少的一环。传统的方式,首先把项目开发好,通过git指令把代码推送到github或其他代码管理平台,再把本地项目打包好,放在服务器相应目录下并执行启动指令。 很明显这样的方式已经不符合当代便捷的思想,于是各种自动化工具就顺势而生了。

本篇文章主要介绍使用使用Docker安装+部署Jenkins,在Jenkins构建一个自由风格的任务,部署一个node服务并关联github项目,从而实现开发阶段推送代码后,服务端能自动拉取代码并重启的功能,整个过程,只需操作一次同步推送,十分简单粗暴。

传统流程

graph TD
代码同步 --> 打包 --> 放到服务器 --> 启动项目

1. Docker 安装 Jenkins

有两种常规的安装方式,都需要先创建映射文件夹,然后在容器中对文件的增删改查都可以通过映射的文件去实现,而不用一直依赖Linux的指令,可节约大量的操作成本。 需要留意Jenkins镜像请选择最新最多人使用的经典版本:jenkins/jenkins

创建映射文件夹

路径根据项目要求调整

mkdir /usr/local/jenkins_home

使用命令行安装Jenkins

docker run \
  -u root \
  -d \
    -p 8888:8080 \
    -p 50000:50000 \
    -v /usr/local/jenkins_home:/var/jenkins_home \
    --restart=always \
    --name=jenkins \
    jenkins/jenkins

使用docker-compose的方式

这种方式类似配置文件,在/usr/local/jenkins_home创建了docker-compose.yml文件,以下是文本内容:

version: '3'                                    # 指定 docker-compose.yml 文件的写法格式
services:                                       # 多个容器集合
  docker_jenkins: 
    user: root                                  # 为了避免一些权限问题 在这我使用了root
    restart: always                             # 重启方式
    image: jenkins/jenkins                      # 指定服务所使用的镜像 在这里我选择了 LTS (长期支持)
    container_name: jenkins              # 容器名称
    ports:                                      # 对外暴露的端口定义
      - '8888:8080'
      - '50000:50000'
    volumes:                                    # 卷挂载路径
      - /usr/local/jenkins_home/:/var/jenkins_home   # 这是我们一开始创建的目录挂载到容器内的jenkins_home目录
      - /var/run/docker.sock:/var/run/docker.sock
      - /usr/bin/docker:/usr/bin/docker                 # 这是为了我们可以在容器内使用docker命令

先进入jenkins_home目录:

cd /usr/local/jenkins_home

执行docker-compose.yml:

docker-compose up -d

执行之前需安装docker-compose,可参考链接blog.csdn.net/weixin_4612…

查看安装是否成功

输入指令 docker ps,发现已经多了jenkins这个容器 用浏览器输入 http://ip地址/:8888进入jenkins的登录注册画面

image.png

初始密码在容器的/var/jenkins_home/secrets/initialAdminPassword 或者映射文件下的/usr/local/jenkins_second/secrets/initialAdminPassword中

配置Jenkins

选择安装推荐的插件,然后等待插件自动下载完成

image.png

image.png

输入第一个管理员账号密码,在实例配置中直接保存,这样Jenkins就算配置成功了。点击完成后,自动跳转到Jenkins的首页。

image.png

2.安装及配置相关插件

要实现完成的功能,还需要安装Node.js, Publish Over SSHGitHub Api三个插件

安装 Node.js

点击系统管理-插件管理,点击Available Value输入node,点击安装后重启。

image.png

配置 Node.js

点击Manage Jenkins 系统管理,进入全局工具配置,在最下方会见到NodeJS,配置如图

image.png

安装Publish Over SSH

步骤跟上述类似,选择安装后重启

image.png

配置Publish Over SSH

在系统管理的系统配置,最下方找到Publish Over SSH这个选项卡,配置完成,点击右下方的Test Configuration`,显示 Success.

image.png

安装 GitHub Api插件

步骤跟上述一致,注意在安装推荐插件的过程中可能已经安装过这插件

配置 GitHub Api插件

在配置之前,我们先要到 GitHub 生成 Personal access token,作为密钥连接Github跟服务器

我们点击右上角头像 - Settings,找到Developer settings,然后选中Personal access tokens的classic,点击右上角Generate new token,按图中所示勾选对应的内容。

点击Generate token后会生成一个toke, 必须注意token只会出现一次,生成后我就马上用文档粘贴进去了。

image.png

进入系统管理-系统配置里面,找到GitHub,点击添加服务器。 在凭据下面点击添加,在弹出窗口的类型选择Secret text,并把刚生产的token粘贴到Secret中 点击保存,在原来的页面的凭据里选择Secret Text.

image.png

image.png

最后在下方选中管理Hook,并点击连接测试,如果能出现github的账户名,证明连接已成功

image.png

3. 使用Jenkins 构建一个自由风格的项目

点击新建任务,输入任务名称,选择构建一个自由风格的软件项目

image.png

勾选Github项目,在项目URL下输入github项目的浏览器地址。

image.png

源码管理下选择Git,在Repository URL里输入项目的github地址,即是git clone对应的地址。指定分支改为项目对应的分支。

image.png

继续往下勾选 构建触发器 一栏中的 GitHub hook trigger for GITScm polling,勾选 构建环境 一栏中的 Use secret text(s) or file(s) ,在 凭据 一栏中选中我们之前添加的 Secret text,勾选 Provide Node & npm bin/ folder to PATH 为构建项目提供 Node.js 环境。

image.png

image.png

GitHub hook trigger for GITScm polling 这一个选项,意味着每次Github 触发了Hook之后,该Jenkins项目就会立即进行构建。可在github项目的Setting => WebHooks中查看到,仅仅是push事件会触发hook,也可点击下方的Let me select individual events选择其他触发时机。

image.png

接下来在构建步骤(Build Steps) 中,增加构建步骤,选择执行sheel。在构建的过程会执行这些指令启动node服务。 这次直接在项目目录下启动进程,关于部署还有一种更为安全谨慎的先打包后启动的方式,会在另外一篇文章叙述。

image.png 最后在构建后的步骤勾选Send build artifacts over SSH,使用ssh的方式把代码从github上传到服务器,点击保存,配置完成。

  • Source files: 生产打包后文件的路径
  • Remove prefix: 移除打包前的路径
  • Remote directory: 远程服务器路径
  • Exec command: 启动指令,启动包,如是前端项目此处可不填

由于这次直接在根目录启动,这些关于打包后处理的信息可以不填

image.png

4. 立即构建

点击立即构建按钮,左下方的Build History会出现一条正在执行的记录。点击进去查看控制台输出,能看出来项目已经启动,并且进程持续进行中,如此一来,本次部署就已经正式完成。

image.png

image.png

5 其他问题

webHook 检验

从本地项目尝试一次git push, Build History会出现一条正在执行的记录,说明webHook能正常发挥作用。

docker 安装 Jenkins问题

在安装完Jenkins后,打开的时候可能访问无响应,可先用netstat -ntlp查看端口是否开放或者是否被其他进程占用,还有就是检查云服务的安全组是否开放此端口。

image.png