Статьи

Перенос данных гидролокатора из старой в новую версию гидролокатора

В моем текущем проекте мы настраивали новый сервер сборки. Одна из вещей, которую мы должны были сделать, — переместить старую реализацию сонара, работающую поверх H2, в новую версию, работающую на Oracle. Проблема заключалась в том, что просто перенести данные практически невозможно, когда вы начинаете с H2, и когда версии были так далеко друг от друга, как в нашем случае. В ходе некоторых исследований мы наткнулись на следующую страницу Gist миграции, показывающую возможный путь миграции: https://gist.github.com/aslakknutsen/2422117

Пример сценария на этой странице заключается в том, что он извлекает все теги из репозитория Git и просто запускает maven и плагин сонара для пополнения нового сонара. С помощью нескольких дополнений и изменений нам удалось запустить его для нашего сценария и мы смогли пополнить наш новый гидролокатор историческими данными:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Based on: https://gist.github.com/aslakknutsen/2422117
GIT_REPO=$1
START_TAG=$2
  
MVN_COMMAND="mvn clean install -fn"
SONAR_COMMAND="mvn org.codehaus.sonar:sonar-maven3-plugin:3.7:sonar"
  
if [ -z "$GIT_REPO" ]; then
    echo "Missing program argument: repository"
    echo "Usage: ./sonar_history.sh git_repository_path [start-tag]"
    exit
fi
  
pushd $GIT_REPO
  
# set these for partial imports
done=0
skip=0
toProcess=100
  
for tag in `git for-each-ref --format="%(taggerdate): %(refname)" --sort=taggerdate | grep -iv ^: | cut -d " " -f 7 | cut -c 11- | grep -i <release-prefix>`
do
    echo $tag
    if [ $((done - skip)) -eq "$toProcess" ]; then
      break
    fi
      
    if [[ -n "$START_TAG" && "$START_TAG" > "$tag" ]] ; then
        echo "Skipping $tag (start tag $START_TAG)"
        continue
    fi
  
    if [ "$done" -ge "$skip" ]; then
      TAG_DATE=`git show $tag --date=iso | grep Date: -m1 | cut -d' ' -f 4`
      echo "Checking out source from $TAG_DATE tagged as $tag"
  
      # we force a complete cleanup each time
      git fetch --all
      git reset --hard origin/master
      git checkout -f $tag
      git clean -df
  
      SONAR_PROJECT_COMMAND="$SONAR_COMMAND -Dsonar.projectDate=$TAG_DATE -Dsonar.jdbc.url=jdbc:oracle:thin:@<host>:1521:DBELBLD -Dsonar.jdbc.username=<username> -Dsonar.jdbc.password=<password>"
  
      echo "Executing Maven: $MVN_COMMAND"
      $MVN_COMMAND
  
      # not all files have the correct version set, which messes up the push to sonar
      # replace the version with the release property for correct processing
      sed -i -- "s/<version>00_00_00-SNAPSHOT<\/version>/<version>$tag<\/version>/g" pom.xml
  
      echo "Executing Sonar: $SONAR_PROJECT_COMMAND"
      $SONAR_PROJECT_COMMAND
    fi
  
    done=$((done+1))
done
popd

Приведенный выше код был запущен с SonarQube 4.5.2, но также должен работать с SonarQube 5.x.