Jenkins+Docker+Maven+gitlab实现自动构建、远程发布
前言
一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间,我们可能会因为需求发生变化
、功能需要改进
、缺陷需要修复
等问题要更新服务。这个过程是重复而且是复杂的,也容易出现部署、更新失误的情况。因此我们有了自动构建的需求,和CI/CD(持续构建/持续发布)差不多类似。
愿景
我们最后要实现的像图片中这样,可以选择要构建的分支
、要发布到哪一台服务器
以及要更新的服务
,之后点击构建,完成指定的服务构建以及发布到指定的服务器上。
Jenkins环境搭建
前提环境
Docker
环境- 可以使用
docker-compose
,建议版本为:Docker Compose version v2.1.1
,不然可能会出现docker-compose: not found
的情况 - 拉取
jenkinsci/blueocean:1.25.7-bcc31d32159f
镜像 - 拉取
maven:3-alpine
镜像
启动Jenkins
docker run
-e TZ=Asia/Shanghai
--network host
-d
-u root
--name jenkins
-v jenkins-data:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock
-v "$HOME":/home
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
jenkinsci/blueocean:1.25.7-bcc31d32159f
-v jenkins-data:/var/jenkins_home:
将jenkins容器里面的/var/jenkins_home(jenkins配置信息)映射到Docker volume,并将其命名成jenkins-data
-v /var/run/docker.sock:/var/run/docker.sock:
允许jenkins使用docker环境
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose:
允许jenkins使用docker-compose
解锁jenkins
第一次访问jenkins地址:http://ip:8080
密码在jenkins启动日志里
自定义Jenkins
选择安装推荐的插件
如果遇到安装部分插件失败,可以去找到系统管理
——插件管理
——已安装
,先卸载掉失败的插件,再去可选插件中搜索并下载.
ps:卸载和下载完需要重启才能生效,但是博主经常遇到点重启,它只关闭不重启,可以手动启动。
创建第一个管理员用户
实例配置
插件下载
Git Parameter Plug-In
,git参数化构建,构建时可以指定构建分支Publish Over SSH
插件,远程发布Extended Choice Parameter Plugin
,选择参数添加扩展功能Docker
,集成dockerDocker Pipeline
,通过流水线构建和使用Docker容器Docker Compose Buid Step Plugin
,集成docker-compose
全局凭据配置
配置gitlab的账号密码
系统配置
点击系统管理
——系统配置
Publish over SSH配置
SSH Servers新增![在这里插入图片描述](https://img-blog.csdnimg.cn/598a43772e5a4245a7cd31d7ea51e11e.png)
创建任务
创建一个流水线任务
参数化构建
Git参数
服务器参数配置
服务名配置
流水线配置
代码仓库配置
关闭轻量级检出
示例项目内容
项目结构
docker-compose.dev.yml
version: "3.0"
services:
holiday-management:
build:
context: holiday-management
args:
APP: target/holiday-management.jar
plan-scheduler:
build:
context: plan-scheduler
args:
APP: target/plan-scheduler.jar
docker-compose.yml
version: "3.0"
services:
holiday-management:
restart: always
image: holiday/management:latest
env_file: ./config/.env
ports:
- 10018:10010
plan-scheduler:
restart: always
image: plan/scheduler:latest
env_file: ./config/.env
ports:
- 10028:10020
Jenkinsfile
pipeline {
agent any
environment {
def remoteId = "${PUBLISH_SSH_SERVER}"
def service_names = "${SERVICE_NAMES}".replace(",", " ")
def half_finished_images = "${service_names}".replace("-", "/").replace(" ", ":latest ")
def images = "${half_finished_images}" + ":latest"
def deploy = "deploy"
}
stages {
stage('项目构建') {
agent {
docker {
image 'maven:3-alpine'
args '-v /home/.m2:/root/.m2'
}
}
steps {
echo "打包项目"
sh 'mvn clean install -DskipTests=true'
echo "构建镜像"
sh "docker-compose -f docker-compose.yml -f docker-compose.dev.yml build ${service_names}"
}
}
stage('下载镜像') {
agent any
steps {
echo "下载镜像"
sh "docker save ${images} -o images.tar"
}
}
stage('发往远程'){
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '',
execCommand: """
echo '准备解压发布文件并部署'
cd /home/deploy/cpmc
#解压到当前目录,并去除一级目录
docker load < images.tar
docker-compose up -d ${service_names}
echo '镜像加载成功'
""",
execTimeout: 120000,
flatten: false,
makeEmptyDirs: false,
noDefaultExcludes: false,
patternSeparator: '[, ]+',
remoteDirectory: "cpmc",
remoteDirectorySDF: false,
removePrefix: '',
sourceFiles: "images.tar, config/.env, docker-compose.yml")],
usePromotionTimestamp: false,
useWorkspaceInPromotion: false,
verbose: true)])
}
}
}
}
构建发布
在配置好以上的内容之后,在Dashboard
-cpmc
-Build with Parameters
构建、发布远程
查看发布日志
点击构建历史下的最新一次构建
——Console Output
构建成功~
ps:如果构建失败可以根据错误提示去解决。博主写这篇博客的时候也是构建了10余次才最后构建成功。。
最后
到这里,整一套自动构建远程发布就实现啦~欢迎留言讨论!
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击