记录:coding持续集成之自动发布项目
把一个SpringBoot项目在DevOps一站式研发平台coding编译成jar远程部署到服务器分为几步?答:3步。
- 1、编译生成构建产物-jar包;
- 2、SCP 上传到远端服务器;
- 3、远程执行shell命令运行项目;
coding的持续集成,已经可以实现版本发布自动上线,原理如下图:
- DevOps自动上线原理

常见的持续集成有:
商业化的 CircleCI、开源的 Jenkins,以及 Jenkins 云服务—Coding
coding持续集成说明https://coding.net/products/ci?cps_source=PIevZ6Jr
自动化部署实战演示
自动化部署的两种方式
服务器环境-centos7.2
方式一(传统自动化部署)
使用技术如下:
| 工具 | 用途 |
|---|---|
| jenkins | 持续集成工具 |
| git | 分布式版本控制工具 |
| maven | 项目管理工具-用于构建项目 |
| jdk | java项目运行环境 |
- 上述工具需要在安装到服务器上(jenkins集成ssh功能,可以不用安装到服务器)
示例服务器:
公司内网测试机192.168.1.91
[root@bogon data-view]# pwd
/opt/webapps/dataview-src/ty-data-view/data-view
[root@bogon data-view]# ll
总用量 36
-rw-r--r--. 1 root root 1206 4月 20 14:29 build.sh
drwxr-xr-x. 4 root root 43 4月 20 14:30 common
drwxr-xr-x. 4 root root 61 4月 20 14:31 d-view
-rw-r--r--. 1 root root 11858 4月 17 14:28 init_db.sql
-rw-r--r--. 1 root root 4434 4月 20 14:29 pom.xml
-rw-r--r--. 1 root root 14 1月 2 14:46 README.md
-rw-r--r--. 1 root root 7491 4月 20 14:29 settings.xml
drwxr-xr-x. 3 root root 20 4月 20 14:31 target
[root@bogon data-view]# git branch -a
dev
* test
remotes/origin/HEAD -> origin/dev
remotes/origin/dev
remotes/origin/master
remotes/origin/test
[root@bogon data-view]#
- 通过jenkins的ssh功能远程执行shell命令实现自动化部署流程

- jenkins 控制台日志输出

- 备注:传统的jenkins流水线构建需要设置的参数比较繁琐,需要配置项目git地址、maven路径、jdk路径有时候一处不对就会造成整体流程不通。
方式二 一站式DevOps研发平台coding持续集成(coding完美的集成了jenkins)
CODING 的持续集成本质上就是每次实例化一台 CVM,再把 Jenkins 安装进去,和我们在普通的云服务器上部署是一样的。
CODING 持续集成会为每个构建任务分配一台 VM 作为构建资源,您可以通过内置的 agent label 来使用不同的环境进行构建。目前支持的构建环境有三种:
- 默认环境:在 CODING 提供的云主机上执行 Pipeline 或 stage
- Docker 环境:在指定的 Docker 镜像启动的容器环境中执行 Pipeline 或 stage
- Dockerfile 环境:使用代码仓库中指定的 Dockerfile 脚本构建的容器环境中执行 Pipeline 或 stage
- 首先需要创建coding平台和远端服务器连接
预装的软件 SDK
默认环境中提供的 SDK 以及对应的版本如下(更新日期:2019 年 11 月 30 日):
android-sdk: 26.1.1
build-essential
java: 1.8.0_191
python: 2.7.12
python3: 3.5.2
python3.7: 3.7.3
nodejs: 10.15.3
php: 7.3.5
ruby: 2.6.0
go: 1.12.4
dotnet-core: 2.2
erlang: Erlang/OTP 21
elixir: 1.8.1
预装的命令行工具
默认环境中提供的命令行工具以及对应的版本如下(更新日期:2019 年 11 月 30 日):
cmake: 3.5.1
maven: 3.6.1
gradle: 4.10.3
nvm: 0.34.0
yarn: 1.15.2
composer: 1.8.5
bundler: 1.17.2
rvm: 1.29.7
docker: 18.09.1
docker-compose: 1.23.1
kubectl: 1.14
rancher: 2.2.0
helm: 2.13.1
coscmd: 1.8.5.36
tccli: 3.0.67.1
svn: 1.9.3
mercurial: 3.7.3
git: 2.7.4
git-lfs: 2.7.2
jq: 1.5-1-a5b5cbe
pigz: 2.3.1
sshpass: 1.05
vsftpd: 3.0.3
SpringBoot项目自动化部署具体步骤如下:
- 服务器创建SSH公私钥
命令如下:
ssh-keygen -m PEM -t rsa -b 4096 -C "your.email@example.com"
- 创建好后会在目录/root/.ssh生成两个文件(id_rsa是私钥|id_rsa.pub是公钥)
[root@VM_0_3_centos .ssh]# pwd
/root/.ssh
[root@VM_0_3_centos .ssh]# ll
total 16
-rw------- 1 root root 743 Apr 10 14:32 authorized_keys
-rw------- 1 root root 3243 Apr 10 13:20 id_rsa
-rw-r--r-- 1 root root 742 Apr 10 13:20 id_rsa.pub
需要把公钥id_rsa.pub复制到authorized_keys文本中,另外需要把 id_rsa私钥配置到:项目设置——凭据管理(类型选择私钥)这样就完成了SSH无密码连接
然后开始构建项目信息配置

进入coding构建与部署模块,【流程配置】用编译器编写jenkins的pipeline脚本
jenkins官网介绍SSH pipeline 语法使用说明
https://jenkins.io/doc/pipeline/steps/ssh-steps/#sshcommand-ssh-steps-sshcommand-execute-command-on-remote-node
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout(
[$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]]
)
}
}
stage('构建') {
steps {
sh 'du -h --max-depth=1 ~/.m2/repository'
sh 'env'
dir(path: 'user-authority/') {
echo '构建中...'
sh 'env'
sh 'pwd'
sh 'mvn -T 1C clean install -D maven.test.skip=true -D maven.compile.fork=true -s ./settings.xml'
echo '构建完成.'
script {
def exists = fileExists 'README.md'
if (!exists) {
writeFile(file: 'README.md', text: '权限中心-test')
}
}
}
archiveArtifacts(artifacts: '**/target/*.jar', fingerprint: true)
}
}
stage('部署') {
steps {
echo '部署中...'
script {
// 声明服务器信息
def remote = [:]
remote.name = 'web-server'
remote.allowAnyHosts = true
remote.host = '121.36.19.189'
remote.port = 22
remote.user = 'root'
// 把「CODING 凭据管理」中的「凭据 ID」填入 credentialsId,而 id_rsa 无需修改
withCredentials([sshUserPrivateKey(credentialsId: "9274aafa-72fc-472b-8ae4-xxxxxx", keyFileVariable: 'id_rsa')]) {
remote.identityFile = id_rsa
// SSH 上传文件到远端服务器
sshPut remote: remote, from: 'user-authority/target/user-authority-0.0.1-SNAPSHOT.jar', into: '/opt/'
sshCommand remote: remote, command: "sh /opt/test.sh"
}
}
echo '部署完成'
}
}
}
}
- 此处maven构建过程中遇到一个坑
由于项目需要拉取私服的依赖包,需要加载项目中使用的settings.xml文件
把使用私服配置的settings.xml文件放到项目src目录下
配置maven依赖包的缓存

注释原有settings.xml的repository路径,走coding默认环境的maven。

使用maven构建命令并指向需要加载的settings.xml文件
mvn -T 1C clean install -D maven.test.skip=true -D maven.compile.fork=true -s ./settings.xml

写好pipeline构建脚本后,点击【立即构建】coding会根据Jenkinsfile自动完成脚本,构建成后会生成项目jar包,并把项目jar包推送至远端服务器,远程执行test.sh脚本运行SpringBoot项目。

通过coding构建控制台日志可以看到项目已成功启动,访问结果如下:

coding自动构建--触发规则
可以根据项目中源码变动情况来触发自动构建job


通过上图可以设置根据不同的触发规则来自动构建项目达到自动发布的目的。
更多测试技术分享、学习资源以及一些其他福利可关注公众号:【Coding测试】获取:

记录:coding持续集成之自动发布项目的更多相关文章
- 使用Docker构建持续集成与自动部署的Docker集群
为什么使用Docker " 从我个人使用的角度讲的话 部署来的更方便 只要构建过一次环境 推送到镜像仓库 迁移起来也是分分钟的事情 虚拟化让集群的管理和控制部署都更方便 hub.docke ...
- 利用Travis CI+GitHub实现持续集成和自动部署
前言 如果你手动部署过项目,一定会深感持续集成的必要性,因为手动部署实在又繁琐又耗时,虽然部署流程基本固定,依然容易出错. 如果你很熟悉持续集成,一定会同意这样的观点:"使用它已经成为一种标 ...
- 持续集成~Jenkins构建GitHub项目的实现
有了前两讲的基础,这回我们就可以把github上的项目做到CI(jenkins)里了,让它自动去集成部署,持续集成~Jenkins里的NuGet和MSBuild插件,持续集成~Jenkins里的pow ...
- gitlab持续集成,自动部署
写这篇文章的目的是,实现提交代码到gitlab上的一个项目时,自动打包,并将包发布到另一台服务器上,重启tomat.如有问题,可以联系本人QQ:409838567 gitlab-ci,是基于gitla ...
- AspNetCore&Coding持续集成
对于现有很多持续集成工具来讲,功能越来越高级,使用了 Coding 有大半年时间,越发觉好用,特别是没钱续费服务器时,找到了新的羊毛. 一.众多持续集成工具 现在可用的持续集成工具繁多,各大云服务商都 ...
- Jenkins+Maven+Svn搭建持续集成环境持续集成和自动部署
Jenkins和Hudson有很深的渊源,Jenkins目前更新频繁,目前选用Jenkins为持续集成工具和自动部署 Jenkins的使用有很多的介绍,主要记录如下要点: 192.168.1.240: ...
- Jenkins持续集成_02_添加python项目&设置定时任务
前言 自动化测试脚本编写后,最终目的都是持续集.持续集成可以实现一天多次部署运行自动化脚本,对功能进行不断监控测试.由于小编使用python编写的自动化脚本,这里仅讲解下如何在Jenkins中添加py ...
- 基于TeamCity的asp.net mvc/core,Vue 持续集成与自动部署
一 Web Server(Windows)端的配置 1.配置IIS,重要的是管理服务 1.1 配置FTP(前端NPM项目需要) 该步骤略,如果是在阿里云ESC上,需要开启端口21(用来FTP认证握手) ...
- Jenkins持续集成实践之java项目自动化部署
关于Linux安装Jenkins可以参考我的这篇博文Ubuntu16.04环境安装jenkins 1.安装部署插件 进入插件管理,并搜索该插件Deploy to container Plugin进行安 ...
- 剑指架构师系列-持续集成之Maven实现项目的编译、发布和部署
Maven组织项目进行编译.部署 Maven项目基本的结构说明如下: mazhi // 控制所有荐的编译.部署.发布 mazhi-app-parent // 项目的父项目,有一些公共的设置可以被子 ...
随机推荐
- Conda 使用
简介 Conda 和 Anaconda.Miniconda 的关系 Conda 是一个包管理器及环境管理器. Anaconda 和 Miniconda 都是一种 Python 和 R 发行版,其包括了 ...
- Manual 命令手册导出
man 命令的输出中含有大量的格式化字符和终端控制序列,这些是用来在终端中正确显示格式化文本(如加粗,下划线,分页等)所用的.如 BS(Backspace,退格). 如果我们直接用 man comma ...
- Ubuntu APT sources.list 文件格式解释
单行风格(传统) 传统的 sourses.list 文件使用单行风格配置,下面是两条单行风格的配置项: deb http://archive.ubuntu.com/ubuntu jammy main ...
- MyBatis日志工厂
目录 日志工厂 标准日志实现 Log4j 使用步骤: 日志工厂 我们在测试SQL的时候,要是能够在控制台输出 SQL 的话,是不是就能够有更快的排错效率? 如果一个 数据库相关的操作出现了问题,我们可 ...
- Angular 18+ 高级教程 – 盘点 Angular v14 到 v18 的重大改变
前言 我在 <初识 Angular> 文章里有提到 Angular 目前的断层问题. 大部分的 Angular 用户都停留在 v9.0 版本. Why everyone stay v9.0 ...
- 面试官:GROUP BY和DISTINCT有什么区别?
在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示 ...
- SpringBoot——整合SSM(主要整合MyBatis)
基于SpringBoot整合SSM SpringBoot整合Spring(不存在) SpringBoot整合SpringMVC(不存在) SpringBoot整合MyBatis(主要) Spring整 ...
- Android Qcom USB Driver学习(十一)
基于TI的Firmware Update固件升级的流程分析usb appliction layers的数据 USB Protocol Package ①/② map to check password ...
- USB 控制写传输、控制读传输、无数据控制传输都是在什么场景下?
在 USB 通信中,控制传输(Control Transfer)是一个非常常见且重要的传输类型,主要用于配置设备.查询设备状态以及发送和接收命令.控制传输有三种主要形式:控制写传输(Control W ...
- Trace32 simulator调试以及简单实用命令介绍
目录 Trace32 Simulator debug Trace32工具配置 Trace32命令简介 memory class 常见命令索引 v.v使用实例 不同CPU运行信息查看 Trace32 S ...