准备条件:

  1. 本地可运行的springboot项目,本文以Maven项目为例,构建打包均使用Maven命令
  2. 拥有服务器的私钥
  3. 拥有push权限的coding账号和本地可以成功push代码到coding
  4. 能理解基础的git、mvn、shell脚本命令

实现步骤

将代码推送到coding仓库

  1. 新建一个coding仓库,项目模板选择DevOps

  2. 项目名称自选,例如“范例”,其他均为默认,Git仓库(下方多选框不选)

  3. 进入项目代码仓库,复制git地址。https://e.coding.net/dizent/fanli.git

  4. 进入本地项目目录,使用命令行将代码推送至仓库。

    cd 项目目录
    git init
    git remote add origin https://e.coding.net/dizent/fanli.git #替换为你的仓库地址
    git add .
    git commit -m "项目初始化"
    git push origin master
    
  5. 查看仓库中是否已有代码,即操作成功
    image-20200221111026550

构建配置

新的构建计划

  1. 选择项目左侧菜单栏构建与部署 –>构建
  2. 在内容区域选择新建构建配置
  3. 输入计划名称,代码源选择coding、仓库选需要构建的仓库
  4. 配置来源使用静态配置的JenkinsFile–>并行过程模板
  5. 勾选前往流程配置,点击保存修改

    流程配置

  6. 选择文本编辑器
  7. 配置解读

配置采用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)
        }
      }
  1. echo为输出信息,不作其他解释
  2. 检查Java版本
  3. Maven打包,打包在项目路径的../target/*.jar
  4. 收集打包后的文件
  • 测试
  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 '部署完成'
          }
  1. 在script中编写提交到服务器的脚本
  2. 配置服务器的ssh密钥,并导入coding凭据。相关操作见coding使用凭证进行认证
  3. 上传文件到服务器
  4. 运行服务器端的脚本deploy.sh
  5. 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打开
  • 通知提醒
    • 选择在构建时开启邮件提醒,并选择成员

开始构建

所有配置完成之后,即可点击开始构建 ,可以查看构建进度。

image-20200221125446930

参考文章:

  1. coding部署到-Linux-Web-服务器
  2. coding在持续集成中使用凭据
  3. Linux 运行jar包命令
  4. 【springboot】之利用shell脚本优雅启动,关闭springboot服务