GitLab ұнайды ма және қателерді жек көресіз бе? Бастапқы кодтың сапасын жақсартқыңыз келе ме? Сонда сіз дұрыс жерге келдіңіз. Бүгін біз біріктіру сұрауларын тексеру үшін PVS-Studio C# анализаторын қалай конфигурациялау керектігін айтамыз. Бір мүйізді көңіл-күй және барлығына бақытты оқу болсын.
Айтпақшы, біз PVS-Studio 7.08 шығардық, онда біз көп нәрсе жасадық.
- Linux және macOS үшін C# анализаторы;
- Rider үшін плагин;
- жаңа файлдар тізімін тексеру режимі.
Файлдар тізімін тексеру режимі
Бұрын белгілі бір файлдарды тексеру үшін анализаторға файлдар тізімі бар .xml жіберу қажет болатын. Бірақ бұл өте ыңғайлы болмағандықтан, біз .txt жіберу мүмкіндігін қостық, бұл өмірді өте қарапайым етеді.
Арнайы файлдарды тексеру үшін жалаушаны көрсету керек --sourceFiles (-f) және файлдар тізімімен .txt файлын тасымалдаңыз. Бұл келесідей көрінеді:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
Тапсырманы тексеруді немесе сұрауларды тартуды орнатуға қызығушылық танытсаңыз, оны осы режим арқылы да жасауға болады. Айырмашылық талдау үшін файлдар тізімін алуда болады және сіз қандай жүйелерді пайдаланып жатқаныңызға байланысты болады.
Біріктіру сұрауын тексеру принципі
Тексерудің негізгі мәні біріктіру кезінде анализатор анықтаған мәселелердің мастер филиалы. Біз сондай-ақ барлық жобаны әр уақытта талдағымыз келмейді. Сонымен қатар, филиалдарды біріктіру кезінде бізде өзгертілген файлдар тізімі болады. Сондықтан біріктіру сұрауын тексеруді қосуды ұсынамын.
Статикалық анализаторды іске қоспас бұрын біріктіру сұрауы осылай көрінеді:
Яғни, филиалда болған барлық қателер өзгерістер, негізгі филиалға ауысады. Біз мұны қаламайтындықтан, талдауды қосамыз, енді диаграмма келесідей болады:
Талдау өзгерістер2 және, егер қателер болмаса, біріктіру сұрауын қабылдаймыз, әйтпесе оны қабылдамаймыз.
Айтпақшы, егер сіз C/C++ үшін тапсырмаларды талдауға және сұрауларды тартуға қызығушылық танытсаңыз, онда сіз бұл туралы оқи аласыз.
GitLab
Біріктіру сұрауларын талдауды бастамас бұрын, жобаңызды тіркеу және жүктеп салу қажет. Егер сіз мұны қалай жасау керектігін білмесеңіз, мен ұсынамын
ескерту. Төменде сипатталған ортаны орнату әдісі ықтимал әдістердің бірі болып табылады. Мақсат - анализаторды іске қосу және талдау үшін қажетті ортаны орнату қадамдарын көрсету. Мүмкін сіздің жағдайыңызда ортаны дайындау (репозитарийлерді қосу, анализаторды орнату) және талдау кезеңдерін бөлу оңтайлы болар еді: мысалы, қажетті ортамен Docker кескіндерін дайындау және оларды пайдалану немесе басқа әдіс.
Енді не болатынын жақсы түсіну үшін келесі диаграмманы қарауды ұсынамын:
Талдағыш жұмыс істеуі үшін .NET Core SDK 3 қажет, сондықтан анализаторды орнатпас бұрын анализаторға қажетті тәуелділіктер орнатылатын Microsoft репозитарийлерін қосу керек. Әр түрлі Linux дистрибутивтері үшін Microsoft репозиторийлерін қосу
PVS-Studio бағдарламасын бума менеджері арқылы орнату үшін сізге PVS-Studio репозиторийлерін де қосу қажет. Әртүрлі таратулар үшін репозиторийлерді қосу бөлімінде толығырақ сипатталған
Анализатор жұмыс істеу үшін лицензиялық кілтті қажет етеді. Сынақ лицензиясын мына жерден ала аласыз
ескерту. Сипатталған жұмыс режимі (біріктіру сұрауларын талдау) Кәсіпорын лицензиясын қажет ететінін ескеріңіз. Сондықтан, егер сіз осы жұмыс режимін қолданғыңыз келсе, «Хабар» өрісінде сізге кәсіпорын лицензиясы қажет екенін көрсетуді ұмытпаңыз.
Біріктіру сұрауы орын алса, біз тек өзгертілген файлдар тізімін талдауымыз керек, әйтпесе барлық файлдарды талдаймыз. Талдаудан кейін журналдарды қажетті форматқа түрлендіру керек.
Енді сіздің көз алдыңызда жұмыс алгоритмі бола отырып, сценарий жазуға көшуге болады. Ол үшін файлды өзгерту керек .gitlab-ci.yml немесе, егер ол жоқ болса, оны жасаңыз. Оны жасау үшін жобаңыздың атын -> басу керек CI/CD орнатыңыз.
Енді сценарий жазуға дайынбыз. Алдымен анализаторды орнататын кодты жазып, лицензияны енгізейік:
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
Орнату және белсендіру барлық басқа сценарийлерден бұрын болуы керек болғандықтан, біз арнайы белгіні қолданамыз алдында_скрипт. Осы үзіндіні аздап түсіндірейін.
Анализаторды орнатуға дайындық:
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
PVS-Studio репозиторийлері мен анализаторын қосу:
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
Лицензияны белсендіру:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - Қолданушының аты.
$PVS_KEY - өнімнің кілті.
Жобаға тәуелділіктерді қалпына келтіру $CI_PROJECT_DIR – жоба каталогына толық жол:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
Дұрыс талдау үшін жоба сәтті құрылуы керек және оның тәуелділіктері қалпына келтірілуі керек (мысалы, қажетті NuGet бумаларын жүктеп алу керек).
Лицензия ақпаратын қамтитын орта айнымалы мәндерін басу арқылы орнатуға болады параметр, және кейін - қосу CI/CD.
Ашылған терезеде элементті табыңыз Айнымалылар, оң жақтағы түймені басыңыз кеңейту және айнымалыларды қосыңыз. Нәтиже келесідей болуы керек:
Енді талдауға көшуге болады. Алдымен, толық талдау үшін сценарийді қосамыз. Туға -t тудың шешіміне апаратын жолды өтеміз -o талдау нәтижелері жазылатын файлдың жолын жазыңыз. Бізді қайтару коды да қызықтырады. Бұл жағдайда біз қайтару кодында талдау кезінде ескертулер берілгені туралы ақпарат болған кезде операцияның тоқтатылуына мүдделіміз. Бұл фрагмент келесідей көрінеді:
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Қайтару кодтары бит маскасы принципі бойынша жұмыс істейді. Мысалы, талдау нәтижесінде ескертулер берілген болса, онда қайтару коды 8-ге тең болады. Егер лицензияның мерзімі бір ай ішінде аяқталса, қайтару коды 4-ке тең болады. Талдау кезінде қателер анықталса, және лицензияның мерзімі бір ай ішінде аяқталады, қайтарылатын код, екі мән де жазылады: сандарды қосып, соңғы қайтару кодын алыңыз - 8+4=12. Осылайша, сәйкес биттерді тексеру арқылы талдау кезінде әртүрлі күйлер туралы ақпаратты алуға болады. Қайтару кодтары құжаттың "pvs-studio-dotnet (Linux / macOS) қайтару кодтары" бөлімінде толығырақ сипатталған.
Бұл жағдайда бізді 8 пайда болатын барлық қайтару кодтары қызықтырады.
- exit_code=$((($exit_code & 8)/8))
Қайтару кодында бізді қызықтыратын санның биті болған кезде біз 1 аламыз, әйтпесе біз 0 аламыз.
Біріктіру сұрауының талдауын қосу уақыты келді. Мұны жасамас бұрын, сценарийге орын дайындап алайық. Біз оны біріктіру сұрауы пайда болған кезде ғана орындауымыз керек. Бұл келесідей көрінеді:
merge:
script:
only:
- merge_requests
Сценарийдің өзіне көшейік. Мен виртуалды машинаның ештеңе білмейтініне тап болдым бастау/шебер. Ендеше оған аздап көмектесейік:
- git fetch origin
Енді біз филиалдар арасындағы айырмашылықты аламыз және нәтижені сақтаймыз TXT файл:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
Қайда? $CI_COMMIT_SHA – соңғы міндеттеменің хэші.
Әрі қарай, жалаушаны пайдаланып файлдар тізімін талдауды бастаймыз -f. Біз оған бұрын қабылданған .txt файлын тасымалдаймыз. Толық талдауға ұқсас, біз қайтару кодтарын қарастырамыз:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
Біріктіру сұрауын тексеруге арналған толық сценарий келесідей болады:
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
Барлық сценарийлер өңделгеннен кейін журналды түрлендіруді қосу ғана қалады. Біз белгіні қолданамыз кейінгі_скрипт және утилита плог түрлендіргіш:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Утилита
Айтпақшы, егер сіз IDE-ден жергілікті .json есептерімен ыңғайлы жұмыс істегіңіз келсе, мен біздің
Ыңғайлы болу үшін, міне .gitlab-ci.yml толығымен:
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
Барлығын файлға қосқаннан кейін түймесін басыңыз Өзгерістерді қабылдау. Барлығы дұрыс екенін көру үшін өтіңіз CI / CD -> Құбырлар -> Жүгіру. Виртуалды машина терезесі ашылады, оның соңында келесілер болуы керек:
көрді Жұмыс сәтті болды - сәттілік, бәрі жақсы. Енді сіз не істегеніңізді тексере аласыз.
Жұмыс үлгілері
Жұмыс мысалы үшін қарапайым жобаны жасайық ( мастер) бірнеше файлдарды қамтитын болады. Осыдан кейін басқа филиалда біз тек бір файлды өзгертеміз және біріктіру сұрауын жасауға тырысамыз.
Екі жағдайды қарастырайық: өзгертілген файлда қате болған кезде және ол болмаған кезде. Біріншіден, қатесі бар мысал.
Негізгі бөлімде файл бар делік Program.cs, онда қателер жоқ, бірақ басқа тармақта әзірлеуші қате кодты қосып, біріктіру сұрауын жасағысы келеді. Оның қандай қателік жібергені соншалықты маңызды емес, бастысы оның бар екендігі. Мысалы, оператор ұмытып кетті тастаңыз (Иә,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
Қате бар мысалды талдау нәтижесін қарастырайық. Сондай-ақ, тек бір файл талданғанына көз жеткізу үшін жалаушаны қостым -r pvs-studio-dotnet іске қосу жолына:
Талдағыш қате тауып, тармақтарды біріктіруге рұқсат бермегенін көреміз.
Мысалды қатесіз тексерейік. Кодты түзету:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
Біріктіру сұрауын талдау нәтижелері:
Көріп отырғанымыздай, қателер табылмады және тапсырма сәтті орындалды, біз оны тексергіміз келді.
қорытынды
Бұтақтарды біріктіру алдында нашар кодты жою өте ыңғайлы және жағымды. Сондықтан CI/CD қолданып жатсаңыз, тексеру үшін статикалық анализаторды ендіріп көріңіз. Оның үстіне, бұл өте қарапайым түрде жасалады.
Назарларыңызға рахмет.
Егер сіз осы мақаланы ағылшын тілінде сөйлейтін аудиториямен бөліскіңіз келсе, аударма сілтемесін пайдаланыңыз: Николай Миронов.
Ақпарат көзі: www.habr.com