准备条件:
- 本地可运行的springboot项目,本文以Maven项目为例,构建打包均使用Maven命令
- 拥有服务器的私钥
- 拥有push权限的coding账号和本地可以成功push代码到coding
- 能理解基础的git、mvn、shell脚本命令
实现步骤
将代码推送到coding仓库
新建一个coding仓库,项目模板选择
DevOps
项目名称自选,例如“范例”,其他均为默认,Git仓库(下方多选框不选)
进入项目
代码仓库
,复制git地址。https://e.coding.net/dizent/fanli.git
进入本地项目目录,使用命令行将代码推送至仓库。
cd 项目目录 git init git remote add origin https://e.coding.net/dizent/fanli.git #替换为你的仓库地址 git add . git commit -m "项目初始化" git push origin master
查看仓库中是否已有代码,即操作成功
构建配置
新的构建计划
- 选择项目左侧菜单栏
构建与部署
–>构建
- 在内容区域选择
新建构建配置
- 输入
计划名称
,代码源选择coding
、仓库选需要构建的仓库 - 配置来源
使用静态配置的JenkinsFile
–>并行过程模板
- 勾选
前往流程配置
,点击保存修改
流程配置
- 选择
文本编辑器
- 配置解读
配置采用pipeline
默认环境下需要添加
agent any
,表示“在 CODING 提供的云主机上执行 Pipeline 或 stage”构建步骤将在
stages
下分布进行,每个子stage
都代表一个阶段
阶段配置
- 检出:
stage('检出') {
steps {
checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
在仓库检出,此阶段配置无需改动,都默认为上一步构建计划的参数
- 构建
stage('构建') {
steps {
echo '构建中...'
sh 'java -version'
sh 'mvn package'
echo '构建完成.'
archiveArtifacts(artifacts: '**/target/*.jar', fingerprint: true)
}
}
- echo为输出信息,不作其他解释
- 检查Java版本
- Maven打包,打包在项目路径的
../target/*.jar
- 收集打包后的文件
- 测试
stage('测试') {
steps {
echo '单元测试中...'
sh 'mvn test'
echo '单元测试完成.'
}
}
执行Maven测试,测试test包下的代码
- 部署
stage('部署') {
steps {
echo '部署中...'
script {
def remote = [:]
remote.name = 'web-server'
remote.allowAnyHosts = true
remote.host = '服务器ip地址'
remote.user = '服务器用户名'
// 需要先创建一对 SSH 密钥,把私钥放在 CODING 凭据管理,把公钥放在服务器的 `.ssh/authorized_keys`,实现免密码登录
withCredentials([sshUserPrivateKey(credentialsId: "057*****-****-****-****-*******16f0a", keyFileVariable: 'id_rsa')]) {
remote.identityFile = id_rsa
// SSH 上传文件到远端服务器 “fanli-0.0.1-SNAPSHOT.jar”是生成的jar文件,into后是服务器端的目录
sshPut remote: remote, from: 'target/fanli-0.0.1-SNAPSHOT.jar', into: '/usr/local/java'
// 重启 服务器。在服务器端编写“deploy.sh”脚本进行项目启动控制
sshCommand remote: remote, sudo: true, command: "sh /usr/local/java/deploy.sh restart"
}
echo '部署完成'
}
- 在script中编写提交到服务器的脚本
- 配置服务器的ssh密钥,并导入coding凭据。相关操作见coding使用凭证进行认证
- 上传文件到服务器
- 运行服务器端的脚本
deploy.sh
deploy.sh
脚本内容如下#!/bin/sh ## java 环境 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64 ## jre环境 export JRE_HOME=$JAVA_HOME/jre ## jar包推送路径 export RUN_PATH=/usr/local/java ## jar包名字 API_NAME=fanli-0.0.1-SNAPSHOT JAR_NAME=$API_NAME\.jar #PID 代表是PID文件 PID=$RUN_PATH/$API_NAME\.pid #使用说明,用来提示输入参数 usage() { echo "Usage: sh 执行脚本.sh [start|stop|restart|status]" exit 1 } #检查程序是否在运行 is_exist(){ pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' ` #如果不存在返回1,存在返回0 if [ -z "${pid}" ]; then return 1 else return 0 fi } #启动方法 start(){ is_exist if [ $? -eq "0" ]; then echo ">>> ${JAR_NAME} is already running PID=${pid} <<<" else nohup $JRE_HOME/bin/java -Xms256m -Xmx512m -jar $RUN_PATH/$JAR_NAME > $RUN_PATH/fanli.out & echo $! > $PID echo ">>> start $JAR_NAME successed PID=$! <<<" fi } #停止方法 stop(){ #is_exist pidf=$(cat $PID) #echo "$pidf" echo ">>> api PID = $pidf begin kill $pidf <<<" kill $pidf rm -rf $PID sleep 2 is_exist if [ $? -eq "0" ]; then echo ">>> api 2 PID = $pid begin kill -9 $pid <<<" kill -9 $pid sleep 2 echo ">>> $JAR_NAME process stopped <<<" else echo ">>> ${JAR_NAME} is not running <<<" fi } #输出运行状态 status(){ is_exist if [ $? -eq "0" ]; then echo ">>> ${JAR_NAME} is running PID is ${pid} <<<" else echo ">>> ${JAR_NAME} is not running <<<" fi } #重启 restart(){ stop start } #根据输入参数,选择执行对应方法,不输入则执行使用说明 case "$1" in "start") start ;; "stop") stop ;; "status") status ;; "restart") restart ;; *) usage ;; esac exit 0
- 触发规则
- 选择自己需要的出发规则:例如,代码更新时执行,当执行
git push
之后,构建进行将执行
- 选择自己需要的出发规则:例如,代码更新时执行,当执行
- 变量与缓存
- 可以将上方用到的变量使用变量配置,即可多项目使用
- 缓存目录:
项目目录
Maven
打开
- 通知提醒
- 选择在构建时开启邮件提醒,并选择成员
开始构建
所有配置完成之后,即可点击开始构建
,可以查看构建进度。
参考文章: