Jenkins之自动化项目发布
# 一、前言
其实对于CI/CD
,无论你发布的是那种语言开发的程序,大体流程都差不多,只是不同语言构建工具不一样,启动方式不一样,本文会针对一些常用的语言进行CI/CD
发布配置举例。
注意
本文只是我个人的配置方式,其实不同的公司不同的架构体系,发布方式都会有差别,需要自己根据理解修改符合自己公司体系的发布,俗话说适合自己的才是最好的。
# 二、Java项目
# 2.1 job创建
jenkins首页,点击左上新建item,出现下图,填写对应信息,然后点击确定
说明
这里可以看到有Freestyle project
和构建一个maven项目选择
,如果你是java项目那么两种都还ok,如果是其他项目则只能选择第一个,这里为了方便自定义打包,也直接选择Freestyle project
模式。
# 2.2 参数配置
参数配置这里只是针对核心的选择进行介绍,其他可自行选择
- 源码配置
属于仓库地址
这里是添加仓库地址的账号密码
说明
Repository URL:项目地址
Credentials:配置用户,该用户 需要对上面的项目有访问权限
# 2.3 Build Steps配置
这里添加执行shell命令
# 2.4 发布脚本
由于使用的是
Freestyle project
风格,所以CI/CD
的操作都需要在该脚本中定义
# ## Jenkins 侧配置
# 变量配置
JAR_PATH="${WORKSPACE}/sp-erp/target"
JAR_PATH="sp-erp-1.0-SNAPSHOT.jar"
APP_PATH="/data/apps/sp-erp"
# CI 打包
mvn clean install -DskipTests
# CD 部署
cp -r $JAR_PATH/${JAR_PATH} $APP_PATH
cd $APP_PATH
sh run.sh
# ## run.sh 脚本
#/bin/bash
APP_PATH="/data/apps"
APP_PRO="sp-erp"
APP_NAMR="sp-erp-1.0-SNAPSHOT.jar"
BUILD_ID=dontKillMe
PID=$(ps -ef|grep -v grep |grep "${APP_NAMR}"|awk -F" " '{ print $2 }')
if [ -n ${PID} ]
then
echo “正在kill进程${APP_PRO}:${PID}”
kill -9 ${PID}
sleep 2s
fi
nohup java -jar ${APP_PATH}/${APP_PRO}/${APP_NAMR} --spring.profiles.active=dev >/dev/null 2>&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
注意
- 此脚本只是用作测试环境,勿用于生产环境.
- 这里只是针对于Jenkins与应用均在同一台机器的部署情况,如果需要远程发布,则需要借助
scp
命令进行远程传输,或者使用ansible(推荐)进行管理。
# 三、Node项目
node项目相对于java应用相对来说简单一些,因为大部分我们都是构建成静态文件放到Nginx下运行,当然对应构建我们需要配置node环境
# 2.1 Node配置
- 插件安装
- 环境配置
在全局工具新增Node,分别指定node别名和node版本,这里我们可以安装多个版本node,这样在job里面可以根据实际项目需要选择
# 2.2 Job创建
这里直接创建一个名为
node-demo
的job
# 2.3 参数配置
源码管理,直接输入对应的仓库地址;构建环境处,我们需要选择下刚刚配置的node版本
- 源码配置
- node版本
- 构建命令
PATH_DIR="/opt/apps/qisheng-erp"
npm install --registry=https://registry.npm.taobao.org -unsafe-perm=true
npm run build
rm -rf ${PATH_DIR}/
cp -r ${WORKSPACE}/dist/* ${PATH_DIR}/
2
3
4
5
6
# 四、Docker部署Java
# 4.1 前言
目标主机以拉取的最新镜像启动新的服务
Docker部署java项目的话,其实跟发布java应用配置基本一致,这里只是多了Docker镜像构建的步骤
- jenkins主机构建应用为jar包
- jenkins主机把生产的jar包构建为docekr镜像
- jenkins主机把构建好的镜像推送至镜像仓库
- 目标主机去镜像仓库拉取镜像,并启动服务
# 4.2 创建job
跟上面都一样,这里创建一个
docker-demo
的job
# 4.3 项目配置
- 指定源码
- 构建配置
Jenkins 脚本
# 变量配置
JAR_PATH="${WORKSPACE}/sp-erp/target"
JAR_NAME="sp-erp-1.0-SNAPSHOT.jar"
APP_PATH="/data/apps/sp-erp"
DOCKER_HUB="registry-vpc.cn-hangzhou.aliyuncs.com/qpos" ## 镜像仓库地址
IMAGE_NAME="sp-erp"
# CI 打包
mvn clean install -DskipTests
# build image
# ## Dockerfile
cat >Dockerfile << EOF
FROM registry-vpc.cn-hangzhou.aliyuncs.com/public/java:1.8
MAINTAINER tchua
ADD ${JAR_PATH}/${JAR_NAME} /apps/
EXPOSE 8076
ENTRYPOINT ["java","-jar","/apps/${JAR_NAME}"]
EOF
# ## build
# --username 阿里云镜像仓库用户 --password 阿里云镜像仓库密码
docker login --username=docker@registry-vpc.cn-hangzhou.aliyuncs.com --password=${password}
docker build -t $DOCKER_HUB/${IMAGE_NAME}:dev .
docker push $DOCKER_HUB/${IMAGE_NAME}:dev
# ## CD
cd ${APP_PATH}
sh run.sh
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
run.sh脚本
#!/bin/bash
DOCKER_HUB="registry-vpc.cn-hangzhou.aliyuncs.com/qpos" ## 镜像仓库地址
IMAGE_NAME="sp-erp"
DOCKER_NAME="sp-erp"
TAG="dev"
PORT="9091"
#rm
docker rm -f $DOCKER_NAME
docker rmi ${DOCKER_HUB}:${IMAGE_NAME}:${TAG}
#login
## 登陆镜像仓库,${USER} ${PASSWD}修改为自己具体的用户名密码
docker login -u ${USER} -p ${PASSWD} ${docker_hub}
docker pull ${DOCKER_HUB}:${IMAGE_NAME}:${TAG}
## 启动指定镜像服务
docker run --name ${DOCKER_NAME} -p ${PORT}:${PORT} -d ${DOCKER_HUB}:${IMAGE_NAME}:${TAG}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
注意
需要特别说明的是,这里Jenkins主机与应用主机属于同一台机器,因此我这边并没有涉及到远程的操作,生产中建议直接使用ansible进行批量部署,关于Jenkins通过ansible部署,看后面文章会介绍