Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Í PVS-Studio greiningartækinu fyrir C og C++ tungumál á Linux og macOS, frá útgáfu 7.04, hefur birst prófunartækifæri til að athuga listann yfir tilgreindar skrár. Með því að nota nýja stillinguna geturðu stillt greiningartækið til að athuga skuldbindingar og draga beiðnir. Þessi grein mun sýna þér hvernig á að setja upp GitHub verkefnaskráalistaskoðun í vinsælum CI (Continuous Integration) kerfum eins og Travis CI, Buddy og AppVeyor.

Athugunarhamur skráarlista

PVS-stúdíó er tæki til að greina villur og hugsanlega veikleika í frumkóða forrita sem eru skrifuð í C, C++, C# og Java. Virkar á 64-bita kerfum á Windows, Linux og macOS.

Útgáfan af PVS-Studio 7.04 fyrir Linux og macOS er með stillingu til að athuga listann yfir upprunaskrár. Þetta virkar fyrir verkefni þar sem byggingarkerfi gerir þér kleift að búa til skrá compile_commands.json. Það er nauðsynlegt fyrir greiningartækið að draga út upplýsingar um samantekt tilgreindra skráa. Ef byggingarkerfið þitt styður ekki að búa til compile_commands.json skrá geturðu prófað að búa til slíka skrá með því að nota tólið Bear.

Einnig er hægt að nota aðferðina til að athuga skráalistann ásamt strace trace af þýðanda keyrslum (pvs-studio-analyzer trace). Til að gera þetta þarftu fyrst að framkvæma fulla byggingu á verkefninu og fylgjast með því þannig að greiningartækið safnar heildarupplýsingum um samantektarfæribreytur allra skráanna sem verið er að athuga.

Hins vegar hefur þessi valkostur verulegan galla - þú þarft annaðhvort að framkvæma fulla byggingaspor af öllu verkefninu við hverja sjósetningu, sem í sjálfu sér stangast á við hugmyndina um skjóta skuldbindingu. Eða ef þú geymir sjálfa rakningarniðurstöðuna í skyndiminni, getur síðari ræsing greiningartækisins reynst ófullnægjandi ef uppbygging frumskrárinnar breytist eftir rakningu (til dæmis er nýjum #include bætt við eina af frumskránum).

Þess vegna mælum við ekki með því að nota skráalistaathugunarhaminn með rekjaskrá til að athuga skuldbindingar eða draga beiðnir. Ef þú getur gert stigvaxandi byggingu þegar þú athugar skuldbindingu skaltu íhuga að nota haminn stigvaxandi greining.

Listinn yfir frumskrár til greiningar er vistaður í textaskrá og sendur til greiningartækisins með því að nota færibreytuna -S:

pvs-studio-analyzer analyze ... -f build/compile_commands.json -S check-list.txt

Þessi skrá tilgreinir hlutfallslegar eða algjörar slóðir að skrám og hver ný skrá verður að vera á nýrri línu. Það er leyfilegt að tilgreina ekki aðeins nöfn skráa til greiningar, heldur einnig ýmsan texta. Þjálfarinn mun sjá að þetta er ekki skrá og mun hunsa línuna. Þetta getur verið gagnlegt fyrir athugasemdir ef skrár eru tilgreindar handvirkt. Hins vegar verður listi yfir skrár oft búinn til við CI-þáttun, til dæmis skrár frá commit eða pull request.

Nú, með því að nota þennan hátt, geturðu fljótt prófað nýjan kóða áður en hann kemst í aðalþróunargreinina. Til þess að sannprófunarkerfið bregðist við viðvörunum greiningartækis, er tólið plog-breytir fána bætt við --vísa-viðvaranir:

plog-converter ... --indicate-warnings ... -o /path/to/report.tasks ...

Með þessum fána mun breytirinn skila kóða sem ekki er núll ef viðvaranir eru í greiningarskýrslunni. Með því að nota skilakóðann geturðu lokað á precommit krók, skuldbinda eða draga beiðni og birt greiningarskýrsluna á skjánum, deilt henni eða sent í pósti.

Athugið. Í fyrsta skipti sem þú byrjar að greina lista yfir skrár verður allt verkefnið greint, vegna þess að greiningartækið þarf að búa til skrá yfir ósjálfstæði frumskrár verkefnisins á hausskránum. Þetta er eiginleiki við að flokka C og C++ skrár. Í framtíðinni er hægt að vista ávanaskrána í skyndiminni og hún verður uppfærð sjálfkrafa af greiningartækinu. Kosturinn við að haka við skuldbindingar þegar þú notar skráalistaathugunarham fram yfir að nota stigvaxandi þáttunarham er að aðeins þarf að vista þá skrá, ekki hlutskrárnar.

Almennar reglur um greiningu á dráttarbeiðnum

Greining á öllu verkefninu tekur mikinn tíma og því er skynsamlegt að athuga aðeins hluta þess. Vandamálið er að þú þarft að aðskilja nýju skrárnar frá restinni af verkefnisskránum.

Lítum á dæmi um committré með tveimur greinum:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio

Við skulum láta sem skuldbindingin A1 inniheldur nokkuð mikið magn af kóða sem þegar hefur verið athugað. Nokkru fyrr gerðum við grein frá skuldbindingunni A1 og breytti nokkrum skrám.

Auðvitað tók maður eftir því eftir það A1 það voru tvær skuldbindingar í viðbót, en þetta voru líka sameiningar annarra útibúa, vegna þess að við skuldbindum okkur ekki í húsbóndi. Og nú er tíminn kominn þegar snarstilli tilbúinn. Þess vegna kom fram dráttarbeiðni um sameininguna B3 и A3.

Auðvitað væri hægt að athuga alla niðurstöðu sameiningar þeirra, en það væri of langt og óréttlætanlegt, þar sem aðeins örfáum skrám var breytt. Því er skilvirkara að greina aðeins þær breyttu.

Til að gera þetta fáum við muninn á greinunum, þar sem við erum í HÖFUÐI greinarinnar sem við viljum sameinast í meistara:

git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list

$MERGE_BASE við munum íhuga í smáatriðum síðar. Staðreyndin er sú að ekki sérhver CI þjónusta veitir nauðsynlegar upplýsingar um grunninn fyrir sameininguna, svo í hvert skipti sem þú þarft að koma með nýjar leiðir til að fá þessi gögn. Þetta verður lýst ítarlega hér að neðan í hverri vefþjónustu sem lýst er.

Þannig að við fengum muninn á útibúunum, eða öllu heldur listann yfir skráarnöfn sem hefur verið breytt. Nú þurfum við að gefa skrána .pvs-pr.listi (við vísuðum úttakinu hér að ofan til þess) í greiningartækið:

pvs-studio-analyzer analyze -j8 
                            -o PVS-Studio.log 
                            -S .pvs-pr.list

Eftir greiningu þurfum við að umbreyta annálaskránni (PVS-Studio.log) í læsilegt snið:

plog-converter -t errorfile PVS-Studio.log --cerr -w

Þessi skipun mun skrá villurnar í stderr (venjulegur villuúttaksstraumur).

Aðeins hér þurfum við ekki aðeins að sýna villur, heldur einnig að upplýsa þjónustu okkar fyrir samsetningu og prófanir um tilvist vandamála. Fyrir þetta var flaggi bætt við breytirinn -W (--vísa-viðvaranir). Ef það er að minnsta kosti ein greiningarviðvörun, skilakóði tólsins plog-breytir mun breytast í 2, sem aftur mun tilkynna CI þjónustunni um að hugsanlegar villur séu í skrám um pull request.

Travis C.I.

Stillingin er gerð í formi skráar .travis.yml. Til þæginda ráðlegg ég þér að setja allt í sérstakt bash forskrift með aðgerðum sem verða kallaðar úr skránni .travis.yml (bash scriptname.sh function_name).

Við munum bæta nauðsynlegum kóða við handritið á bash, svo við fáum meiri virkni. Í kafla setja við skulum skrifa eftirfarandi:

install:
  - bash .travis.sh travis_install

Ef þú varst með einhverjar leiðbeiningar geturðu fært þær yfir í handritið með því að fjarlægja bandstrikina.

Við skulum opna skrána .travis.sh og bættu uppsetningu greiningartækisins við aðgerðina 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 
}

Nú skulum við bæta við kaflann handrit hlaupagreining:

script:
  - bash .travis.sh travis_script

Og í bash handriti:

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
}

Þennan kóða verður að keyra eftir að verkefnið er byggt, til dæmis ef þú varst með CMake byggingu:

travis_script() {
  CMAKE_ARGS="-DCMAKE_EXPORT_COMPILE_COMMANDS=On ${CMAKE_ARGS}"
  cmake $CMAKE_ARGS CMakeLists.txt
  make -j8
}

Það mun koma svona út:

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
}

Þú hefur líklega þegar tekið eftir tilgreindum umhverfisbreytum. $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI lýsir yfir þeim á eigin spýtur:

  • $TRAVIS_PULL_REQUEST geymir pull request númerið, eða rangaref það er venjuleg grein;
  • $TRAVIS_REPO_SLUG geymir nafn verkefnageymslunnar.

Reiknirit þessarar aðgerða:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Travis CI bregst við skilakóðum, svo tilvist viðvarana mun segja þjónustunni að flagga skuldbindinguna sem galla.

Við skulum skoða þessa línu af kóða nánar:

git diff --name-only origin/HEAD > .pvs-pr.list

Staðreyndin er sú að Travis CI sameinar útibú sjálfkrafa við greiningu á dráttarbeiðni:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Þess vegna greinum við A4Og ekki B3->A3. Vegna þessa eiginleika þurfum við að reikna mismuninn frá A3, sem er bara efst á greininni frá uppruna.

Eitt mikilvægt smáatriði er eftir - að vista ósjálfstæði hausskráa á samsettum þýðingareiningum (*.c, *.cc, *.cpp, osfrv.). Greiningartækið reiknar út þessar ósjálfstæði við fyrstu ræsingu í þeim ham að athuga lista yfir skrár og vistar þær síðan í .PVS-Studio skránni. Travis CI gerir þér kleift að vista möppur í skyndiminni, svo við munum vista möppugögn .PVS-Stúdíó/:

cache:
  directories:
    - .PVS-Studio/

Þessum kóða þarf að bæta við skrána .travis.yml. Þessi mappa geymir ýmis gögn sem safnað er eftir greiningu, sem mun flýta verulega fyrir síðari keyrslur á skráarlistagreiningu eða stigvaxandi greiningu. Ef þetta er ekki gert mun greiningartækið í raun greina allar skrár í hvert skipti.

Buddy

Eins og Travis C.I., Buddy veitir möguleika á að byggja sjálfkrafa og prófa verkefni sem eru geymd á GitHub. Ólíkt Travis CI er það stillt í vefviðmótinu (bash stuðningur er í boði), svo það er engin þörf á að geyma stillingarskrár í verkefninu.

Fyrst af öllu þurfum við að bæta við nýrri aðgerð við byggingarlínuna:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Tilgreindu þýðandann sem var notaður til að byggja upp verkefnið. Taktu eftir hafnargámnum sem er uppsettur í þessari starfsemi. Til dæmis er sérstakur gámur fyrir GCC:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Nú skulum við setja upp PVS-Studio og nauðsynleg tól:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Bættu eftirfarandi línum við ritstjórann:

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-studio

Nú skulum við fara í Run flipann (fyrsta táknið) og bæta eftirfarandi kóða við samsvarandi ritstjórareit:

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 -w

Ef þú hefur lesið kaflann um Travs-CI, þá er þessi kóða þegar kunnuglegur fyrir þig, en nú er nýtt skref:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Staðreyndin er sú að nú erum við ekki að greina niðurstöðu sameiningarinnar, heldur HÖFUÐA útibúsins sem dráttarbeiðnin er gerð frá:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Þannig að við erum í skilyrtri skuldbindingu B3 og við þurfum að fá muninn frá 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.list

Til að ákvarða A3 Við skulum nota GitHub API:

https://api.github.com/repos/${USERNAME}/${REPO}/pulls/${PULL_REQUEST_ID}

Við notuðum eftirfarandi breytur frá Buddy:

  • $BUDDY_EXECUTION_PULL_REQEUST_NO - draga beiðni númer;
  • $BUDDY_REPO_SLUG - sambland af notendanafni og geymslu (til dæmis max / test).

Nú skulum við vista breytingarnar með því að nota hnappinn hér að neðan og virkja greiningu á dráttarbeiðnum:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Ólíkt Travis CI þurfum við ekki að tilgreina .pvs-stúdíó fyrir skyndiminni, þar sem Buddy vistar allar skrár sjálfkrafa fyrir síðari ræsingu. Þess vegna er það síðasta sem er eftir að vista notandanafnið og lykilorðið fyrir PVS-Studio í Buddy. Eftir að hafa vistað breytingarnar munum við fara aftur í leiðsluna. Við þurfum að fara í að stilla breytur og bæta við innskráningu og lykli fyrir PVS-Studio:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Eftir það mun útlit nýrrar dráttarbeiðni eða skuldbindingar kalla fram ávísun. Ef commit inniheldur villur, þá mun Buddy benda á það á dragbeiðnisíðunni.

AppVeyor

Uppsetning AppVeyor er svipuð og Buddy, þar sem allt gerist í vefviðmótinu og það er engin þörf á að bæta *.yml skrá við verkefnageymsluna.

Við skulum fara í Stillingar flipann í verkefnayfirlitinu:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Við skulum fletta niður þessa síðu og virkja skyndiminni vistun til að byggja upp dráttarbeiðnir:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Nú skulum við fara í Umhverfi flipann, þar sem við tilgreinum myndina sem á að byggja og nauðsynlegar umhverfisbreytur:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Ef þú hefur lesið fyrri hlutana þekkirðu þessar tvær breytur mjög vel - PVS_KEY и PVS_USERNAME. Ef ekki, þá vil ég minna þig á að þeir eru nauðsynlegir til að athuga leyfi PVS-Studio greiningartækisins. Í framtíðinni munum við hitta þá aftur í Bash-handritum.

Á sömu síðu hér að neðan, tilgreindu möppuna fyrir skyndiminni:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Ef við gerum þetta ekki, þá munum við greina allt verkefnið í stað nokkurra skráa, en við munum fá úttakið byggt á tilgreindum skrám. Þess vegna er mikilvægt að slá inn rétt möppuheiti.

Nú er kominn tími fyrir handritið að prófa. Opnaðu próf flipann og veldu Script:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Límdu eftirfarandi kóða inn á þetta eyðublað:

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 -w

Við skulum skoða eftirfarandi hluta kóðans:

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

Frekar sérstaka úthlutun gildis pwd skipunarinnar á breytu sem ætti að geyma þetta sjálfgefna gildi virðist undarlegt við fyrstu sýn, hins vegar mun ég útskýra allt í augnabliki.

Þegar ég setti upp greiningartækið í AppVeyor, rakst ég á afar undarlega hegðun greiningartækisins. Annars vegar virkaði allt rétt en greiningin fór ekki af stað. Ég eyddi miklum tíma í að taka eftir því að við erum í /home/appveyor/projects/testcalc/ skránni og greiningartækið er viss um að við séum í /opt/appveyor/build-agent/. Þá áttaði ég mig á því að $PWD breytan er svolítið lygi. Af þessum sökum uppfærði ég gildi þess handvirkt áður en greiningin hófst.

Og svo allt eins og áður:

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio
Íhugaðu nú eftirfarandi brot:

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"`

Í henni fáum við mismuninn á greinunum sem dráttarbeiðnin er lýst yfir. Til þess þurfum við eftirfarandi umhverfisbreytur:

  • $APPVEYOR_PULL_REQUEST_NUMBER - númer dráttarbeiðni;
  • $APPVEYOR_REPO_NAME - notandanafn og verkefnageymsla.

Ályktun

Auðvitað höfum við ekki skoðað alla mögulega samfellda samþættingarþjónustu, en þær eru allar með mjög svipaðar vinnueinkenni. Að undanskildum skyndiminni gerir hver þjónusta sitt eigið „hjól“, svo allt er alltaf öðruvísi.

Einhvers staðar, eins og í Travis-CI, virkar nokkrar línur af kóða og skyndiminni gallalaust; einhvers staðar, eins og í AppVeyor, þarftu bara að tilgreina möppuna í stillingunum; en einhvers staðar þarftu að búa til einstaka lykla og reyna að sannfæra kerfið um að gefa þér tækifæri til að skrifa yfir skyndiminni brotið. Þess vegna, ef þú vilt setja upp dráttarbeiðnagreiningu á samfelldri samþættingarþjónustu sem ekki var fjallað um hér að ofan, þá skaltu fyrst ganga úr skugga um að þú eigir ekki í vandræðum með skyndiminni.

Takk fyrir athyglina. Ef eitthvað gengur ekki upp, ekki hika við að skrifa okkur á stuðningur. Við munum ráðleggja og hjálpa.

Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio

Ef þú vilt deila þessari grein með enskumælandi áhorfendum, vinsamlegast notaðu þýðingartengilinn: Maxim Zvyagintsev. Greining á skuldbindingum og dráttarbeiðnum í Travis CI, Buddy og AppVeyor með því að nota PVS-Studio.

Heimild: www.habr.com

Bæta við athugasemd