Jenkins自动化部署项目的实践总结

本文主要总结个人在使用Jenkins部署前端、服务端项目的经验,略过Jenkins的安装、启动介绍。

不管是前端项目还是服务端项目,Jenkins自动化部署项目都是通过创建任务的形式完成,而任务的执行过程大体分为三个步骤:
1.获取源码
2.基于源码构建、打包
3.启动项目

获取源码

  • 项目代码是管理在gitlab私服仓库中,所以Jenkins任务执行时会从仓库拉取代码。
  • 因此需要配置项目代码的gitlab地址、分支以及具有权限的账号、密码。

构建打包

  • 这一步主要是基于源码进行构建打包,前端项目构建产物一般就是在dist目录下,后端项目构建产物一般是jar或war包。
  • 构建的过程一般是在Jenkins服务器上,前端项目需要依赖node环境,后端项目需要依赖maven或gradle,如果要打成镜像部署的话还要依赖docker。
  • 本人在部署前端项目时,发现由于是在公司内网环境执行npm install,导致部分依赖无法获取,所以采取了另一种方式:让前端开发人员在本地将项目build后,提交dist到gitlab仓库中,之后在Jenkins拉取源码时就能获取到dist内容了。

启动项目

  • 启动项目实际上就是在Jenkins任务中配置构建后置执行shell脚本,脚本内容主要包括:停止现有服务、更新构建打包的产物、启动项目
  • 脚本的编写需要知道构建的产物存放的位置

注意事项(踩的坑)

1.确保Jenkins用户具有文件的访问、执行权限
2.注意查看Jenkins的输出日志,便于确认服务启动成功或失败问题定位
3.注意添加BUILD_ID=dontKillMe,确保进行不会被Jenkins自动kill掉
4.注意docker镜像缓存问题,建议先删除旧的镜像

将项目部署到远程服务器

这里的场景是Jenkins所在服务器与项目要部署到的服务器不是同一个,实际工作中大多数也都是这种场景。
部署到远程服务器最主要的配置是将Jenkins【构建后操作】类型设置为【Send build artifacts over SSH】,配置source files、remove prefix、remote directory、exec command。

  • source files:源文件,其实是配置构建后的产物如jar所在的路径,注意是相对路径,其前缀一般是.jenkins/workspace/${taskName}。taskName是新建的Jenkins任务名。
  • remove prefix:配置需要删除的路径前缀,如果没有配置的话,传输到远程服务器的文件如jar会包含source files中的部分路径,可能与你预想的效果不一样。
  • remote directory:配置source files要传输到的远程服务器的目标路径。
  • exec command:配置需要在远程服务器上执行的shell脚本内容,一般会提前在远程服务器写好shell脚本,然后在这里调用执行一下。

最后补充下Jenkins插件安装的几种方式:

1.Jenkins可以访问外网的情况下可以直接在浏览器访问Jenkins时安装
2.Jenkins不可以访问外网时,可以到Jenkins官网下载所需插件,通过upload安装
3.Jenkins不可以访问外网时,可从其它Jenkins服务器的plugins目录下copy过来

附脚本

前端工程部署

Jenkins自动化部署项目的实践总结_第1张图片
Dockerfile

FROM nginx
#通过重命名使得原nginx.conf配置失效
RUN mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
#删除原conf.d目录下默认配置
RUN rm -rf /etc/nginx/conf.d/default.conf
#将构建产物copy到镜像中
COPY ./dist /pcui
#将通用配置文件nginx.conf copy到镜像中
COPY ./nginx.conf /etc/nginx/nginx.conf
#将工程特有配置文件copy到镜像中conf.d目录下
COPY ./pc-ui.conf /etc/nginx/conf.d/pc-ui.conf

nginx.conf

#使用root用户
user  root;
worker_processes  auto;
#error_log  /var/log/nginx/error.log notice;
#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;
    #加载conf.d目录下配置文件
    include /etc/nginx/conf.d/*.conf;
}

pc-ui.conf

# 配置springboot服务集群
upstream info_plat_pc_ui_server {
    server ip:port;
    keepalive 32;
}

server {
    listen 80;
    server_name localhost;

    # 打包好的dist目录文件,放置到这个目录下,与Dockerfile对应
    root /pcui/;

    gzip on;
    gzip_comp_level 5;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_proxied any;
    gzip_vary on;
    gzip_types application/javascript application/x-javascript text/javascript text/css text/xml application/xhtml+xml application/xml application/atom+xml application/rdf+xml application/rss+xml application/geo+json application/json application/ld+json application/manifest+json application/x-web-app-manifest+json image/svg+xml text/x-cross-domain-policy;
    gzip_static on;
    gzip_disable "MSIE [1-6]\.";

    # 注意维护新增微服务,gateway 路由前缀
    location ~* ^/(code|auth|admin|gen) {
       proxy_pass http://info_plat_pc_ui_server;
       proxy_set_header Host $http_host;
       proxy_connect_timeout 15s;
       proxy_send_timeout 15s;
       proxy_read_timeout 15s;
       proxy_set_header X-Forwarded-Proto http;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

start.sh

#!/bin/bash
docker build -t info-plat-pc-ui:latest .
echo "build image end"
docker run --name info-plat-pc-ui -p 7001:80 -d info-plat-pc-ui
echo "run end"

stop.sh

#!/bin/bash
#停止容器
docker stop info-plat-pc-ui
echo "stop container end"
#删除容器
docker rm info-plat-pc-ui
echo "remove container end"
#删除镜像
docker rmi info-plat-pc-ui
echo "remove image end"

后端工程部署

在这里插入图片描述
Dockerfile

FROM moxm/java:1.8-full
#创建sysuser目录
RUN mkdir -p /sysuser
#进入sysuser
WORKDIR /sysuser
#将sysuser.jar copy到镜像中
COPY sysuser.jar sysuser.jar
#暴露容器端口
EXPOSE 7400
#环境变量
ENV TZ=Asia/Shanghai JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"
#启动运行
CMD java -jar sysuser.jar $JAVA_OPTS

start.sh

#!/bin/bash
docker build -t info-plat-sysuser:latest .
echo "build image end"

docker run --name info-plat-sysuser -p 7400:7400 -d info-plat-sysuser
echo "run end"

stop.sh

#!/bin/bash
#停止容器
docker stop info-plat-sysuser
echo "stop container end"
#删除容器
docker rm info-plat-sysuser
echo "remove container end"
#删除镜像
docker rmi info-plat-sysuser
echo "remove image end"

你可能感兴趣的:(自动化部署,jenkins,自动化,运维)