jenkins前后端分离部署

解放手动挡部署,丰衣足食。

简介

  • 大名鼎鼎jenkins,CI/CD的概念咱就不赘述了,打舌。

Jenkins的安装及配置

Docker环境下的安装

  • 下载Jenkins的Docker镜像:
1
docker pull jenkins/jenkins:lts
  • 在Docker容器中运行Jenkins:
1
2
3
4
docker run -p 8080:8080 -p 50000:5000 --name jenkins \
-u root \
-v /var/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts
  • 这点很重要,配置都在jenkins_home,若需重新挂载,拷贝jenkins_home即可
1
2
# 重新封装镜像
docker commit 8ba98fd637f6 registry.xx.me/jenkins:latest

Jenkins的配置

运行成功后访问该地址登录Jenkins,第一次登录需要输入管理员密码:http://x.x.x.x:8080/
第一次登陆jenkins.jpg

  • 使用管理员密码进行登录,可以使用以下命令从容器启动日志中获取管理密码:
1
docker logs jenkins
  • 选择安装插件方式,这里我们直接安装推荐的插件:
    选择安装推荐插件即可
  • 根据引导提示进行配置,确保插件Publish Over SSHgit已被安装
  • 在系统管理->系统配置中添加全局ssh的配置,这样Jenkins使用ssh就可以执行远程的linux脚本了:
    系统全局ssh配置.jpg
    Homename为ip
    可以通过ssh公钥的方式在Key中填写
    也可以使用账号密码,在高级中填写
    注意这里的Remote Directory会成功后续job中指定脚本环境的初始目录

前端部署

环境准备

  • 部署主机需要安装npm,nodejs
1
yum install nodejs npm

执行脚本准备

1
2
3
#!/bin/bash
cd /home/user/deploy/web-front
npm run build

在Jenkins中创建执行任务

  • 首先我们需要新建一个任务:
    新建任务.jpg
  • 指定自由风格软件
    自由风格软件.jpg
  • 设置源代码管理
    添加源代码管理.jpg
  • 之后添加一个执行远程shell脚本的构建,用于编译前端代码
    设置构建脚本.png

后端部署

环境准备

  • 可以选择在部署主机编译源代码,将编译好的包传入容器
  • 也可以在容器内编译,省去宿主机的环境搭建

执行脚本准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
WORKSPACE=/home/tdops/jenkins_home/workspace
ENV=$1 # 可以指定对应环境的配置文件
APP_NAME=web
CODE_DIR=/home/user/jenkins/${APP_NAME}
DOCKER_BUILD_DIR=${CODE_DIR}/web
CORE_DIR=${DOCKER_BUILD_DIR}/core
WORK_DIR=/home/tdops/deploy/${APP_NAME}
IMAGE_NAME=registry.xx.me/${APP_NAME}
LATEST_IMAGE=${IMAGE_NAME}:latest
DATE_TAG=`date +%Y%m%d`
EXPOSE_PORT=8089
EXPOSE_PORT_GRPC=5555

build_image_and_push() {
# make package
cd ${CORE_DIR} && mvn clean install -U

if [[ $? -ne 0 ]]; then
echo "maven打包失败" && exit 1
fi

# build docker image
cd ${DOCKER_BUILD_DIR} && docker build -t ${LATEST_IMAGE} .
echo '----build image----'

# docker tag
docker tag ${LATEST_IMAGE} ${IMAGE_NAME}:${DATE_TAG}
echo '----tag image----'

# docker push
docker push ${LATEST_IMAGE}
docker push ${IMAGE_NAME}:${DATE_TAG}
echo '----push image----'
}

pull_image() {
docker pull ${LATEST_IMAGE}
echo '----pull image----'
}

restart_server() {
# docker stop
echo '----stop container----'
docker stop ${APP_NAME}

# docker rm
echo '----rm container----'
docker rm ${APP_NAME}

# docker run
echo '----start container----'
docker run -d -it -p ${EXPOSE_PORT}:8089 -p ${EXPOSE_PORT_GRPC}:5555 -e DEPLOY_ENV=${ENV} -v ${WORK_DIR}:/home/admin/${APP_NAME}/log --name ${APP_NAME} ${LATEST_IMAGE} bash
}

if [[ ! ${ENV} ]]; then
build_image_and_push
else
pull_image
restart_server
fi

在Jenkins中创建执行任务

  • 任务的设置和前端的部署任务类似

网关

  • 一般前后端分离项目会使用nginx做静态资源的服务方,并对后端服务做反向代理
  • 简单的提供个配置文件做为例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
user admin;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

events {
worker_connections 1024;
}

http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 2g;

include /etc/nginx/mime.types;
default_type application/octet-stream;
client_body_temp_path /usr/share/nginx/html/nginx_file;

server {
listen 8080;
server_name mydomain.com;
root /usr/share/nginx/html;
location / {
try_files $uri /index.html;
}

location ^~ /api {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://web-server:8089/api;
}
}
}
  • docker 运行命令为:
1
2
3
4
5
6
7
8
9
docker run \
--name nginx \
-it -d -p 8080:8080 \
-v /home/user/deploy/web-front/dist:/usr/share/nginx/html \
-v /home/user/deploy/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /home/user/deploy/nginx/conf.d:/etc/nginx/conf.d \
-v /home/user/deploy/nginx/log:/var/log/nginx \
--link web-server \
nginx:latest

问题记录

  1. No valid crumb was included in the request
    解决方案
    • 在jenkins 的Configure Global Security下 , 取消“防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits)”的勾选
  2. 插件下载过慢,失败
    解决方案

    • 修改下载源,jenkins_home/updates/default.json
      1
      sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
  3. mvn 未找到命令
    解决方案

    • 设置环境变量:

      1
      2
      source /etc/profile
      source ~/.bash_profile
    • 或者 在/usr/bin下创建软链接

      1
      ln –s /opt/maven/bin/mvn /usr/bin/mvn
-------------The End-------------
坚持原创技术分享,您的支持将鼓励我继续创作!