
Në analizatorin PVS-Studio për gjuhët C dhe C++ në Linux dhe macOS, duke filluar nga versioni 7.04, është shtuar një mundësi testuese për të kontrolluar listën e skedareve të përcaktuara. Me anë të këtij mënyre të re, mund të konfigurohet analizatori për të kontrolluar angazhimet dhe kërkesat e tërheqjes. Në këtë artikull do të diskutohet se si të konfigurohet kontrolli i listës së skedareve të ndryshuara në projektin GitHub në sisteme të njohura CI (Continuous Integration) si Travis CI, Buddy dhe AppVeyor.
Mënyra e kontrollit të listës së skedareve
â Ă«shtĂ« njĂ« mjet pĂ«r identifikimin e gabimeve dhe dobĂ«sive tĂ« mundshme nĂ« kodin burimor tĂ« programeve tĂ« shkruara nĂ« gjuhĂ«t C, C++, C# dhe Java. Punon nĂ« sisteme 64-bit nĂ« Windows, Linux dhe macOS.
Në versionin PVS-Studio 7.04 për Linux dhe macOS u shtua mënyra e kontrollit të listës së skedareve burimore. Kjo funksionon për projektet, sistemi i ndërtimit i të cilave lejon gjenerimin e skedarit . Nevojitet për të lejuar analizatorin të nxjerrë informacionin mbi kompilimin e skedareve të përcaktuara. Nëse sistemi juaj i ndërtimit nuk mbështet gjenerimin e skedarit compile_commands.json, mund të provoni ta gjeneroni këtë skedar me anë të utilitarit .
Njëherazi, moda e kontrollit të listës së skedarëve mund të përdoret së bashku me logun e gjurmimit strace të kompilimeve (pvs-studio-analyzer trace). Për këtë, ju do të duhet së pari të kryeni një ndërtim të plotë të projektit dhe ta gjurmoni atë, në mënyrë që analizatori të mbledhë informacione të plota mbi parametrat e kompilimit të të gjithë skedarëve të kontrolluar.
MegjithatĂ«, ky variant ka njĂ« disavantazh tĂ« rĂ«ndĂ«sishĂ«m â do tĂ« duhet ose tĂ« kryeni njĂ« gjurmim tĂ« plotĂ« tĂ« ndĂ«rtimit tĂ« gjithĂ« projektit nĂ« çdo fillim, qĂ« vetĂ« Ă«shtĂ« nĂ« kundĂ«rshtim me idenĂ« e kontrollit tĂ« shpejtĂ« tĂ« komedit. Ose, nĂ«se e ruani rezultatin e gjurmimit, ekzekutimet e ardhshme tĂ« analizatorit mund tĂ« jenĂ« tĂ« paplota, nĂ«se struktura e varĂ«sive tĂ« skedarĂ«ve burimor ndryshon pas gjurmimit (pĂ«r shembull, nĂ« njĂ« nga skedarĂ«t burimor do tĂ« shtohet njĂ« #include e re).
Prandaj, ne nuk rekomandojmë përdorimin e modës së kontrollit të listës së skedarëve me log të gjurmimit për kontrollin e komedive ose pull request-eve. Nëse mund të bëni një ndërtim inkremental gjatë kontrollit të komedit, shqyrtoni mundësinë e përdorimit të modës .
Lista e skedarëve burimorë për analizë ruhet në një skedë teksti dhe i dërgohet analizuesit me anë të parametrave. -S:
pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txtNë këtë skedë specifikohen rrugët e relative ose absolute të skedarëve, duke qenë që çdo skedë e re duhet të jetë në një rresht të ri. Lejohet të specifikoni jo vetëm emrat e skedarëve për analizë, por edhe tekst të ndryshëm. Analizuesi do të shohë që kjo nuk është një skedë dhe do ta injorojë rreshtin. Kjo mund të jetë e dobishme për komentim, nëse skedarët specifikohen manualisht. Megjithatë, shpesh lista e skedarëve do të gjenerohet gjatë analizës në CI, për shembull, këto mund të jenë skedarë nga komenti ose një pull request.
Tani, me kĂ«tĂ« modalitet, mund tĂ« kontrolloni shpejt kodin e ri para se ai tĂ« kalojĂ« nĂ« degĂ«n kryesore tĂ« zhvillimit. PĂ«r tĂ« bĂ«rĂ« qĂ« sistemi i kontrollit tĂ« reagojĂ« ndaj prani tĂ« paralajmĂ«rimeve nga analizuesi, nĂ« utilitarin plog-converter Ă«shtĂ« shtuar njĂ« flag âindicate-warnings:
plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...Me këtë flamur, konvertuesi do të kthejë një kod të ndryshëm nëse raporti i analizatorit përmban paralajmërime. Sipas kodit të kthimit, mund të bllokoni hook-un para komisionit, komisionin ose pull request-in, dhe raportin e generuar nga analizatori ta shfaqni në ekran, ta ndani ose ta dërgoni me email.
Shënim. Në fillim të analizës, lista e skedarëve do të analizojë të gjithë projektin, pasi analizatori duhet të generejë skedarin e varësive të skedarëve burimorë nga skedarët përkatës. Kjo është një veçori e analizës së skedarëve C dhe C++. Më pas, skedari i varësive mund të ruhet në cache dhe do të përditësohet automatikisht nga analizatori. Avantazhi i kontrollit të komisioneve kur përdorni modin e kontrollit të listës së skedarëve përpara se të përdorni modin e analizës inkrementale është që është mjaft të ruani vetëm këtë skedar, dhe jo skedarët objekt.
Principet e zakonshme të analizës së pull request-it
Analiza e të gjithë projektit merr mjaft kohë, prandaj ka kuptim të kontrolloni vetëm një pjesë të tij. Problemi është se duhet të ndahen skedarët e rinj nga skedarët e tjerë të projektit.
Le të shqyrtojmë një shembull të një tree commit-i me dy degë:

Le të imagjinojmë se commit-i A1 përmban një sasi të mjaftueshme kodi, që është kontrolluar tashmë. Pak më parë kemi bërë një degë nga commit-i A1 dhe kemi ndryshuar disa skedarë.
Sigurisht, keni vënë re se pas A1 ndodhi edhe dy commit-e të tjera, por gjithashtu ishin bashkime të degëve të tjera, pasi ne nuk po commit-i në master. Dhe ka ardhur koha kur hotfix është gati. Prandaj, u paraqit një pull request për bashkim B3 dhe A3.
Natyrisht, do të ishte e mundur të kontrollohej e gjithë rezultati i bashkimit të tyre, por do të ishte shumë e gjatë dhe e pasigurt, pasi janë ndryshuar vetëm disa skedarë. Prandaj, është më efektive të analizohet vetëm ato të ndryshuara.
Për këtë, do të marim dallimin midis degëve, duke qenë në HEAD të degës, nga e cila duam të derdhim në master:
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list$MERGE_BASE do ta shqyrtojmĂ« me detaje mĂ« vonĂ«. ĂĂ«shtja Ă«shtĂ« se jo çdo shĂ«rbim CI ofron informacionin e nevojshĂ«m pĂ«r bazĂ«n e bashkimit, prandaj çdo herĂ« duhet tĂ« shpikim mĂ«nyra tĂ« reja pĂ«r tĂ« marrĂ« kĂ«to tĂ« dhĂ«na. Kjo do tĂ« pĂ«rshkruhet nĂ« detaje mĂ« poshtĂ« nĂ« çdo njĂ« nga shĂ«rbimet e pĂ«rshkruara.
KĂ«shtu, ne morĂ«m ndryshimin midis degĂ«ve, pĂ«rkatĂ«sisht â listĂ«n e emrave tĂ« skedarĂ«ve qĂ« janĂ« ndryshuar. Tani na nevojitet tĂ« dĂ«rgojmĂ« skedarin .pvs-pr.list (ne e ridrejtuam daljen mĂ« sipĂ«r) analizatorit:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.listPas analizës na duhet të konvertojmë skedarin e logjeve (PVS-Studio.log) në një format më të lexueshëm:
plog-converter -t errorfile PVS-Studio.log --cerr -wKjo komandë do të nxjerrë një listë gabimesh në (rrjedha standarde e mesazheve të gabimeve).
Por na nevojitet jo vetĂ«m tĂ« nxjerrim gabimet, por edhe tĂ« njoftojmĂ« shĂ«rbimin tonĂ« pĂ«r ndĂ«rtimin dhe testimin pĂ«r praninĂ« e problemeve. PĂ«r kĂ«tĂ«, nĂ« konvertues Ă«shtĂ« shtuar njĂ« flag -W (âindicate-warnings). NĂ«se ka edhe njĂ« paralajmĂ«rim tĂ« analizatorit, kodi i kthimit tĂ« utilitarit plog-converter do tĂ« ndryshojĂ« nĂ« 2, qĂ«, nga ana e tij, do t'i njoftojĂ« shĂ«rbimit CI pĂ«r praninĂ« e gabimeve tĂ« mundshme nĂ« skedarin e pull request.
Travis CI
Konfigurimi është realizuar në formën e skedarit .travis.yml. Për komfort, rekomandoj të nxirreni gjithçka në një skript bash të veçantë me funksione, të cilat do të thirren nga skedari .travis.yml (bash emri_i_skriptit.sh emri_i_funksionit).
Do të fillojmë të shtojmë kodin e nevojshëm në skript në bash, kështu do të kemi funksionalitet më të madh. Në seksionin install do të shkruajmë këtë:
instaloni:
- bash .travis.sh travis_installNëse keni ndonjë udhëzim, mund ta transferoni atë në skenarin duke hequr pikësi.
Do të hapim skedarin .travis.sh dhe do të shtojmë instalimin e analizuesit në funksionin travis_install():
travis_install() {
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
}Tani do të shtojmë në seksionin script ekzekutimi i analizës:
skenari:
- bash .travis.sh travis_scriptDhe në skenarin bash:
travis_script() {
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}Ky kod duhet të ekzekutohet pas ndërtimit të projektit, për shembull, nëse keni pasur një ndërtim në CMake:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
}Do të dalë kështu:
travis_script() {
CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
cmake $CMAKE_ARGS CMakeLists.txt
make -j8
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$TRAVIS_PULL_REQUEST" != "false" ]; then
git diff --name-only origin/HEAD > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
--disableLicenseExpirationCheck
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -w
}Ndoshta keni vërejtur tashmë variablat e përmendur të ambientit $TRAVIS_PULL_REQUEST dhe $TRAVIS_BRANCH. Travis CI i shpall ato vetë:
- $TRAVIS_PULL_REQUEST mban numrin e kërkesës për ndihmë ose false, nëse është një degë e zakonshme;
- $TRAVIS_REPO_SLUG mban emrin e repozitorit të projektit.
Algoritmi i funksionit është:

Travis CI reagon ndaj kodit të kthimit, prandaj prania e paralajmërimeve do t'i tregon shërbimit se komiti ka përmbajtje gabimesh.
Tani le të shqyrtojmë më në detaje këtë rresht të kodit:
git diff --name-only origin/HEAD > .pvs-pr.listFakti është se Travis CI automatikisht bëjnë bashkimin e degëve gjatë analizës së kërkesës për ndihmë:

Prandaj, ne analizojmë A4, jo B3->A3. Për këtë arsye, na nevojitet të llogarisim ndryshimin me A3, që është pikërisht maja e degës nga origin.
Ka mbetur njĂ« detaj i rĂ«ndĂ«sishĂ«m â keĆĄimi i varĂ«sive tĂ« skedarĂ«ve tĂ« titujve nga njĂ«sitĂ« e pĂ«rkthimit (*.c, *.cc, *.cpp etj.). KĂ«to varĂ«si analizi kalkulohet gjatĂ« fillimit tĂ« parĂ« nĂ« modalitetin e kontrollit tĂ« listĂ«s sĂ« skedarĂ«ve dhe mĂ« pas ruhet nĂ« drejtorinĂ« .PVS-Studio. Travis CI lejon keĆĄimin e dosjeve, kĂ«shtu qĂ« ne do ta ruajmĂ« tĂ« dhĂ«nat e kĂ«saj drejtorie. .PVS-Studio/:
cache:
directories:
- .PVS-Studio/Ky kod duhet të shtohet në skedarin .travis.yml. Kjo drejtorie ruan të dhëna të ndryshme të mbledhura pas analizës, të cilat do të përshpejtojnë shpejt analizat e mëvonshme të listës së skedarëve ose analizat inkrementale. Nëse nuk e bëni këtë, analisti do të analizojë faktikisht çdo herë të gjitha skedarët.
Buddy
Si Travis CI, ofron mundësinë e ndërtimit automatizuar dhe testimit të projekteve që ruhen në GitHub. Ndryshe nga Travis CI, ai konfiguriket në ndërfaqen e uebit (ka mbështetje për bash), kështu që nuk ka nevojë të ruani skedarët e konfigurimit në projekt.
Së pari, duhet të shtojmë një veprim të ri në linjën e ndërtimit:

Do të tregojmë kompiluesin që u përdor për ndërtimin e projektit. Vini re kontejnerin docker që është instaluar në këtë veprim. Për shembull, për GCC ekziston një kontejner i veçantë:

Tani do të instalojmë PVS-Studio dhe utilitetet e nevojshme:

Shtoni në redaktor këto rreshta:
apt-get update && apt-get -y install wget gnupg jq
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-studioTani kalojmë në tabin Run (ikona e parë) dhe në fushën përkatëse të redaktorit shtoni kodin e mëposhtëm:
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
if [ "$BUDDY_EXECUTION_PULL_REQUEST_NO" != '' ]; then
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -wNëse keni lexuar kapitullin që i kushtohet Travs-CI, ky kod tashmë ju është i njohur, megjithatë, tani ka një fazë të re:

Tani ne po analizojmë jo rezultatin e bashkimit, por HEAD të degës nga e cila bëhet kërkesa për të tërhequr:

Prandaj, jemi në një komit të kushtëzuar B3 dhe na nevojitet të marrim ndryshimin me A3:
PULL_REQUEST_ID="pulls/$BUDDY_EXECUTION_PULL_REQUEST_NO"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${BUDDY_REPO_SLUG}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.listPër të përcaktuar A3 do të përdorim API-në e GitHub:
https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}Ne kemi përdorur këto variabla, të cilat i ofron Buddy:
- $BUDDY_EXECUTION_PULL_REQEUST_NO â numri i kĂ«rkesĂ«s pĂ«r tĂ« tĂ«rhequr;
- $BUDDY_REPO_SLUG â kombinimi i emrit tĂ« pĂ«rdoruesit dhe depozitĂ«s (p.sh. max/test).
Tani, do të ruajmë ndryshimet duke përdorur butonin poshtë dhe do të aktivizojmë analizën e kërkesës për të tërhequr:

Ndryshe nga Travis CI, nuk kemi nevojĂ« tĂ« specifikojmĂ« .pvs-studio pĂ«r caching, pasi Buddy automatikisht ruan tĂ« gjitha skedarĂ«t pĂ«r ekzekutime tĂ« mĂ«vonshme. Prandaj, mbetet e fundit â ruajmĂ« emrin e pĂ«rdoruesit dhe fjalĂ«kalimin pĂ«r PVS-Studio nĂ« Buddy. Pas ruajtjes sĂ« ndryshimeve, ne do tĂ« kthehemi tek Pipeline. Na nevojitet tĂ« kalojmĂ« te konfigurimi i variablave dhe tĂ« shtojmĂ« emrin e pĂ«rdoruesit dhe çelĂ«sin pĂ«r PVS-Studio:

Pas kĂ«saj, shfaqja e njĂ« pull requestâi tĂ« ri ose e njĂ« komiti do tĂ« nisĂ« verifikimin. NĂ«se komiti pĂ«rmban gabime, Buddy do ta tregojĂ« kĂ«tĂ« nĂ« faqen e pull requestâit.
AppVeyor
Konfigurimi i AppVeyor është i ngjashëm me Buddy, pasi gjithçka ndodh në ndërfaqen web dhe nuk ka nevojë të shtoni një skedar *.yml në repositorin e projektit.
Të kalojmë në skedën Settings në përmbledhjen e projektit:

TĂ« rrokullisim kĂ«tĂ« faqe poshtĂ« dhe tĂ« aktivizojmĂ« ruajtjen e caches pĂ«r ndĂ«rtimet e pull requestâeve:

Tani kalojmë në skedën Environment, ku do të japim imazhin për ndërtimin dhe variablat e nevojshme të mjedisit:

NĂ«se e ke lexuar seksionet e mĂ«parshme, ti je i njohur mirĂ« me kĂ«to dy variabla â PVS_KEY dhe PVS_USERNAME. NĂ«se jo, tĂ« kujtoj se ato janĂ« tĂ« nevojshme pĂ«r verifikimin e licencĂ«s sĂ« analizuesit PVS-Studio. MĂ« vonĂ« do t'i hasim pĂ«rsĂ«ri nĂ« skriptet Bash.
Në këtë faqe poshtë do të japim dosjen për cache:

Nëse nuk e bëjmë këtë, do të analizojmë të gjithë projektin në vend të disa skedarëve, por do të marrim rezultatin për skedarët e dhënë. Prandaj, është e rëndësishme të jepni emrin e duhur të drejtorisë.
Tani ka ardhur koha për skriptin e verifikimit. Do të hapim skedën Tests dhe do të zgjedhim Script:

Në këtë formë duhet të ngjisni kodin e mëposhtëm:
sudo apt-get update && sudo apt-get -y install jq
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update && sudo apt-get -y install pvs-studio
pvs-studio-analyzer credentials $PVS_USERNAME $PVS_KEY
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fi
plog-converter -t errorfile PVS-Studio.log --cerr -wTë vëmë re pjesën e mëposhtme të kodit:
PWD=$(pwd -L)
if [ "$APPVEYOR_PULL_REQUEST_NUMBER" != '' ]; then
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
--dump-files --dump-log pvs-dump.log
-S .pvs-pr.list
else
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
--disableLicenseExpirationCheck
fiPërcaktimi i mjaftueshëm i vlerës së komandës pwd në një variabël që duhet të ruajë këtë vlerë si të parazgjedhur duket e çuditshme në shikim të parë, megjithatë, tani do ta shpjegoj gjithçka.
Gjatë konfigurimit të analizuesit në AppVeyor, u përballa me një sjellje mjaft të çuditshme të analizuesit. Nga njëra anë, çdo gjë funksiononte siç duhet, por analiza nuk fillonte. Kam kaluar një kohë të gjatë për të vënë re se ndodheshim në direktorinë /home/appveyor/projects/testcalc/, ndërsa analizuesi ishte i sigurt se ndodheshim në /opt/appveyor/build-agent/. Kështu kuptova se variabla $PWD po tregon disa të pavërteta. Për këtë arsye, e përditësova manualisht vlerën e saj para fillimit të analizës.
Dhe pastaj gjithçka, si më parë:

Tani le të shqyrtojmë fragmentin e ardhshëm:
PULL_REQUEST_ID="pulls/$APPVEYOR_PULL_REQUEST_NUMBER"
MERGE_BASE=`wget -qO -
https://api.github.com/repos/${APPVEYOR_REPO_NAME}/${PULL_REQUEST_ID}
| jq -r ".base.ref"`Në të, marrim ndryshimin midis degëve mbi të cilat është shpallur pull request. Për këtë na nevojiten këto variabla ambienti:
- $APPVEYOR_PULL_REQUEST_NUMBER â numri i pull request;
- $APPVEYOR_REPO_NAME â emri i pĂ«rdoruesit dhe repositorin e projektit.
Përfundimi
Sigurisht, ne nuk shqyrtuam të gjitha shërbimet e mundshme të integrimit të vazhdueshëm, por të gjitha ato kanë një specifikë shumë të ngjashme me njëra-tjetrën. Me përjashtim të caching, çdo shërbim krijon "bicikletën" e vet, prandaj gjithmonë gjithçka është ndryshe.
Diku, si në Travis-CI, disa rreshta kodi dhe caching funksionon përsosur; diku tjetër, si në AppVeyor, thjesht duhet të specifikoni dosjen në konfigurime; por diku tjetër duhet të krijoni çelësa unikë dhe të përpiqeni të bindni sistemin për t'ju lejuar të rinovoni fragmentin e caktuar. Prandaj, nëse dëshironi të konfiguroni analizën e pull request'ave në një shërbim të integrimit të vazhdueshëm që nuk është shqyrtuar më sipër, sigurohuni që nuk do të keni probleme me caching.
Faleminderit për vëmendjen. Nëse diçka nuk shkon ashtu siç duhet, mos hezitoni të na shkruani në . Ne do t'ju ndihmojmë dhe udhëzojmë.
Nëse dëshironi të ndani këtë artikull me audiencën anglisht-folëse, ju lutem përdorni lidhjen për përkthimin: Maxim Zvyagintsev. .
Burimi: habr.com
