Демонстрационные скрипты для анализа Polyspace с Дженкинсом

В непрерывном процессе интеграции разработчики представляют код общему репозиторию. Автоматизированная система сборки с помощью инструмента, такого как Дженкинс создает и тестирует каждое представление равномерно или на основе предопределенных триггеров и интегрирует код. Можно запустить Polyspace® анализ как часть этого процесса.

Эта тема предоставляет демонстрационные Сценарии оболочки, которые запускают аналитическое использование Polyspace Polyspace Bug Finder™ Server™ и загружают результаты для анализа в Polyspace доступ к веб-интерфейсу. Скрипт также отправляет уведомления по электронной почте потенциальным рецензентам. Уведомленные рецензенты могут войти в систему к Polyspace доступ к веб-интерфейсу (если у них есть лицензия Polyspace Bug Finder Access™), и рассмотрите результаты.

Расширение демонстрационных скриптов к процессу разработки

Скрипты записаны для определенного набора инструментальных средств разработки, но могут быть легко расширены к процессам, используемым в вашем проекте, команде или организации. Скрипты также предназначены, чтобы быть запущенными в вольном проекте Дженкинса. Если вы используете Трубопроводы Дженкинса, смотрите Выборку Скрипты Трубопровода Дженкинса для Анализа Polyspace.

В частности, скрипты:

  • Работайте на Linux® только.

    Скрипты используют некоторые специфичные для Linux команды, такие как export. Однако эти команды не являются неотъемлемой частью рабочего процесса Polyspace. Если вы пишете Windows® скрипты (.bat файлы), используйте эквивалентные команды Windows вместо этого.

  • Работа только с Дженкинсом после того, как вы устанавливаете плагин Polyspace.

    Скрипты спроектированы для плагина Дженкинса этими двумя способами:

    • Скрипты используют функции помощника $ps_helper и $ps_helper_access для более простых сценариев. Помощник функционирует результаты Polyspace экспорта для почтовых прикреплений и утилит командной строки использования, чтобы отфильтровать результаты.

      Эти функции помощника доступны только с плагином Дженкинса. Однако базовые команды идут с установкой Polyspace Bug Finder Server. На инструментах автоматизации сборки кроме Дженкинса можно создать эти функции помощника с помощью polyspace-report-generator команда или polyspace-access команда (с -export опция). Смотрите Отправляют Уведомления по электронной почте Результатами Polyspace Bug Finder Server.

      Если вы выполняете распределенную сборку в Дженкинсе, плагин должен быть установлен в той же папке в той же операционной системе и на главном узле и на узле агента, выполняющем анализ Polyspace. В противном случае вы не можете использовать функции помощника.

    • Скрипты создают текстовые файлы для почтовых прикреплений и почтовых предметов и тел для персонализированных электронных писем. Если вы устанавливаете плагин Polyspace в Дженкинсе, расширение почтового плагина доступно для использования в ваших проектах Дженкинса. Почтовый плагин позволяет вам легко посылать персонализированные электронные письма с ранее созданными предметами, телами и прикреплениями. Без плагина Polyspace необходимо найти альтернативный способ послать электронные письма.

  • Запустите анализ Bug Finder.

    Скрипты запускают Bug Finder на демонстрационном примере Bug_Finder_Example. Если вы устанавливаете продукт Polyspace Bug Finder Server, папкой, содержащей демонстрационный пример, является polyspaceserverroot/polyspace/examples/cxx/Bug_Finder_Example. Здесь, polyspaceserverroot папка установки для Серверных продуктов Polyspace, например, /usr/local/Polyspace Server/R2019a/.

    Можно легко адаптировать скрипт, чтобы запустить Code Prover. Замените polyspace-bug-finder-server с polyspace-code-prover-server. Можно использовать демонстрационный пример Code_Prover_Example в частности предназначенный для Code Prover.

Необходимые условия

Чтобы запустить анализ Polyspace сервера и рассмотреть результаты в Polyspace доступ к веб-интерфейсу, необходимо выполнить одноразовую настройку.

  • Чтобы запустить анализ, необходимо установить один экземпляр Серверного продукта Polyspace.

  • Чтобы загрузить результаты, необходимо настроить компоненты, требуемые размещать веб-интерфейс Polyspace доступ.

  • Чтобы просмотреть загруженные результаты, у вас (и каждый разработчик, рассматривающий результаты), должна быть одна лицензия Polyspace.

Подобные требования применяются к анализу Polyspace Code Prover™ сервера.

Смотрите сервер Polyspace установки и доступ к продуктам.

Чтобы установить плагин Polyspace, в интерфейсе Дженкинса, выбирают Manage Jenkins слева. Выберите Manage Plugin. Ищите плагин Polyspace и затем загрузите и установите плагин.

Настройте плагин Polyspace в Дженкинсе

Следующие шаги обрисовывают в общих чертах, как настроить анализ Polyspace в Дженкинсе после установки плагина Polyspace. Обратите внимание на то, что шаги относятся к версии 2.150.1 Дженкинса. Шаги в вашей версии Дженкинса и вашей установке плагина Polyspace могут немного отличаться.

Если вы используете различный инструмент автоматизации сборки, можно выполнить подобные шаги настройки.

Задайте пути к командам Polyspace и деталям сервера для Polyspace доступ к веб-интерфейсу

Задайте полные пути папки, содержащей команды Polyspace и имя хоста и номер порта сервера, размещающего Polyspace доступ к веб-интерфейсу. После того, как вы зададите пути в ваших скриптах, вы не должны использовать полные пути для команд или деталей сервера для загрузки результатов.

  1. В интерфейсе Дженкинса выберите Manage Jenkins слева. Выберите Configure System.

  2. В разделе Polyspace задайте следующее:

    • Пути к командам Polyspace.

      Путь относится к polyspaceserverroot/polyspace/bin, где polyspaceserverroot папка установки для Серверных продуктов Polyspace, например, /usr/local/Polyspace Server/R2019a/.

    • Имя хоста, номер порта и протокол (http или https) используемый сервером, размещающим Polyspace доступ к веб-интерфейсу.

    Поле Name позволяет вам задавать удобное сокращение, которое вы используете позже в проектах Дженкинса.

  3. В разделе E-mail Notification задайте сервер SMTP своей компании (и другие детали, необходимые для отправки электронных писем).

Создайте проект Дженкинса для рабочего Polyspace

Когда вы создаете проект Дженкинса (например, Вольный проект), можно обратиться к путям к Polyspace глобальными сокращениями, которые вы задали ранее.

Создать проект Дженкинса для рабочего Polyspace:

  1. В интерфейсе Дженкинса выберите New Item слева. Выберите Freestyle Project.

  2. В разделе Build Environment проекта введите два кратких имени, которые вы задали ранее:

    • Имя для пути к папке, содержащей команды Polyspace

    • Имя для деталей сервера, размещающего Polyspace доступ к веб-интерфейсу.

    Кроме того, введите вход в систему и пароль, который может использоваться, чтобы загрузить на Polyspace доступ к веб-интерфейсу. Вход в систему и пароль должны быть сопоставлены с лицензией Polyspace Bug Finder Access.

  3. В разделе Build проекта можно ввести скрипты, которые используют команды Polyspace и детали сервера, размещающего Polyspace доступ к веб-интерфейсу. Скрипты запускают анализ Polyspace и загружают результаты на Polyspace доступ к веб-интерфейсу.

  4. В разделе Post-build Actions проекта сконфигурируйте адреса электронной почты и прикрепления, которые будут отправлены после анализа.

Скрипт, чтобы запустить Bug Finder, результаты загрузки и отправить общее уведомление

Этот скрипт запускает анализ Bug Finder, загружает результаты и экспортирует дефекты с высоким ударом для общего уведомления по электронной почте всем получателям.

Скрипт принимает, что текущая папка содержит папку sources с .c файлы. В противном случае измените линию gcc -c sources/*.c с полным путем к источникам.

set -e
export RESULT=ResultBF
export PROG=Bug_Finder_Example
export PARENT_PROJECT=/public/BugFinderExample_PRS_01

# ================================================================
# Trace build command and create an options file

build_cmd="gcc -c sources/*.c"
polyspace-configure \
      -allow-overwrite \
      -allow-build-error \
      -prog $PROG \
      -author jenkins \
      -output-options-file $PROG.psopts \
      $build_cmd


# ================================================================
# Run Bug Finder on the options file

polyspace-bug-finder-server -options-file $PROG.psopts -results-dir $RESULT

# ================================================================
# Upload results to Polyspace Access web interface

$ps_helper_access -create-project $PARENT_PROJECT
$ps_helper_access \
      -upload $RESULT \
      -parent-project $PARENT_PROJECT \
      -project $PROG

# ================================================================
# Export results filtered for defects with "High" impact

$ps_helper_access \
      -export $PARENT_PROJECT/$PROG \
      -output Results_All.tsv \
      -defects High

# ================================================================
# Finalize Jenkins status

exit 0

После того, как скрипт запущен, можно создать действие постсборки, чтобы послать электронное письмо всем получателям с экспортируемым файлом Results_All.tsv.

В этом скрипте, $ps_helper_access сокращение для polyspace-access команда с опциями, задающими имя хоста, порт, вход в систему и зашифрованный пароль, включена. Другой polyspace-access опции явным образом написаны в скрипте.

Скрипт, чтобы запустить Bug Finder, результаты загрузки и отправить персонализированное уведомление

Этот скрипт запускает предыдущий анализ Bug Finder и загружает результаты. Однако скрипт отличается от предыдущего скрипта этими способами:

  • Скрипт использует run_command функция, которая распечатывает сообщение при выполнении команды. Функция помогает определить из консоли выход, который запускает часть скрипта.

  • При экспорте результатов скрипт создает отдельный файл результатов для различных владельцев.

    • Основной файл Results_All.tsv содержит все результаты. Этот файл отправляется в почтовом прикреплении менеджеру. Электронная почта менеджера сконфигурирована на шаге постсборки.

      Если файл содержит больше чем 10 дефектов, состояние сборки рассматривается как отказ. Скрипт отправляет состояние UNSTABLE в уведомлении по электронной почте.

    • Файл результатов Results_Users_userA.tsv экспортируемый для userA содержит дефекты от Программирования группы и с ударом Высоко.

      Этот файл результата отправляется в почтовом прикреплении в userA.

    • Файл результатов Results_Users_userB.tsv экспортируемый для userB содержит дефекты от функционального bug_memstdlib().

      Этот файл результата отправляется в почтовом прикреплении в userB.

  • Предмет отдельного почтового отправления создается для менеджера в файле mailsubject_manager.txt и для пользователей userA и userB в файлах mailsubject_user_userA.txt и mailsubject_user_userB.txt соответственно.

    Почтовое тело создается для электронной почты менеджеру в файле mailbody_manager.txt.

Скрипт:

  • Принимает, что текущая папка содержит папку sources с .c файлы.

    В противном случае измените линию gcc -c sources/*.c с полным путем к источникам.

  • Принимает пользователей под названием userA и userB. В частности, адреса электронной почты userA@companyname.com и userB@companyname.com (определенный из имени пользователя и сервера SMTP сконфигурировал ранее), должны быть действительные адреса электронной почты.

    Замените имена на имена реального пользователя.

set -e
export RESULT=ResultBF
export PROG=Bug_Finder_Example
export REPORT=Results_List.tsv


# ================================================================
# Define function to print message while running command
run_command()
{
# $1 is a message
# $2 $3 ... is the command to dump and to run
message=$1
shift
cat >> mailbody_manager.txt << EOF
$(date): $message

EOF
"$@"
}

# ================================================================
# Initialize mail body
cat > mailbody_manager.txt << EOF
Dear Manager(s)

Here is the report of the Jenkins Job ${JOB_NAME} #${BUILD_NUMBER}
It contains all Red Defect found in Bug Finder Example project

EOF

# ================================================================
# Trace build command and create options file

build_cmd="gcc -c sources/*.c"
run_command "Tracing build command",               \
            polyspace-configure                   \
                -allow-overwrite                  \
                -allow-build-error                \
                -prog $PROG                       \
                -author jenkins                   \
                -output-options-file $PROG.psopts \
                    $build_cmd

# ================================================================
# Run Bug Finder on the options file

run_command "Running Bug finder" \
            polyspace-bug-finder-server -options-file $PROG.psopts -results-dir $RESULT



# ================================================================
# Upload results to Polyspace Access web interface

run_command "Creating Project $PARENT_PROJECT" \
  $ps_helper_access -create-project $PARENT_PROJECT

run_command "Uploading on $PARENT_PROJECT/$PROG" \
  $ps_helper_access \
        -upload $RESULT \
        -parent-project $PARENT_PROJECT \
        -project $PROG \
        -output upload.output
PROJECT_RUNID=$($ps_helper prs_print_runid upload.output)
PROJECT_URL=$($ps_helper prs_print_projecturl upload.output $POLYSPACE_ACCESS_URL)

# ================================================================
# Export report

run_command "Exporting report from $PARENT_PROJECT/$PROG" \
  $ps_helper_access \
        -export $PROJECT_RUNID \
        -output $REPORT \
        -defects High


# ================================================================
# Filter Reports

run_command "Filtering reports for defects" \
            $ps_helper report_filter \
                $REPORT \
                Results_All.tsv \
                Family Defect \


# ================================================================
# Filter Reports for userA and userB

run_command "Filtering Reports for userA: Group=='Programming' and Information=='Impact: High'" \
            $ps_helper report_filter \
                $REPORT \
                Results_Users.tsv \
                userA \
                Group Programming \
                Information "Impact: High"
run_command "Filtering Reports for userB: Function=='bug_memstdlib()'" \
            $ps_helper report_filter \
                $REPORT \
                Results_Users.tsv \
                userB \
                Function "bug_memstdlib()"


# ================================================================
# Update Jenkins status
# Jenkins build status is unstable when there are more than 10 Defects

BUILD_STATUS=$($ps_helper report_status Results_All.tsv 10)

# ================================================================
# Update mail body and mail subject

NB_FINDINGS_ALL=$($ps_helper report_count_findings Results_All.tsv)
NB_FINDINGS_USERA=$($ps_helper report_count_findings Results_Users_userA.tsv)
NB_FINDINGS_USERB=$($ps_helper report_count_findings Results_Users_userB.tsv)
cat >> mailbody_manager.txt << EOF

Number of defects: $NB_FINDINGS_ALL
Number of findings owned by userA: $NB_FINDINGS_USERA
Number of findings owned by userB: $NB_FINDINGS_USERB

All results are uploaded in: $PROJECT_URL

Build Status: $BUILD_STATUS

EOF

cat >> mailsubject_manager.txt << EOF
Jenkins for Manager - Polyspace run completed with status $BUILD_STATUS and $NB_FINDINGS_ALL findings
EOF

for user in userA userB
do
  echo "Jenkins for $user - $($ps_helper report_count_findings Results_Users_$user.tsv)) findings" > mailsubject_user_$user.txt
done



# ================================================================
# Exit with correct build status

[ "$BUILD_STATUS" != "SUCCESS" ] && exit 129
exit 0

После того, как скрипт запущен, можно создать действие постсборки, чтобы послать электронное письмо менеджеру с экспортируемым файлом Results_All.tsv. Задайте адрес электронной почты в поле Recipients, почтовый предмет в поле Mail Subject и почтовое тело в поле Mail Body.

Кроме того, отдельное электронное письмо послано userA и userB с файлами Results_Users_userA.tsv и Results_Users_userB.tsv в прикреплении (и содержимое mailsubject_user_userA.txt и mailsubject_user_userB.txt когда почта подвергает). Адресами электронной почты является userA@companyname.com и userB@companyname.com (определенный из имени пользователя и сервера SMTP сконфигурировал ранее).

Скрипт использует функцию помощника $ps_helper отфильтровать результаты на основе группы, удара и функции. Функция помощника использует утилиты командной строки, чтобы отфильтровать основной файл для результатов и выполнить действия те, которые создают отдельный файл результатов для каждого владельца. Функция принимает эти меры в качестве аргументов:

  • report_filter: Фильтры следуют из файла экспортированного текста на основе содержимого текстового файла.

    Например:

    $ps_helper report_filter \
                    Results_List.tsv \
                    Results_Users.tsv \
                    userA \
                    Group Programming \
                    Information "Impact: High"
    читает файл Results_List.tsv и записи к файлу Results_Users_userA.tsv. Текстовый файл Results_List.tsv содержит столбцы для Group и Information. Только те строки, где Group столбец содержит Programming и Information столбец содержит Impact: High записаны в файл Results_Users_userA.tsv.

  • report_status: Возвращает UNSTABLE или SUCCESS на основе количества результатов в файле.

    Например:

    BUILD_STATUS=$($ps_helper report_status Results_All.tsv 10))
    возвращает UNSTABLE если файл Results_All.tsv содержит больше чем 10 результатов (10 строк).

  • report_count_findings: Количество отчетов результатов в файле.

    Например:

    NB_FINDINGS_ALL=$($ps_helper report_count_findings Results_All.tsv)
    возвращает количество результатов (строки) в файле Results_All.tsv.

  • prs_print_projecturl: Использует имя хоста и номер порта, чтобы создать URL Polyspace доступ к веб-интерфейсу.

    Например:

    PROJECT_URL=$($ps_helper prs_print_projecturl Results_All.tsv $POLYSPACE_ACCESS_URL)
    
    читает файл Results_All.tsv (экспортируемый polyspace-access команда) и извлечения URL Polyspace доступ к веб-интерфейсу в $POLYSPACE_ACCESS_URL и URL текущего проекта в $PROJECT_URL.

Смотрите также

| (Polyspace Code Prover) | | |

Похожие темы