DevOps-8: Ciclo de vida de desarrollo de requisitos y capacidades del sistema DevOps

Recientemente, resolví el proceso completo del proceso de desarrollo de requisitos completo anterior, así como el desarrollo secundario del sistema DevOps. Los puntos cubiertos en este proceso son principalmente todo el proceso desde la recepción de requisitos hasta completar los requisitos en línea.
Todo el proceso se muestra en la figura:
inserte la descripción de la imagen aquí


Explicación de los puntos clave:

1. El código está asociado con requisitos/tareas/errores

En ese momento, TAPD de Tencent se utilizó como plataforma de gestión de proyectos y desarrollo ágil. Esta plataforma tiene una función que admite el envío de gitlab asociado:
durante el envío del código durante el proceso de desarrollo, complete el comentario (incluido el ID de requisito, ID de error, etc. ) en el formato de TAPD y Enviar a la API de TAPD a través de un webhook. Nota: Puede configurar las reglas de envío en Gitlab, y es obligatorio que cada envío se ajuste a este formato, es decir, configure el enlace
debajo de la dirección de git de cada proyecto y consulte el final del artículo para ver el contenido de el archivo de gancho.custom_hooks/pre-receivepre-receive

2. Generar una solicitud de liberación

De acuerdo con 1, tenemos la relación de envío entre los requisitos y el código, luego en el sistema DevOps, si seleccionamos los requisitos o errores que se publicarán, podemos asociarlos automáticamente para obtener la cantidad de proyectos Git involucrados que deben ser liberado, entonces podemos:

  • Genere automáticamente solicitudes de liberación, incluidos todos los proyectos de Git asociados
    • Evite perder un proyecto o una rama de funciones al lanzar
  • Genere automáticamente una aplicación MR para cada proyecto de Git
  • Enviar automáticamente mensajes de notificación de MR a los revisores de código de estos proyectos GIt para su revisión
  • Envíe automáticamente mensajes para que los líderes de desarrollo de estos proyectos de Git los envíen para que los presten atención.
    • Genere automáticamente una lista de diferencias de prueba y configuración previa para cada proyecto de Git
    • Genere automáticamente una lista de diferencias en la estructura de la tabla para cada proyecto de Git correspondiente a la base de datos y el SQL de la base de datos de pincel.
    • La persona a cargo del desarrollo confirma los dos elementos anteriores, si debe enviarse a la persona a cargo de la operación y el mantenimiento para su procesamiento.
  • Envíe automáticamente las noticias para que se envíen al QA y al gerente de producto correspondientes a la demanda de atención.

3. Escaneo diario de la calidad del código

Debido a que la exploración del código lleva mucho tiempo, hemos optimizado la exploración del código desde la versión inicial para explorar los proyectos modificados una vez cada mañana, y sólo explorar las dos ramas de prueba y prod. Si la exploración falla, se prohibirá el proyecto correspondiente la próxima vez Publicado, y se envió una notificación de Dingding a la persona a cargo para solicitar la rectificación.
La herramienta de escaneo de código utilizada es Sonarqube, y la referencia de descripción del índice de calidad correspondiente: https://docs.sonarqube.org/latest/user-guide/metric-definitions/

Referencia de guiones relacionados

pre-receiveReferencia del contenido del documento

#!/bin/bash

while read oldVersion newVersion branch; do
#  read oldVersion newVersion branch
  echo "do pre-recievt: ${oldVersion}  ${newVersion}  ${branch}"

  # oldrev=`git rev-parse $oldVersion` # 获取该版本的sha1值,貌似多余,传入的参数就是sha1
  # newrev=`git rev-parse $newVersion`
  commitList=`git rev-list $oldVersion..$newVersion` # 获取新旧版本之间,提交了几个版本
  echo $commitList

  # 按空格分割字符串,并遍历
  for commitSha1 in $commitList
  do
    # 获取每次提交的log,正常情况下,log格式如下:
    # $ git cat-file commit 51ffa547167535fffb0f4b87d09022938f8d404b
    # tree ffd5876a90a555eedd605b0e2df606c83840437f
    # parent b78c620aa64b75e6f312a0541e59df3ad8bfca57
    # author youbl <[email protected]> 1557478996 +0800
    # committer youbl <[email protected]> 1557478996 +0800
    # 
    # 删除验证
    
    # sed '1,/^$/d'表示从第1行删除到第一个空行为止,剩下的就是log了
    msg=`git cat-file commit $commitSha1 | sed '1,/^$/d'`

    # 分支Merge,跳过
    match=`echo "$msg" | egrep 'Merge branch ' `
    if [ -n "$match" ];then continue; fi
    match=`echo "$msg" | egrep 'Merge remote-tracking branch ' `
    if [ -n "$match" ];then continue; fi
    match=`echo "$msg" | egrep '合并分支 ' `  # gitlab上发起的合并请求,会以“合并分支”开头
    if [ -n "$match" ];then continue; fi

    # 验证log是否匹配规则
    match=`echo "$msg" | egrep '\-\-story=[0-9]{7,}' `
    if [ -n "$match" ];then continue; fi
    match=`echo "$msg" | egrep '\-\-bug=[0-9]{7,}' `
    if [ -n "$match" ];then continue; fi
    match=`echo "$msg" | egrep '\-\-task=[0-9]{7,}' `
    if [ -n "$match" ];then continue; fi

    echo "!!! Your submit msg: $msg !!!($commitSha1)"
    echo !!! This submit must be related to tapd with id !!!
    exit 1
  done


# ===========================================================
# 如果要遍历提交的文件,用下面的代码
function eachFiles () {
  diff=`git diff --name-status $oldVersion $newVersion` # 获取2个版本之间,所有版本的差异文件列表,格式: M README.md D db/20181018.sql M db/full.sql A test.md
  echo $diff

  isDel=false
  # 按空格分割字符串,并遍历
  for file in $diff
  do
    if [ "$file" = "D" ];then
      isDel=true  # 删除的文件,要置标志位,忽略下一个遍历
    fi

    # echo ${#file}  # 输出字符串长度
    if [ "${#file}" -lt "2" ];then # 字符串长度小于1时跳过
      continue
    fi
    
    if [ "$isDel" = "true" ];then # 当前文件前面的标志是D,表示删除,不操作
      isDel=false
      continue
    fi

    echo $file
    # fileDiff=`git show $newVersion:$file` # 获取当前文件的内容
    # echo $fileDiff
  done
}

done

# echo !!!test prevent push!!!
exit 0

Tareas de temporización: referencia de script sh para agregar ganchos a nuevos proyectos

Debido a que cada proyecto de git debe agregar el archivo de enlace anterior, cuando el usuario cree un nuevo proyecto de git, no habrá tal enlace, por lo que se necesita una secuencia de comandos para atravesar el nuevo proyecto y agregar el enlace.En el crontab de Linux,
especifique Ejecute el siguiente script cada hora.

#!/bin/bash

function eachGitDir(){
  for ele in `ls $1`
  do
    subdir="$1/$ele"

    if [ ! -d $subdir ];then continue; fi # 不是目录,跳过

    if [[ $subdir == "/data/gitlab/data/git-data/repositories/Frontend" ]]; then continue; fi # 跳过前端内部项目
    if [[ $ele == "boot" ]]; then continue; fi # 跳过boot项目
    if [[ $ele == "ops" ]]; then continue; fi
    if [[ $ele == "tests" ]]; then continue; fi
    if [[ $ele == *".wiki.git" ]]; then continue; fi
    if [[ $ele == "ToolsProject.git" ]]; then continue; fi # 跳过Tools项目

    if [[ $ele != *".git" ]]; then 
      eachGitDir $subdir
      continue
    fi # 不是git目录,递归
    
    hookdir=$subdir/custom_hooks
    if [ ! -d $hookdir ];then mkdir $hookdir; fi
    hookfile=$hookdir/pre-receive
    if [ -e $hookfile ];then continue; fi # 文件存在,不处理
    `/usr/bin/cp /root/hooks/pre-receive $hookfile`
    echo $hookdir

  done
}

# repository="/root/tmp"
repository="/data/gitlab/data/git-data/repositories"
eachGitDir $repository

Gancho para borrar todos los elementos

A veces, necesita limpiar todos los enlaces del proyecto y reconfigurar, puede usar este script:

#!/bin/bash

function eachGitDir(){
  for ele in `ls $1`
  do
    subdir="$1/$ele"

    if [ ! -d $subdir ];then continue; fi # 不是目录,跳过

    if [[ $ele != *".git" ]]; then 
      eachGitDir $subdir
      continue
    fi # 不是git目录,递归

    hookdir=$subdir/custom_hooks

    if [ ! -d $hookdir ];then continue; fi
    hookfile=$hookdir/pre-receive
    if [ ! -e $hookfile ];then 
      `rmdir $hookdir`
      continue
    fi # 文件不存在,不处理
    `rm -f $hookfile`
    `rmdir $hookdir`
    echo "deleted $hookfile"

  done
}

# repository="/root/tmp"
repository="/data/gitlab/data/git-data/repositories"
eachGitDir $repository

Borrar el gancho para el elemento especificado

A veces, necesita limpiar el gancho del elemento especificado, y es demasiado perezoso para encontrar el directorio y eliminarlo. Puede usar este script:

#!/bin/bash

function eachGitDir(){
  for ele in `ls $1`
  do
    subdir="$1/$ele"

    if [ ! -d $subdir ];then continue; fi # 不是目录,跳过

    if [[ $ele != *".git" ]]; then
      eachGitDir $subdir
      continue
    fi # 不是git目录,递归
    
    processHook $subdir
  done
}

function processHook(){
  subdir=$1
  hookdir=$subdir/custom_hooks

  if [ ! -d $hookdir ];then continue; fi
  hookfile=$hookdir/pre-receive
  if [ ! -e $hookfile ];then
    `rmdir $hookdir`
    echo "rmdir $hookdir"
  else
    `rm -f $hookfile`
    `rmdir $hookdir`
    echo "deleted $hookfile"
  fi
}

ele=$1
if [ "${#ele}" -lt "1" ];then # 字符串长度小于1时跳过
  echo 参数不能为空
  exit 1
fi

# 移除前面的http协议和域名
if [[ $ele = http* ]]; then
  ele=`echo $ele | cut -d/ -f4-`
fi

ele="/data/gitlab/data/git-data/repositories/$ele"
if [ ! -d $ele ];then
  ele=$ele".git";
  if [ ! -d $ele ];then
    echo "目录不存在: $ele"
    exit 1
  fi
fi

# echo $ele
if [[ $ele != *".git" ]]; then
  eachGitDir $ele
else
  processHook $ele
fi

Supongo que te gusta

Origin blog.csdn.net/youbl/article/details/129436790
Recomendado
Clasificación