DevOps 实践经验

以下列举了一些 DevOps 最佳实际:

  • 继续集成
  • 继续交付
  • 微服务
  • 基础设施代码
  • 监控和日志记录
  • 沟通与单干

继续集成-CI

采纳继续集成时,开发人员会定期将他们的代码变更合并到一个地方存储库中,之后零碎会主动运行构建和测试操作。继续集成的次要指标是更快发现并解决谬误,进步软件品质,并缩短验证和公布新软件更新所需的工夫。

继续交付-CD

是通过继续交付零碎能够主动构建和测试代码更改,并为将其公布到生产环境做好筹备。继续交付能够在构建阶段后将所有代码变更都部署到测试环境和/或生产环境中,从而实现对继续集成的扩大。当继续交付得以正确施行时,开发人员将始终可能取得一个已通过标准化测试流程的部署就绪型构建工件。

微服务

微服务架构是一种将单个应用程序构建为一系列小服务的设计办法。其中每个服务均按各自的流程运行,并利用一种轻型机制(通常为基于 HTTP 的应用程序编程接口 (API))通过一个明确定义的接口与其余服务进行通信。微服务围绕着业务能力进行构建,每项服务均限定到单个目标。您能够应用不同的框架或编程语言来编写微服务,并将其作为单个服务或一组服务进行独立部署。

基础设施代码

通过代码和软件部署技术(例如版本控制和继续集成)得以预置和治理。开发人员和系统管理员可能以编程形式与基础设施进行大规模互动,而无需手动设置和配置资源。因而,工程师能够应用基于代码的工具来连贯基础设施,并且可能以解决利用程序代码的形式来解决基础设施。基础设施和服务器由代码进行定义,因而能够应用标准化模式进行疾速部署、应用最新补丁和版本进行更新,或者以可反复的形式进行复制。组织能够主动跟踪、验证和重新配置由代码形容的基础设施。

配置管理

开发人员和系统管理员应用代码将操作系统和主机配置、操作性工作等自动化。代码的应用实现了配置变更的可重复性和标准化。它将开发人员和系统管理员从手动配置操作系统、零碎应用程序或服务器软件的工作中解放出来。

监控和日志记录

组织对各项指标和日志进行监控,以理解应用程序和基础设施性能如何影响其产品的最终用户体验。通过对应用程序和基础设施生成的数据进行采集、分类和剖析,组织能够理解变更或更新如何影响用户,同时深刻理解呈现问题或意外变故的根本原因。因为服务必须全天候继续可用,而且应用程序和基础设施的更新频率一直进步,因而被动监控变得日益重要。此外,创立警报或对这些数据执行实时剖析也能帮忙组织更被动地监控其服务。

沟通与单干

加强组织外部的沟通与单干是 DevOps 文化的一个重要方面。DevOps 工具的应用和软件交付流程的自动化可能以物理形式将开发和运行的工作流程及职责联合起来,从而建设团队之间的相互协作。在此基础上,这些团队建立了弱小的文化标准,提倡信息共享和通过聊天应用程序、问题或我的项目追踪零碎以及 Wikis 来促成沟通。这有助于放慢开发人员、经营团队甚至其余团队之间的沟通,从而使组织的各个部门围绕独特的指标和我的项目更严密地联合在一起。

DevOps 工具

DevOps 模式依赖于无效的工具来帮忙团队疾速牢靠地部署并针对客户进行翻新。这些工具能够主动执行手动工作,帮忙团队大规模治理简单环境,并使工程师可能管制 DevOps 实现的高速度。

gitlab runner 流水线 CICD 实例

形容

当固定分支代码有提交触发编译,触发gitlab runner 编译代码并上传网盘或者服务器,部署到虚拟机须要手动触发。

gitlab-runner 部署及关联gitlab,能够参照下方帖子

https://segmentfault.com/a/11...

.gitlab-ci.yml

before_script:    - echo "before script!"variables:    SCID: 'sc1765'    PGID: 'sc1765_82'    PG1_NAME: 'tkzjframe-conline-consumption'    PG1_PORT: '8080'    PG2_NAME: 'tkzjframe-conlineSys-consumption'    PG2_PORT: '8081'    PG3_NAME: 'tkzjframe-conline-core'    PG4_NAME: 'tkzjframe-conlineSys-core'    env1: 'pro'    IP_801: '10.130.105.121'    IP_802: '10.130.105.122'    tomcat_LIST: "${PG1_NAME} ${PG2_NAME}"    jar_LIST: "${PG3_NAME} ${PG4_NAME}"    IP_LIST: "${IP_801} ${IP_802}"    PASS_FILE: '/etc/rsync_user.password'    RS800_SERVER: '10.130.159.1'    RS500_SERVER: '10.154.140.130'stages:    - build    - deploy    - rollback    - restart    - logsbuild_job:    stage: build    script:        - pwd        - ip a        - pathpwd=`pwd`        - mvn clean install -Dmaven.test.skip=true -P${env1}        - echo $jar_LIST        - for i in ${jar_LIST};do cd ${pathpwd}/${i}/target;ls ; APPNAME=`ls -l *.jar | grep $i | grep -v original | head -n 1 | awk -F ' ' '{print $9}'`;mv $APPNAME ${i}-${env1}.jar; done        - ls -l        - for k in ${jar_LIST};do cd ${pathpwd}/${k}/target ;ls ; rsync -avz ${k}-${env1}.jar rsync_user@${RS800_SERVER}::rsync_server/${SCID}/ --password-file=${PASS_FILE} ;done        - echo $tomcat_LIST        #- for i in ${tomcat_LIST};do cd ${pathpwd}/${i}/target;ls ; APPNAME=`ls -l *.war | grep $i | head -n 1 | awk -F ' ' '{print $9}'`;mv $APPNAME ${i}.war; done        - ls -l        - for k in ${tomcat_LIST};do cd ${pathpwd}/${k}/target ;ls ; rsync -avz ${k}.war rsync_user@${RS800_SERVER}::rsync_server/${SCID}/ --password-file=${PASS_FILE} ;done    only:        - master    tags:        - prod-deploy-106.76deploy_tkzjframe-conline-consumption_tomcat1:    stage: deploy    script:        - for i in ${IP_LIST};do ssh appadmin@${i} "cd /home/appadmin/tomcat && wget -O update.sh http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}/update.sh && sh +x update.sh -t tomcat -d ${PG1_PORT} -e ${env1} -s ${SCID} -p ${PG1_NAME} -a deploy"; done        #- ssh appadmin@${IP_801} "cd /home/appadmin/tomcat && wget -O update.sh http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}/update.sh && sh -x update.sh -t tomcat -d ${PG1_PORT} -e ${env1} -s $SCID -p ${PG1_NAME} -a 'deploy'"    when: manual    only:        - master    tags:        - prod-deploy-106.76                        deploy_tkzjframe-conlineSys-consumption_tomcat2:    stage: deploy    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && wget -O update.sh http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}/update.sh  && sh +x update.sh -t tomcat -d ${PG2_PORT} -e ${env1} -s ${SCID} -p ${PG2_NAME} -a 'deploy'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76        deploy_tkzjframe-conline-core_jar1:    stage: deploy    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && wget -O update.sh http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}/update.sh && sh -x update.sh -s ${SCID} -e ${env1} -p ${PG3_NAME} -a 'deploy'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76deploy_tkzjframe-conlineSys-core_jar2:    stage: deploy    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && wget -O update.sh http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}/update.sh && sh +x update.sh -s ${SCID} -e ${env1} -p ${PG4_NAME} -a 'deploy'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76restart_tkzjframe-conline-consumption_tomcat1:    stage: restart    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat  && sh +x update.sh -d ${PG1_PORT} -t tomcat -e ${env1} -s ${SCID} -p ${PG1_NAME} -a 'restart'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76                        restart_tkzjframe-conlineSys-consumption_tomcat2:    stage: restart    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && sh +x update.sh -d ${PG2_PORT} -t tomcat -e ${env1} -s ${SCID} -p ${PG2_NAME} -a 'restart'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76        restart_tkzjframe-conline-core_jar1:    stage: restart    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && sh +x update.sh -s ${SCID} -e ${env1} -p ${PG3_NAME} -a 'restart'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76restart_tkzjframe-conlineSys-core_jar2:    stage: restart    script:        - for i in ${IP_LIST};do  ssh appadmin@${i} "cd /home/appadmin/tomcat && sh +x update.sh -s ${SCID} -e ${env1} -p ${PG4_NAME} -a 'restart'"; done    when: manual    only:        - master    tags:        - yly-prod-10.130.105.98rollback_tkzjframe-conline-consumption_tomcat1:    stage: rollback    script:        - for i in ${IP_LIST};do  ssh ${i} "cd /home/appadmin/tomcat && sh +x update.sh -t tomcat  -d ${PG1_PORT} -e ${env1} -s ${SCID} -p ${PG1_NAME} -a 'rollback'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76                        rollback_tkzjframe-conlineSys-consumption_tomcat2:    stage: rollback    script:        - for i in ${IP_LIST};do  ssh ${i} "cd /home/appadmin/tomcat && sh +x update.sh -t tomcat  -d ${PG2_PORT} -e ${env1} -s ${SCID} -p ${PG2_NAME} -a 'rollback'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76        rollback_tkzjframe-conline-core_jar1:    stage: rollback    script:        - for i in ${IP_LIST};do ssh ${i} "cd /home/appadmin/tomcat && sh +x update.sh -s ${SCID} -e ${env1} -p ${PG3_NAME} -a 'rollback'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76rollback_tkzjframe-conlineSys-core_jar2:    stage: rollback    script:        - for i in ${IP_LIST};do ssh ${i} "cd /home/appadmin/tomcat && sh +x update.sh -s ${SCID} -e ${env1} -p ${PG4_NAME} -a 'rollback'"; done    when: manual    only:        - master    tags:        - prod-deploy-106.76

update.sh

#!/bin/bash. /etc/rc.d/init.d/functions. /etc/profileprintUsage(){    echo "usage: update.sh -t <TYPE> -s <SCID> -d <PG_PORT> -p <PG_NAME> -e <ENVe> -a <action>"    exit -1}if [ $# -eq 0 ];then    printUsagefiwhile getopts :s:p:d:e:t:a: opts;do    case "$opts" in        t)            TYPE=$OPTARG            ;;        s)            SCID=$OPTARG            ;;        p)            PG_NAME=$OPTARG            ;;        d)            PG_PORT=$OPTARG            ;;        e)            ENVe=$OPTARG            ;;        a)            ACTOINS=$OPTARG            ;;        :)            echo "$0 must supply an argument to option -$OPTARG!"            printUsage            ;;        ?)            echo "invalid option -$OPTARG ignored!"            printUsage            ;;    esacdoneif [ -z "$SCID" ];then    printUsage    exit -1fiecho "$SCID:$PG_NAME:${ENVe}:${ACTOINS}:${PG_PORT}"shift $(($OPTIND-1));if [ $# -gt 0 ];then    echo "other arguments:$@";fiDATEtmp=$(date +%Y%m%d%H%M)DATE=$(date +%Y%m%d%H)PG_PID_LINE=$(ps aux | grep java | grep $PG_NAME | wc -l)PG_PATH="/home/appadmin/tomcat"NginxPG_PATH="/usr/local/openresty/nginx/html"PG_DOWN_URL="http://mirrors.tkhealthcare.com/rsync_server/data/${SCID}"backup() {    cd $PG_PATH    if [ -f ${PG_PATH}/${PG_NAME}.${DATE}.bak.jar ]; then        echo "Bakup files ${PG_NAME}.${DATE}.bak.jar has already."    else        mv ${PG_NAME}-${ENVe}.jar ${PG_PATH}/${PG_NAME}.${DATE}.bak.jar || echo "first time deploy-project"        action "Backup files is ok, bk_file is : ${PG_NAME}.${DATE}.bak.jar" /bin/true    fi}tomcat_backup() {    cd ${PG_PATH}/tomcat_${PG_PORT}/webapps/    if [ -f ${PG_NAME}.${DATE}.war.bak ]; then        echo "Bakup files ${PG_NAME}.${DATE}.war.bak has already."    else        mv ${PG_NAME}.war ${PG_PATH}/tomcat_${PG_PORT}/webapps/${PG_NAME}.${DATE}.war.bak || echo "first time deploy-project"        action "Backup files is ok, bk_file is : ${PG_NAME}.${DATE}.war.bak " /bin/true    fi}frontbackup() {    cd $NginxPG_PATH    if [ -d ${NginxPG_PATH}/${PG_NAME}.${DATE} ]; then        echo "Bakup files  has already."            else        mv ${NginxPG_PATH}/${PG_NAME}-${ENVe} ${NginxPG_PATH}/${PG_NAME}.${DATE} || echo "first time deploy-project"        action "Backup files is ok, bk_file is : ${PG_NAME}.${DATE}" /bin/true    fi}stopproject() {    if [ $PG_PID_LINE -eq 0 ]; then        echo "$PG_NAME is not running ."    else        ps aux | grep java | grep $PG_NAME | awk -F ' ' '{print $2}' | xargs kill -9         #cd ${PG_PATH} && sh +x ${PG_NAME}.sh stop        action "$PG_NAME stop ..." /bin/true    fi}tomcat_stopproject() {    echo "stop tomcat"    #${PG_PATH}/${PG_PORT}/bin/catalina.sh stop || (ps -ef | grep 8080 | awk '{print $2}'| xargs kill -9 )    (ps -ef | grep ${PG_PATH}/tomcat_${PG_PORT} | grep -v grep | grep -v catalina.sh |awk '{print $2}' | xargs kill -9) || echo "stop--- service is not running"}tomcat_startproject() {    sh +x ${PG_PATH}/tomcat_${PG_PORT}/bin/startup.sh}startproject() {    cd ${PG_PATH} && echo "nohup java -jar ${PG_NAME}-${ENVe}.jar ${ENVe} > ${PG_NAME}-${ENVe}.log &" > ${PG_NAME}_start.sh    sh +x ${PG_NAME}_start.sh    if [ -f ${PG_NAME}-${ENVe}.jar ]; then        cd         echo "$PG_NAME starting"    else        action "${PG_NAME}-${ENVe}.jar is no found." /bin/false        exit    fi}checkpg() {    sleep 15    new_pid_line=`ps aux | grep java | grep $PG_NAME | wc -l`    if [[ ${new_pid_line} -eq 0 ]]; then        echo "$PG_NAME 服务[过程]启动失败."            exit 777        else        echo "$PG_NAME 服务[过程]及[端口]启动胜利 . --OK"    fi}tomcat_checkpg() {    sleep 15    new_pid_line=$(netstat -tnlp | grep  $PG_PORT | wc -l)    if [ $new_pid_line -eq 0 ]; then        #kill -9 $new_pid        action "$PG_NAME 服务[端口]启动失败." /bin/false        exit 777    fi}checkend() {    sleep 30    new_pid_line=$(ps aux | grep java | grep $PG_NAME | wc -l)    new_pid=$(ps aux | grep java | grep $PG_NAME | awk -F ' ' '{print $2}')    port_wc=$(netstat -tunlp | grep $new_pid | wc -l)    if [ $port_wc -eq 0 ] && [ $new_pid_line -eq 1 ]; then        kill -9 $new_pid        action "$PG_NAME 服务[端口]启动失败." /bin/false        exit 777    fi}update() {    cd $PG_PATH    [ -f ${PG_NAME}-${ENVe}.jar ] && rm -rf ${PG_NAME}-${ENVe}.jar    wget -O ${PG_NAME}-${ENVe}.jar ${PG_DOWN_URL}/${PG_NAME}-${ENVe}.jar    ls -l ${PG_NAME}-${ENVe}.jar}tomcat_update() {    cd $PG_PATH/tomcat_${PG_PORT}/webapps/    [ -f ${PG_NAME}.war ] && rm -rf ${PG_NAME}.war    rm -rf ${PG_NAME} pwd  wget -qO ${PG_NAME}.war ${PG_DOWN_URL}/${PG_NAME}.war || echo "download war failed"    ls -l ${PG_NAME}.war}frontupdate() {    cd $NginxPG_PATH    [ -d ${PG_NAME}-${ENVe} ] && rm -rf ${PG_NAME}-${ENVe}    wget -O ${PG_NAME}-${ENVe}.tar.gz ${PG_DOWN_URL}/${PG_NAME}-${ENVe}.tar.gz    ls -l ${PG_NAME}-${ENVe}.tar.gz    tar -xf ${PG_NAME}-${ENVe}.tar.gz && mv dist ${PG_NAME}-${ENVe}}frontrollbackupdate() {    cd $NginxPG_PATH    [ -d ${PG_NAME}.${DATE} ] && mv ${PG_NAME}-${ENVe} /tmp/${PG_NAME}-${ENVe}.${DATEtmp}    cp -a ${PG_NAME}.${DATE} ${PG_NAME}-${ENVe}}tomcat_rollbackupdate() {    cd ${PG_PATH}/tomcat_${PG_PORT}/webapps/    [ -f ${PG_NAME}.${DATE}.war.bak ] || exit 777     rm -rf ${PG_NAME}.war ${PG_NAME}    cp -a ${PG_NAME}.${DATE}.war.bak ${PG_NAME}.war}rollbackupdate() {    cd ${PG_PATH}/    [ -f ${PG_NAME}.${DATE}.bak.jar ] || exit 777    mv ${PG_NAME}-${ENVe}.jar /tmp/${PG_NAME}-${ENVe}-${DATEtmp}.jar    cp -a ${PG_NAME}.${DATE}.bak.jar ${PG_NAME}-${ENVe}.jar}jenkinsupdate() {    cd $PG_PATH    [ -f ${PG_NAME}-${ENVe}.jar ] && rm -rf ${PG_NAME}-${ENVe}.jar    mv ../${PG_NAME}-${ENVe}.jar .    ls -l ${PG_NAME}-${ENVe}.jar}echo $ACTOINS if [ $ACTOINS == 'restart' ]; then    if [[ $TYPE == 'tomcat' ]]; then        tomcat_stopproject        tomcat_startproject        tomcat_checkpg    else        stopproject        startproject        checkpg    fielif [ $ACTOINS == 'stop' ]; then    stopproject    checkpgelif [ $ACTOINS == 'jenkins-deploy' ]; then    stopproject    backup    jenkinsupdate    startproject    checkpgelif [ $ACTOINS == 'deploy' ]; then    if [[ $TYPE == 'front' ]]; then        frontbackup        frontupdate    elif [[ $TYPE == 'tomcat' ]]; then        tomcat_backup        tomcat_stopproject        tomcat_update        tomcat_startproject        tomcat_checkpg        else        backup        stopproject        update        startproject        checkpg        fi        elif [ $ACTOINS == 'rollback' ]; then    if [ $TYPE == 'front' ]; then        frontrollbackupdate    elif [[ $TYPE == 'tomcat' ]]; then        tomcat_stopproject        tomcat_rollbackupdate        tomcat_startproject        tomcat_checkpg        else        stopproject        rollbackupdate        startproject        checkpg    fifi

jenkins cicd

  • 装置ant及checkstyle,配置代码语法查看

    判断生成的report.html 是否有问题,从而判断编译是否进行
  • 形容

    Jenkins 通过gitlab的钩子,当固定代码分支有提交时触发编译,而后构建docker镜像上传harbor,而后手动触发部署更新,公布时Jenkins的pipeline配合着本人开发的CMDB匹配我的项目信息 通过shell 替换固定的yaml实现k8s 上的服务滚动更新。
  • jenkins pipeline

    #!/usr/bin/env groovyimport groovy.util.XmlSlurperimport groovy.lang.GroovyObjectSupportimport groovy.util.slurpersupport.GPathResultimport groovy.util.slurpersupport.NodeChildimport groovy.util.Evalimport groovy.json.JsonSlurperimport java.lang.Integerimport java.lang.Stringimport jenkins.model.Jenkins@Library('htjfPipeline@master') _def dockerbuild = new org.devops.dockerbuild()node {  stage('获取environment变量') {      projectname = JOB_NAME.split("_")[1].toLowerCase()      //发版所用的环境 //如果环境的变量中含有_字符DEV_service,环境就获取_下划线分隔的0数组DEV      //jenvironment = JOB_NAME.split("_")[0].toLowerCase().indexOf("-")!=-1 ? JOB_NAME.split("_")[0].toLowerCase().split("-")[0].toLowerCase() : JOB_NAME.split("_")[0].toLowerCase()      //echo environment_rdb      //projectname = JOB_NAME.split("_")[0].toLowerCase().indexOf("-")!=-1 ? JOB_NAME.split("-")[1].split("_")[0]+"-"+${projectname} : ${projectname}      appName = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/build_name", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      repoUrl = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/git_url", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      topicsPattern = "${projectname}"      ifusek8s = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/if_use_k8s", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      ServiceType = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/service_type", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      toPortDev = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/node_port_dev", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      toPortQasa = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/node_port_qasa", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      toPortUata = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/node_port_uata", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      toPortProd = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/node_port_prod", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      toPortuse = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/node_port_${deployEnv}", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      build_sh = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/build_command", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      appDomain = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/${deployEnv}_domainzone", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      zone = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/${deployEnv}_zone_name", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")      domainzone = "${appDomain}.${zone}"      profile = "profile-a"      targetPort = "8080"      harborHost = "harbor.reg"  }  parameters {      gitParameter(branch: '',              branchFilter: 'origin/(.*)',              defaultValue: 'master',              description: '抉择分支',              name: 'repoBranch',              quickFilterEnabled: true,              selectedValue: 'NONE',              sortMode: 'NONE',              tagFilter: '*',              useRepository: '.*insurance.*',              type: 'PT_BRANCH_TAG')      choice(name: 'deployEnv', choices: 'dev\nqasa\nuata', description: '抉择公布环境:dev开发环境,qasa测试环境,uata预公布环境')  }}node {  stage('getBranch') {      script {          try {              if ("${branch}" != "") {                  println "----------webhook式触发-----------"                  branchName = branch - "refs/heads"                  env.branchName = sh(returnStdout: true, script: "echo ${branchName}|awk -F '/' '{print \$NF}'").trim()                  println "webhook触发的分支是: " + "${branchName}"              }          } catch (exc) {          }          if ("${params.repoBranch}" != "") {              println "-----------手动形式触发------------"              env.branchName = "${params.repoBranch}"              println "手动触发的分支是: " + "${branchName}"          }      }  }  stage('checkOut') {      checkout([$class: 'GitSCM', branches: [[name: "${branchName}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'CleanBeforeCheckout']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '4a83a964-0fa4-4e2c-a448-2d40ed71d9a7', url: "${repoUrl}"]]])      script {          //gitTag = sh(returnStdout: true,script: 'git describe --tags --always').trim()          gitTagTmp = sh(returnStdout: true, script: 'git rev-parse --short HEAD').trim()          env.gitTag = "${gitTagTmp}-${BUILD_NUMBER}"      }      println "${gitTag}"      println "${appName}"      println "${projectname}"      println "${toPortProd}"      println "${toPortDev}"      println "${toPortQasa}"      println "${repoUrl}"      println "${toPortUata}"      println "${appDomain}.${zone}"      println "${ServiceType}"      println "${build_sh}"      println "${toPortuse} --in use port"      echo "test print data"  }  stage('gradlewBuild') {      stage("${deployEnv}环境targetBuild") {          if (ServiceType == "java" || ServiceType == "tomcat") {              println "公布测试环境,分支为 ${branchName}"              sh "ls"              def build_sh1 = "${build_sh}".replace('bbuild_namee', "${appName}").replace('eenvv', "${deployEnv}")              println("${build_sh1}")              sh "${build_sh1}"              //sh "sh +x gradlew clean --no-daemon  :job-task:buildTar -x test  -PprojectEnv=qasa"              //build_sh1 = "http://172.16.188.27:9999/get_project_itme/${projectname}/build_command".toURL().text.replace("\"","").replace('bbuild_namee',"${appName}").replaceAll("(\r\n|\r|\n|\n\r)", "").replace('eenvv',"${deployEnv}").replace("\"","")              //build_sh = "${build_sh1}".replace('bbuild_namee',"${appName}").replaceAll("(\r\n|\r|\n|\n\r)", "").replace('eenvv',"${deployEnv}").replace("\"","")              //sh "sh +x gradlew clean --no-daemon  :job-task:buildTar -x test  -PprojectEnv=dev"              //def Wstart_command = ['/bin/bash','-c',"${build_sh1}"].execute(null, new File(WORKSPACE))              //        Wstart_command.waitFor()              //       println(Wstart_command.text)          }      }  }  stage("${deployEnv}环境dockerBuild") {      if (ifusek8s == "yes" && ServiceType == "java") {          if (deployEnv == "dev") {              println "开发环境dockerBuild,dockerVersion为 ${gitTag}-${branchName}"              dockerImage = "test_jinfu/devpipeline-${appName}"              dockerbuild.dockerBuild(harborHost, appName, dockerImage, gitTag, branchName)          } else if (deployEnv == "qasa") {              println "测试环境dockerBuild,dockerVersion为 ${gitTag}-${branchName}"              dockerImage = "test_jinfu/qasapipeline-${appName}"              dockerbuild.dockerBuild(harborHost, appName, dockerImage, gitTag, branchName)          } else if (deployEnv == "uata") {              println "预公布环境dockerBuild,dockerVersion为 ${gitTag}-${branchName}"              dockerImage = "pre_jinfu/uatapipeline-${appName}"              dockerbuild.dockerBuild(harborHost, appName, dockerImage, gitTag, branchName)          }      }  }  stage('deployToK8s') {      stage("${deployEnv}部署到测试环境k8s") {          script {              if (ifusek8s == "yes" && ServiceType == "java") {                  println "部署到${deployEnv}环境k8s,分支为 ${branchName}"                  projectName1 = "${deployEnv}pipeline-${appName}"                  dockerTag = "${gitTag}"                  usehost = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/${deployEnv}usehostip", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")                  println "${dockerTag}"                  sh "~/docker/scripts/install_insurance_standard.sh -a ${projectName1} -v ${dockerTag} -f ${profile} -p ${targetPort}  -t ${toPortuse} -m ${usehost}"              }          }      }  }}pipeline {  agent any  environment {      appPath = "/home/nfs/insurance/${domainzone}"      servicetype_node = sh(script: "curl -s http://172.16.188.27:9999/get_project_itme/${projectname}/service_type", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")  }  stages('nodejsBuild') {      stage('before-nodejsBuild-rm_dist') {          when { environment name: 'servicetype_node', value: "node" }          steps {              script {                  println "公布${deployEnv}环境,删除dist"                  sh "rm -rf dist.tar.gz"                  sh "rm -rf dist"              }          }      }        stage('nodejsBuild-for_docker') {          when { environment name: 'servicetype_node', value: "node" }          agent { docker 'harbor.reg/library/node:10.22.0' }          steps {              script {                  git branch: "${branchName}", credentialsId: "4a83a964-0fa4-4e2c-a448-2d40ed71d9a7", url: "${repoUrl}"                  println "公布${deployEnv}环境,容器中编译"                  sh "node -v && npm -v && npm config set registry http://172.16.196.111:8081/repository/npm-all/"                  sh "${build_sh}"                  stash includes: 'dist.tar.gz', name: 'app'              }          }      }            stage('部署到环境Nginx') {          when { environment name: 'servicetype_node', value: "node" }          steps {              unstash 'app'              sh "ls"              echo "${deployEnv} 环境nginx"              script {                  nginxIp = sh(script: "curl -s http://172.166.188.27:9999/get_project_itme/${projectname}/${deployEnv}usehostip", returnStdout: true).replaceAll("(\r\n|\r|\n|\n\r)", "").replace("\"", "")                  println "${nginxIp}"                  def remote = [:]                  remote.name = "server-${nginxIp}"                  remote.host = nginxIp                  remote.port = 22                  remote.allowAnyHosts = true                  withCredentials([sshUserPrivateKey(credentialsId: "jenkins-6-88-private-key", keyFileVariable: 'id_rsa', passphraseVariable: '', usernameVariable: 'userName')]) {                      remote.identityFile = id_rsa                      remote.user = userName                      // 须要留神的是,近程操作命令的作用域在withCredentials中,如果和用户名明码形式一样写在withCredentials外则会报错。                      sshCommand remote: remote, command: "if [ ! -d ${appPath} ]; then mkdir -p ${appPath}; fi && ls ${appPath}"                      sshPut remote: remote, from: "dist.tar.gz", into: "${appPath}"                      sshCommand remote: remote, command: "tar xf ${appPath}/dist.tar.gz -C ${appPath}/"                      sshRemove remote: remote, path: "${appPath}/dist.tar.gz"                  }              }          }      }  }}
#!/bin/bash#author:silence_ltx#date:20210127#describe: for env dev,sit,uat while getopts :a:v:f:p:t:m: opts; do    case $opts in        a) a=$OPTARG ;;        v) v=$OPTARG ;;        f) f=$OPTARG ;;        p) p=$OPTARG ;;        t) t=$OPTARG ;;        m) m=$OPTARG ;;        ?) ;;    esacdoneconfpath=~/docker/scripts/confrepo=harbor.reg/test_jinfuapp=$aversion=$vprofile=$fport=$ptoport=$tmaster_host=$myaml_host=http://192.168.66.88:8999#zk_servers=192.168.66.102:2181,192.168.66.104:2181,192.168.66.209:2181if [ "$port" = "" ];then  port=8080fiecho start to install:$repo/$app:$versioncd $confpathmkdir -p $app/$profilecat insurance-deploy-template_preproduct-web_k8s1.18.yaml | sed "s|#REPOSITORY_URL#|$repo|g" | sed "s|#APP_NAME#|$app|g" | sed "s|#APP_VERSION#|$version|g" | sed "s|#PROFILE#|$profile|g"| sed "s|#port#|$port|g"cat insurance-deploy-template_preproduct-web_k8s1.18.yaml | sed "s|#REPOSITORY_URL#|$repo|g" | sed "s|#APP_NAME#|$app|g" | sed "s|#APP_VERSION#|$version|g" | sed "s|#PROFILE#|$profile|g" | sed "s|#port#|$port|g"  > $app/$profile/deploy.yamlcat svc-template.yaml | sed "s|#APP_NAME#|$app|g"|sed "s|#PROFILE#|$profile|g" |sed "s|#port#|$port|g" |sed "s|#toport#|$toport|g"cat svc-template.yaml | sed "s|#APP_NAME#|$app|g"|sed "s|#PROFILE#|$profile|g" |sed "s|#port#|$port|g" |sed "s|#toport#|$toport|g" > $app/$profile/svc.yamlssh $master_host "kubectl delete deploy $app-$profile" ssh $master_host "kubectl apply -f $yaml_host/$app/$profile/deploy.yaml"ls  $confpath/$app/$profile/svc.yaml >/dev/null 2>&1 if [ $? -eq 0 ];then  #ssh $master_host "kubectl delete -f $yaml_host/$app/$profile/svc.yaml"  ssh $master_host "kubectl apply -f $yaml_host/$app/$profile/svc.yaml"fi

curl -s http://172.16.188.27:9999/get...${projectname}/${itme},能够取出数据库中我的项目的不同字段的信息 用于给不同我的项目的pipeline 文件带入我的项目信息

  • python3 调用python模块
    https://segmentfault.com/a/11...
  • 报警模块

    每个服务都有一个健康检查的接口,如果未启动会有机器人报警信息