简单的CICD部署脚本

#!/bin/bash

#================================================================
#   Copyright (C) 2021 . All rights reserved.
#   
#   文件名称:test1.sh
#   创 建 者:gan
#   创建日期:2021年08月12日
#   描    述:
#
#================================================================
set -ue
METHOD=$1
BRANCH=$2
GROUP=$3
PROJECT=app1
DATETIME=`date +"%F_%H-%M-%S"`
echo "当前方法是"${METHOD}
echo "当前分支是"${BRANCH}

function HOST_IP(){
    if [[ $GROUP == "GROUP1"  ]];then
      HOST_LIST="10.0.0.44"
    elif [[ $GROUP == "GROUP2" ]];then
      HOST_LIST="10.0.0.45 10.0.0.46"
    elif [[ $GROUP == "GROUP-ALL" ]];then
      HOST_LIST="10.0.0.44 10.0.0.45 10.0.0.46"
    fi
    echo "选择的服务器是$HOST_LIST"
}

function DEL_FROM_HAPROXY(){
  echo "正在从haproxy中摘除$HOST_LIST"
  for node in $HOST_LIST;do
     ssh root@10.0.0.47 "echo disable  server webport/$node | socat stdio /run/haproxy/admin.sock"
     ssh root@10.0.0.48 "echo disable  server webport/$node | socat stdio /run/haproxy/admin.sock"
  done
  echo "从haproxy中摘除完成"
}
function ADD_ON_HAPROXY(){
  local node=$1
  echo "正在haproxy中添加$node"
  ssh root@10.0.0.47 "echo enable  server webport/$node | socat stdio /run/haproxy/admin.sock"
  ssh root@10.0.0.48 "echo enable  server webport/$node | socat stdio /run/haproxy/admin.sock"
  echo "从haproxy中添加${node}完成"
}
function CODE_CLONE(){
  echo "开始从${BRANCH}分支克隆代码"
  cd /data/gitdata/magedu && rm -rf $PROJECT/
  if [[ $BRANCH == "main" ]];then
    git clone git@10.0.0.43:magedu/${PROJECT}.git
  elif [[ $BRANCH == "develop" ]];then
    git clone -b develop  git@10.0.0.43:magedu/${PROJECT}.git    
  fi
  echo "代码克隆完成"
}

function CODE_SCAN(){
echo "开始代码扫描"
cd /data/gitdata/magedu/${PROJECT}
/apps/sonar-scanner/bin/sonar-scanner
echo "代码扫描完成"
}



function TAR_FILE(){
   echo "开始打包"
   cd /data/gitdata/magedu
   cp -r  $PROJECT   ${PROJECT}-${DATETIME}
   zip -r ${PROJECT}-${DATETIME}.war ${PROJECT}-${DATETIME}
   rm -rf ${PROJECT}-${DATETIME}
   echo "打包完成"
}
function CODE_CP(){
   cd /data/gitdata/magedu
   for node in $HOST_LIST;do
    scp ${PROJECT}-${DATETIME}.war tomcat@${node}:/data/tomcat/tomcat_appdir/
    ssh tomcat@${node} "unzip /data/tomcat/tomcat_appdir/${PROJECT}-${DATETIME}.war -d /data/tomcat/tomcat_webdir/ && rm -rf /data/tomcat/tomcat_webapps/myapp && ln -s /data/tomcat/tomcat_webdir/${PROJECT}-${DATETIME} /data/tomcat/tomcat_webapps/myapp"
    echo "${node}${PROJECT}项目代码升级完成"
    DEL_OLD_DIR  $node 
   done
   rm -rf /data/gitdata/magedu/${PROJECT}*.war
}
function GET_TOMCAT_STATUS(){
  TOMCAT_STATUS=`ssh tomcat@${node} "ss -ntl | grep 8080 | grep LISTEN &> /tmp/tomcat.tmp;cat /tmp/tomcat.tmp"`
}
function STOP_TOMCAT(){
  for node in $HOST_LIST;do
    GET_TOMCAT_STATUS
    echo ${TOMCAT_STATUS}"huanghuang"
    if [[ $TOMCAT_STATUS == ""  ]];then
       echo $node"的tomcat已经关闭"
    fi
    ssh tomcat@${node} "/usr/local/tomcat/bin/catalina.sh stop"
    sleep 5;
    GET_TOMCAT_STATUS
    local  N=0
    while [[ $TOMCAT_STATUS != ""  ]];do
      if (( N>5  ));then
           echo  $node"的tomcat进程关闭失败"
           continue 2
      fi
      echo $node"的tomcat进程关闭失败,正在尝试重新关闭"
      ssh tomcat@${node} "/usr/local/tomcat/bin/catalina.sh stop"
      sleep 5;
      GET_TOMCAT_STATUS
      let N++
    done
    echo $node"的tomcat进程关闭成功"
  done
}
function START_TOMCAT(){
  for node in $HOST_LIST;do
    GET_TOMCAT_STATUS
    if [[ $TOMCAT_STATUS != ""  ]];then
       echo $node"的tomcat已经启动"
    fi
    ssh tomcat@${node} "/usr/local/tomcat/bin/catalina.sh start"
    sleep 5;
    GET_TOMCAT_STATUS
    local  N=0
    while [[ $TOMCAT_STATUS == ""  ]];do
      if (( N>5  ));then
           echo  $node"的tomcat进程开启失败"
           continue 2
      fi
      echo $node"的tomcat进程开启失败,正在尝试重新开启"
      ssh tomcat@${node} "/usr/local/tomcat/bin/catalina.sh start"
      sleep 5;
      GET_TOMCAT_STATUS
      let N++
    done
    echo $node"的tomcat进程开启成功"
  done
}
function WEBTEST(){
  for node in $HOST_LIST;do
     STATE=`curl -s  -I -m 10 -o /dev/null  -w %{http_code}  http://${node}:8080/myapp/index.html`
     if (( STATE == 200  ));then
        echo "$node的myapp服务测试成功,即将添加到负载"
        ADD_ON_HAPROXY $node 
     else
        echo "${node}测试失败"
     fi
  done
}
function DEL_OLD_DIR(){
  
  local node=$1
  local  array=(`ssh tomcat@10.0.0.44 "ls -d -r  /data/tomcat/tomcat_webdir/app1* > /tmp/tomcat_num.tmp;cat /tmp/tomcat_num.tmp"`)
  ssh tomcat@$node "rm -rf /data/tomcat/tomcat_appdir/*"
  for (( i=0;i<${#array[*]};i++  ));do
    if (( i>=5  ));then
         ssh tomcat@$node "rm -rf ${array[$i]}"
    fi                 
  done
  echo $node"节点上的旧版本数据删除完成"
}
function ROLLBACK-LASTVERSION(){
 for node in $HOST_LIST;do
 local NOWVERSION=`ssh tomcat@$node ls -l /data/tomcat/tomcat_webapps/myapp* | awk -F "->" '{print $2}' |xargs  basename`
 local STATE=`ssh tomcat@$node "ls /data/tomcat/tomcat_webdir/app1* &> /tmp/app1_state.tmp;cat /tmp/app1_state.tmp"`
 if [[ $STATE =~ ^.*cannot\ access.*$   ]];then
     echo "没有需要降级的文件"
     return 0
 fi   

 local  ARRAY=(`ssh tomcat@$node "ls /data/tomcat/tomcat_webdir/app1* -d -r"`)
 if [[ ${#ARRAY[*]} == 1 && ( "${ARRAY[0]}" > "$NOWVERSION" || "${ARRAY[0]}" == "$NOWVERSION"   )  ]];then
     echo "没有需要降级的文件"
     return 0
 fi
 for i in ${ARRAY[*]};do
   i=`basename $i`
   if [ "$i" \< "$NOWVERSION"  ];then
       echo "正在将${node}降级为版本$i"
       ssh tomcat@$node "rm -rf /data/tomcat/tomcat_webapps/myapp && ln -s /data/tomcat/tomcat_webdir/$i  /data/tomcat/tomcat_webapps/myapp"
       echo "降级成功"
       break 
   fi
 
 done

done

}
function main(){
  case $METHOD in 
   deploy)
HOST_IP
CODE_CLONE
#CODE_SCAN
TAR_FILE
DEL_FROM_HAPROXY
STOP_TOMCAT
CODE_CP
START_TOMCAT
WEBTEST
;;
  rollback-lastversion)
HOST_IP
DEL_FROM_HAPROXY
STOP_TOMCAT
ROLLBACK-LASTVERSION
START_TOMCAT
WEBTEST
;;
esac

}

main
<think>好的,我现在需要帮助用户了解如何在GitLab CI/CD中进行部署,并提供教程和配置示例。首先,我得回顾一下用户提供的引用内容,看看里面有没有相关的信息可以整合。 用户提到了引用[1]、[2]、[3]、[4],其中引用[3]详细介绍了GitLab CI/CD的工作流程、快速开始步骤以及示例,特别是部署Spring Boot和Maven应用的部分。引用[1]和[2]则解释了CI/CD的基本概念和GitLab CI/CD的作用,而引用[4]是关于配置Docker镜像源的命令,可能在部署过程中需要用到。 首先,我应该从基础开始,解释部署的基本流程。用户需要知道如何创建.gitlab-ci.yml文件,配置Runner,以及编写部署阶段的脚本。根据引用[3],创建.gitlab-ci.yml并推送到GitLab是关键步骤,同时需要配置Runner来执行任务。 然后,考虑不同的部署目标,比如SSH服务器、Kubernetes或者云服务。例如,SSH部署可能需要配置密钥和rsync命令,而Kubernetes部署可能需要kubectl和配置文件。引用[3]中的示例部分提到了部署到Kubernetes,可以借鉴这部分内容。 另外,用户可能需要具体的配置示例。比如,部署Spring Boot应用通常涉及构建JAR包,然后通过SSH传输到服务器。这里需要确保在.gitlab-ci.yml中定义正确的阶段,如build和deploy,并正确设置环境变量,如SSH_PRIVATE_KEY和SERVER_IP。 还要注意安全性问题,比如敏感信息(私钥)应该通过GitLab的CI/CD变量来存储,而不是硬编码在文件中。引用[3]提到配置Runner时需要注册,这可能需要设置执行环境,比如Docker或Shell。 另外,引用[4]中的Docker镜像源配置可能在构建Docker镜像时有用,特别是如果部署过程中需要拉取镜像或者构建镜像的话,配置国内镜像源可以加速过程。 用户可能还想知道如何查看部署的状态,引用[3]指出可以在GitLab的Pipeline界面查看pipeline和job的状态,这需要在回答中提到。 最后,生成相关问题,可能涉及部署的其他方面,比如环境变量管理、部署回滚、不同环境的配置差异等,这些问题可以帮助用户进一步探索。</think>### GitLab CI/CD 部署教程及配置示例 #### 1. 部署流程概述 GitLab CI/CD 的部署流程通过定义 `.gitlab-ci.yml` 文件实现自动化,主要包括以下步骤: 1. **代码提交**:触发 Pipeline 执行 2. **构建阶段**:编译代码或打包应用 3. **测试阶段**:运行自动化测试 4. **部署阶段**:将构建产物发布到目标环境(如服务器、Kubernetes 集群等) 引用 GitLab CI/CD 的核心原理是“通过 YAML 文件定义 Pipeline 的各个阶段”[^3]。 --- #### 2. 基础部署配置示例 以下是一个部署到 SSH 服务器的配置示例: ```yaml stages: - build - deploy build_job: stage: build image: maven:3.8.6 script: - mvn clean package artifacts: paths: - target/*.jar deploy_job: stage: deploy image: alpine:3.16 script: - apk add openssh-client rsync - eval $(ssh-agent -s) - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - - rsync -avz --progress target/*.jar user@server_ip:/deploy/path ``` **关键配置说明**: - `artifacts`:将构建产物传递给后续阶段 - `SSH_PRIVATE_KEY`:需在 GitLab 项目的 **Settings > CI/CD > Variables** 中配置 - 部署阶段使用轻量级 Alpine 镜像减少执行时间 --- #### 3. 部署到 Kubernetes 集群 ```yaml deploy_k8s: stage: deploy image: bitnami/kubectl:latest script: - kubectl config set-cluster my-cluster --server=$KUBE_SERVER - kubectl config set-credentials ci-user --token=$KUBE_TOKEN - kubectl apply -f deployment.yaml only: - main ``` **环境变量配置**: - `KUBE_SERVER`: Kubernetes API 地址 - `KUBE_TOKEN`: 服务账号 Token 建议通过 **Kubernetes 集成**自动配置集群连接[^3]。 --- #### 4. 部署优化技巧 1. **镜像加速**:在 Docker 构建阶段使用国内镜像源 ```yaml before_script: - echo 'registry-mirrors = ["https://mirrors.aliyun.com"]' > /etc/docker/daemon.json ``` 参考镜像加速配置方法[^4] 2. **部署回滚**:通过 `rollback` 阶段实现 ```yaml rollback_job: stage: deploy script: - kubectl rollout undo deployment/my-app when: manual ``` --- #### 5. 查看部署状态 在 GitLab 项目页面中: 1. 进入 **CI/CD > Pipelines** 查看整体状态 2. 点击具体 Job 查看部署日志 3. 通过 **Environments** 页面追踪部署历史 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值