后端项目流水线部署
为简化后端项目部署流程,以及对整个项目运行的服务进行管理,部署了一套后端CI/CD工具。
使用工具
整个流程使用到的工具包括:
- Docker:运行docker镜像,项目打包为docker镜像
- Harbor:私有docker镜像存储
- Portainer:docker可视化管理界面
- Jenkins:项目发布工具
系统在线地址:
在线地址 | 用户名 | 密码 | |
---|---|---|---|
Docker | 运行于10.16.129.49服务器 | ||
Harbor | http://10.16.129.49:7788 | admin | Harbor12345 |
Portainer | http://10.16.129.49:8999 | admin | 111111111111 |
Jenkins | http://10.16.129.49:7790/ | admin | admin123456 |
发布流程

jenkins创建项目
在jenkis主页点击新建任务:

General
因为我们目前的项目都是多git分支的,所以添加一个参数化构建过程,参数类型选择为分支:

源码管理
关联项目的gitlab仓库地址:

指定分支部分填写 ${branch}
,这样可以使用选择的分支打包。
这里关联仓库后要添加一个Credentials
凭据,这里可以直接使用我创建好的凭据,如果这个账户没有这个仓库的权限的话那么需要手动创建一个凭据,创建凭据的类型选择GitLab API TOKEN
,这个token在gitlab的个人设置里生成。

Build
基于pom.xml
构建maven项目,并填写打包指令:

项目使用的私服配置已经在jenkins的maven全局配置中设置好了,所以直接使用默认就可以:

PostStep
这个步骤是用于构建完成后,要执行的指令。这里我们要完成的工作主要有下面几个:
- 把jenkins打好的包制作成jenkins镜像
- 把镜像上传到Harbor私有镜像仓库
- 删除原先运行中的同名镜像(如果有的话),并基于新镜像在docker内运行
由于当前jenkins本身就是基于docker部署的,镜像内部没有运行docker的环境,所以我们选择在远程主机运行脚本执行上面的流程,也就是在Add post-build step
的时候选择Execute shell script on remote host using ssh:

示例脚本:
SHORTNAME='data-engine'
PRO_VERSION='0.0.1-SNAPSHOT'
DATE=`date +"%Y%m%d%H%M%S"`
REPOSITORY=$HARBOR/$HARBOR_LIB/${JOB_BASE_NAME}:$DATE
cd $MY_WORKSPACE/${JOB_BASE_NAME}
cat > Dockerfile <<EOF
FROM openjdk:8
COPY ${JOB_BASE_NAME}-server/target/${JOB_BASE_NAME}-server-$PRO_VERSION.jar /app.jar
EXPOSE 8088
ENTRYPOINT ["nohup","java","-jar","/app.jar","&"]
EOF
docker build -t $REPOSITORY .
docker login http://$HARBOR -u $HARBOR_USER -p $HARBOR_PWD
docker push $REPOSITORY
docker logout http://$HARBOR
docker rm -f $SHORTNAME | true
docker container run -d --name $SHORTNAME -p 8088:8088 $REPOSITORY
上面的SHORTNAME
和PRO_VERSION
改称我们项目实际的即可。
重点看一下下面这一句拷贝:
COPY ${JOB_BASE_NAME}-server/target/${JOB_BASE_NAME}-server-$PRO_VERSION.jar /app.jar
由于我们现在的项目一般是多个module,以项目名为ocean-data-engine-ser
为例,实际打包后运行的jar包就在ocean-data-engine-ser-server
下,这里是把这个jar包拷贝过来。看一下下面这个项目结构就明白了:

执行构建
创建后项目后,就可以选择分支进行构建了。
注意:构建项目不要使用上面提供的admin用户,最好每个人使用admin账户登陆进去后建一个自己的账户,使用自己的账户构建,这样后期如果构建历史有问题方便找到责任人。

点击控制台输出可以看到构建日志,最后SUCCESS表示构建成功了:

到这里就已经全部构建结束了,后续步骤可以用来检查是否构建成功。
查看镜像仓库
登录Harbor镜像私服,点击ocean项目,镜像都存在这个项目下面。

点击可以查看详情,查看各个版本的镜像。我们目前镜像的tag是当前的时间戳,也方便后续如果镜像有问题时及时回滚。

Portainer
在Containers中可以看到所有容器,并且可以执行容器的启停、删除等操作。

在Images中可以看到镜像列表:
