本文介绍使用Jenkins一键将NodeJS(Vue)前端项目打包并上传到生产环境服务器,这里使用的是直接打包静态页面,发送到远程服务器Nginx配置目录的方式,首先确保服务器环境配置好,安装Nginx,运行目录,日志存放目录等。
Nginx安装也有多种方式,源码安装、yum安装、Docker安装等,安装并不复杂,我们这里采用Docker安装的方式,由于习惯于标准化及存档,方便在不同服务器部署相同的环境,我们这里使用了Docker Compose来定义Nginx容器配置信息。
Docker及Docker Compose安装配置,前面有详细介绍,这里不再赘述,以下是Nginx容器的Docker Compose定义文件内容:
version: '3' services: ##nginx配置 nginx: image: nginx:latest restart: always container_name: nginx environment: - TZ=Asia/Shanghai ports: #端口映射,前面是宿主机端口,后面是服务端口 - 80:80 - 443:443 volumes: - /data/container/nginx/html:/nginx/html - /data/container/nginx/www:/var/www - /data/container/nginx/logs:/var/log/nginx - /data/container/nginx/etc:/etc/nginx - /data/container/nginx/etc/nginx.conf:/etc/nginx/nginx.conf - "/etc/localtime:/etc/localtime" - "/usr/share/zoneinfo/Asia/Shanghai:/etc/timezone" #若用到ssl,可以引入 - /bxl/container/nginx/ssl:/nginx/ssl
部分参数说明:
mkdir -p /opt/tmp /opt/bak /opt/script /data/container/nginx/html /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc /bxl/container/nginx/ssl chmod -R 777 /opt/tmp /opt/bak /opt/script /data/container/nginx/html /data/container/nginx/www /data/container/nginx/logs /data/container/nginx/etc /bxl/container/nginx/ssl
server { listen 80; server_name 域名; gzip on; gzip_buffers 32 4K; gzip_comp_level 6; gzip_min_length 100; gzip_types application/javascript text/css text/xml text/plain application/x-javascript image/jpeg image/gif image/png; gzip_disable "MSIE [1-6]\."; gzip_vary on; #charset koi8-r; access_log /var/log/nginx/portal.access.log main; location / { root /nginx/html/gitegg_portal; try_files $uri $uri/ /index.html; index index.html index.htm; } location /gitegg-api/ { proxy_set_header Host $http_host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://172.17.0.1:8080/; } }
定义入参,可以通过Jenkins任务将参数传入脚本中,我们定义了下面2个参数:
project_name=“portal” : 服务名称
portal_home=“/data/container/nginx/html” : 静态页面路径
对参数进行检查,是否未传入参数,这里根据自己的实际情况判断,比如必须传入哪些参数,就设置参数的个数不能小于几。
#param validate if [ $# -lt 1 ]; then echo "you must use like this : ./publish_portal.sh [portal home dir]" exit fi
if [ "$1" != "" ]; then project_name="$1" fi if [ "$2" != "" ]; then portal_home="$2" fi
# 删除 rm -rf "$portal_home"/index.html "$portal_home"/favicon.ico "$portal_home"/_app.config.js "$portal_home"/logo.png "$portal_home"/resource/ "$portal_home"/assets/ # 解压 cd /opt/tmp/portal tar -zxvf portal.tar.gz
#bak project_name BAK_DIR=/opt/bak/portal/$project_name/`date +%Y%m%d` mkdir -p "$BAK_DIR" cp /opt/tmp/portal/portal.tar.gz "$BAK_DIR"/"$project_name"_`date +%H%M%S`.tar.gz #remove tmp rm -rf portal.tar.gz
#copy portal code cp -r * "$portal_home"
#remove tmp rm -rf index.html favicon.ico _app.config.js logo.png resource assets
echo "Portal is starting,please try to access $project_name conslone url"
project_name="portal" portal_home="/data/container/nginx/html" #param validate if [ $# -lt 1 ]; then echo "you must use like this : ./publish_portal.sh [portal home dir]" exit fi if [ "$1" != "" ]; then project_name="$1" fi if [ "$2" != "" ]; then portal_home="$2" fi echo "portal code copy" #publish project_name echo "$project_name publishing" rm -rf "$portal_home"/index.html "$portal_home"/favicon.ico "$portal_home"/_app.config.js "$portal_home"/logo.png "$portal_home"/resource/ "$portal_home"/assets/ cd /opt/tmp/portal tar -zxvf portal.tar.gz #bak project_name BAK_DIR=/opt/bak/portal/$project_name/`date +%Y%m%d` mkdir -p "$BAK_DIR" cp /opt/tmp/portal/portal.tar.gz "$BAK_DIR"/"$project_name"_`date +%H%M%S`.tar.gz #remove tmp rm -rf portal.tar.gz #copy portal code cp -r * "$portal_home" #remove tmp rm -rf index.html favicon.ico _app.config.js logo.png resource assets #start portal echo "Portal is starting,please try to access $project_name conslone url"
chmod 755 publish_portal.sh
echo $PATH node -v pnpm -v pnpm install pnpm run build cd dist rm -rf portal.tar.gz tar -zcvf portal.tar.gz * cd ../
构建后操作:选择构建后将包发送到服务器
Post Steps:将打包后的文件发送到服务器,并执行设置好的脚本,这里选择Run only if build succeeds,当构建成功时Post。
/opt/script/publish_portal.sh portal /data/container/portal