非常适合前端小白的Docker+Jenkins+Nginx前端部署教程

138 阅读4分钟

前言

平时在公司工作时,使用的是公司开发的CI/CD(持续集成/持续部署)工具,部署上线只需要动动小手就可以,但是并不知道背后的工作流程。因此,决定亲自搭建一个部署平台来学习一下~ 在这里简单介绍一下本文使用的技术栈:

  • Docker,用于虚拟环境搭建
  • Jenkins,开源的持续集成软件
  • Nginx,反向代理服务器

工作流程

想要实现的工作流程是开发者在本地修改代码并提交远端,自动触发CI/CD。具体工作流程如下:

  1. 本地push代码到远端github/gitte仓库
  2. github/gitte仓库触发hook,向Jenkins服务器发送POST请求(包含分支名及改动等)
  3. Jenkins服务器拉取远端仓库代码
  4. Jenkins服务器利用SSH登录部署服务器,将代码传输至指定路径下
  5. Jenkins执行构建命令(本文使用Docker,因此这里进行镜像构建)
  6. 使用生成的镜像创建新的Docker实例(在此之前需要删掉旧的容器),运行Docker实例并绑定端口

清楚了整个部署流程我们来实践一下!

一、安装Jenkins

友情提示:本文的教程需要部署服务器安装有Docker~

因为我本身没有购买服务器,所以就拿自己的一台linux台式机作为了部署服务器。 现在我们需要在部署服务器上安装Jenkins。有两种选择,一种就是在linux使用命令安装Jenkins,另一种是使用Docker安装。本文使用第二种方法,使用Docker安装Jenkins。

1.Docker安装Jenkins

使用Docker安装就得先安装Jenkins镜像:

docker pull jenkins/jenkins:lts-jdk11

也可以去DockerHub选择自己想要的版本。

镜像拉取之后,运行镜像:

docker run --name jenkins_node -d -v /home/${yourpath}/jenkins_home:/var/jenkins_home -p 8081:8080 -p 50000:50000 jenkins/jenkins:lts

现在我们已经启动了一个Jenkins容器,端口是8081。使用docker ps -a查看,已经有一个容器在运行了:

image.png

2.配置Jenkins

在浏览器打开http://localhost:8081

image.png

去这个路径拷贝初试密码完成登录

/home/${yourpath}/jenkins_home/secrets/initialAdminPassword

选择推荐安装:

image.png

然后进行用户名和密码设置,完成后进入主页面,点击系统管理,去安装SSH插件:

image.png

点击插件管理: image.png

搜索Publish Over SSH:

image.png

进行下载安装:

image.png

安装完成后可能需要重启Jenkins生效,我们使用docker重启Jenkins容器:

docker restart 容器ID

配置SSH

接下来配置SSH:

image.png

下拉到Publish over SSH位置: 填上你的部署服务器HOST,SSH登录的Username和密码,或者你也可以选择使用密钥登录

image.png 点击应用,然后在底部点Test Configuration按钮进行SSH连接测试,成功则显示『Success』

image.png

安装Node.js插件

在安装插件的位置,搜索Node.js进行安装,步骤和上面的Publish Over SSH安装一样。 然后进行工具配置:

image.png

image.png

二、上传自己的代码到远端仓库

本文为了测试部署流程,所以简单使用了creatReact命令生成一个前端项目:

npx create-react-app react-demo

配置Dockerfile

在项目的根目录下创建Dockerfile文件,内容如下:

FROM node:16 AS builder

WORKDIR /app

COPY ./ /app

RUN npm install && npm run build


FROM nginx

COPY --from=builder /app/build /usr/share/nginx/html
COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

该Dockerfile有两个阶段的镜像,builder是用来构建项目,获取构建产物,然后将构建的产物放在nginx镜像的/usr/share/nginx/html目录下。nginx.conf为Nginx的配置文件:

Nginx配置

在项目根目录下创建nginx.conf文件:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    gzip  on;
    gzip_types text/plain application/javascript text/css;

    # 虚拟主机server块
    server {
        # 端口
        listen   80;
        # 匹配请求中的host值
        server_name  localhost;
        
        # 监听请求路径
        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }

    }

    include /etc/nginx/conf.d/*.conf;
}

然后将项目文件上传至gitee仓库(github也可以)。

三、部署项目

在总面板点击『新建任务』

image.png

创建一个自由风格的项目:

image.png

git仓库地址:

image.png

如果需要执行push操作直接部署,需在『构建触发器』部分选择『Generic Webhook Trigger』,Generic Webhook Trigger是一个插件,需要下载,下载后重启Jenkins即可。

在『Post content parameters』里可以配置,触发的条件

image.png

配置master分支触发:

image.png

具体的配置可以去这里参考。

此外,还要配置gitte或者github的hook:

image.png

image.png

URL格式为 http://<User ID>:<API Token>@<Jenkins IP地址>:端口/generic-webhook-trigger/invoke userid和api token在jenkins的系统管理-管理用户-admin-设置里

勾选提供node环境:

image.png

在构建后操作部分选择ssh:

image.png

image.png

图中构建镜像,启动容器的命令为:

docker stop react-demo || true \
 && docker rm react-demo || true \
 && cd /home/apollo/jenkins_home/workspace/react-demo  \
 && docker build  -t react-demo  . \
 && docker run -d -p 8083:80 --name react-demo react-demo

保存后,点击立即构建:

image.png

部署成功后,访问http://localhost:8083

上述命令将部署服务器的8083端口与nginx容器的80端口绑定了,所以访问http://localhost:8083 就可以访问到我们部署的服务:

image.png