การวิเคราะห์คอมมิตและดึงคำขอใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ในตัววิเคราะห์ PVS-Studio สำหรับภาษา C และ C++ บน Linux และ macOS ตั้งแต่เวอร์ชัน 7.04 เป็นต้นไป มีตัวเลือกการทดสอบปรากฏขึ้นเพื่อตรวจสอบรายการไฟล์ที่ระบุ เมื่อใช้โหมดใหม่ คุณสามารถกำหนดค่าตัววิเคราะห์เพื่อตรวจสอบคอมมิตและคำขอดึงได้ บทความนี้จะบอกวิธีตั้งค่าการตรวจสอบรายการไฟล์ที่เปลี่ยนแปลงของโปรเจ็กต์ GitHub ในระบบ CI (Continuous Integration) ยอดนิยม เช่น Travis CI, Buddy และ AppVeyor

โหมดการตรวจสอบรายการไฟล์

พีวีเอส-สตูดิโอ เป็นเครื่องมือสำหรับระบุข้อผิดพลาดและช่องโหว่ที่อาจเกิดขึ้นในซอร์สโค้ดของโปรแกรมที่เขียนด้วยภาษา C, C++, C# และ Java ทำงานบนระบบ 64 บิตบน Windows, Linux และ macOS

ในเวอร์ชัน PVS-Studio 7.04 สำหรับ Linux และ macOS โหมดสำหรับตรวจสอบรายการไฟล์ต้นฉบับปรากฏขึ้น สิ่งนี้ใช้ได้กับโปรเจ็กต์ที่ระบบบิลด์อนุญาตให้คุณสร้างไฟล์ได้ คอมไพล์_commands.json. จำเป็นสำหรับเครื่องวิเคราะห์ในการดึงข้อมูลเกี่ยวกับการคอมไพล์ไฟล์ที่ระบุ หากระบบบิลด์ของคุณไม่รองรับการสร้างไฟล์คอมไพล์_commands.json คุณสามารถลองสร้างไฟล์ดังกล่าวโดยใช้ยูทิลิตีนี้ หมี.

นอกจากนี้ โหมดการตรวจสอบรายชื่อไฟล์ยังสามารถใช้ร่วมกับบันทึกการติดตาม strace ของการเรียกใช้คอมไพเลอร์ (การติดตาม pvs-studio-analyzer) ในการดำเนินการนี้ คุณจะต้องสร้างโปรเจ็กต์แบบเต็มก่อนแล้วจึงติดตามเพื่อให้เครื่องวิเคราะห์รวบรวมข้อมูลที่ครบถ้วนเกี่ยวกับพารามิเตอร์การคอมไพล์ของไฟล์ทั้งหมดที่กำลังตรวจสอบ

อย่างไรก็ตาม ตัวเลือกนี้มีข้อเสียเปรียบที่สำคัญ - คุณจะต้องดำเนินการติดตามบิลด์ทั้งหมดของโปรเจ็กต์ทั้งหมดทุกครั้งที่คุณรัน ซึ่งในตัวมันเองขัดแย้งกับแนวคิดในการตรวจสอบการคอมมิตอย่างรวดเร็ว หรือ หากคุณแคชผลลัพธ์การติดตามเอง การรันตัววิเคราะห์ในภายหลังอาจไม่สมบูรณ์หากโครงสร้างการขึ้นต่อกันของไฟล์ต้นฉบับเปลี่ยนแปลงหลังจากการสืบค้นกลับ (เช่น #include ใหม่จะถูกเพิ่มลงในไฟล์ต้นฉบับไฟล์ใดไฟล์หนึ่ง)

ดังนั้นเราไม่แนะนำให้ใช้โหมดตรวจสอบรายการไฟล์กับบันทึกการติดตามเพื่อตรวจสอบการคอมมิตหรือคำขอดึง ในกรณีที่คุณสามารถสร้างบิลด์ส่วนเพิ่มได้เมื่อตรวจสอบการคอมมิต ให้พิจารณาใช้โหมด การวิเคราะห์ส่วนเพิ่ม.

รายการไฟล์ต้นฉบับสำหรับการวิเคราะห์จะถูกบันทึกไว้ในไฟล์ข้อความและส่งผ่านไปยังเครื่องวิเคราะห์โดยใช้พารามิเตอร์ -S:

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

ไฟล์นี้ระบุเส้นทางสัมพัทธ์หรือเส้นทางที่แน่นอนไปยังไฟล์ และแต่ละไฟล์ใหม่จะต้องอยู่ในบรรทัดใหม่ เป็นที่ยอมรับได้ไม่เพียงแต่ระบุชื่อไฟล์สำหรับการวิเคราะห์ แต่ยังรวมถึงข้อความต่างๆ ด้วย ตัววิเคราะห์จะเห็นว่านี่ไม่ใช่ไฟล์และจะเพิกเฉยต่อบรรทัด สิ่งนี้มีประโยชน์สำหรับการแสดงความคิดเห็นหากมีการระบุไฟล์ด้วยตนเอง อย่างไรก็ตาม บ่อยครั้งที่รายการไฟล์จะถูกสร้างขึ้นในระหว่างการวิเคราะห์ใน CI ตัวอย่างเช่น ไฟล์เหล่านี้อาจเป็นไฟล์จากคำขอคอมมิตหรือพุล

เมื่อใช้โหมดนี้ คุณจะสามารถตรวจสอบโค้ดใหม่ได้อย่างรวดเร็วก่อนที่จะเข้าสู่สาขาการพัฒนาหลัก เพื่อให้แน่ใจว่าระบบการสแกนตอบสนองต่อคำเตือนของเครื่องวิเคราะห์ ยูทิลิตี้นี้ แปลงปลั๊ก เพิ่มธงแล้ว --ระบุคำเตือน:

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

ด้วยแฟล็กนี้ ตัวแปลงจะส่งคืนโค้ดที่ไม่ใช่ศูนย์หากมีคำเตือนในรายงานตัววิเคราะห์ เมื่อใช้โค้ดส่งคืน คุณสามารถบล็อกคำขอ hook, commit หรือ pull ล่วงหน้าได้ และรายงานตัววิเคราะห์ที่สร้างขึ้นสามารถแสดง แชร์ หรือส่งทางอีเมลได้

บันทึก. เมื่อคุณเริ่มวิเคราะห์รายการไฟล์เป็นครั้งแรก ทั้งโปรเจ็กต์จะถูกวิเคราะห์เนื่องจาก ตัววิเคราะห์จำเป็นต้องสร้างไฟล์ที่ขึ้นต่อกันของไฟล์ต้นฉบับของโปรเจ็กต์ในไฟล์ส่วนหัว นี่คือคุณสมบัติของการวิเคราะห์ไฟล์ C และ C++ ในอนาคต ไฟล์อ้างอิงสามารถแคชได้ และเครื่องวิเคราะห์จะอัปเดตโดยอัตโนมัติ ข้อดีของการตรวจสอบการคอมมิตเมื่อใช้โหมดการตรวจสอบรายการไฟล์มากกว่าการใช้โหมดการวิเคราะห์ส่วนเพิ่มคือ คุณเพียงแค่ต้องแคชไฟล์นั้นเท่านั้น ไม่ใช่ไฟล์อ็อบเจ็กต์

หลักการทั่วไปของการวิเคราะห์คำขอดึง

การวิเคราะห์โครงการทั้งหมดใช้เวลานาน ดังนั้นจึงควรตรวจสอบเพียงบางส่วนเท่านั้น ปัญหาคือคุณต้องแยกไฟล์ใหม่ออกจากไฟล์โปรเจ็กต์ที่เหลือ

ลองดูตัวอย่าง Commit Tree ที่มี XNUMX สาขา:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio

ลองจินตนาการถึงการกระทำนั้น A1 มีโค้ดจำนวนมากพอสมควรที่ได้รับการตรวจสอบแล้ว ก่อนหน้านี้เล็กน้อยเราได้สร้างสาขาจากการคอมมิต A1 และแก้ไขไฟล์บางไฟล์

แน่นอนคุณสังเกตเห็นหลังจากนั้น A1 มีการคอมมิตเกิดขึ้นอีกสองครั้ง แต่สิ่งเหล่านี้เป็นการควบรวมกิจการของสาขาอื่นด้วย เพราะเราไม่ได้คอมมิต เจ้านาย. และตอนนี้ก็ถึงเวลาที่เมื่อ โปรแกรมแก้ไขด่วน พร้อม. นั่นเป็นสาเหตุที่คำขอดึงการควบรวมกิจการปรากฏขึ้น B3 и A3.

แน่นอนว่ามันเป็นไปได้ที่จะตรวจสอบผลลัพธ์ทั้งหมดของการควบรวมกิจการ แต่จะใช้เวลานานเกินไปและไม่ยุติธรรม เนื่องจากมีการเปลี่ยนแปลงไฟล์เพียงไม่กี่ไฟล์เท่านั้น ดังนั้นจึงมีประสิทธิภาพมากกว่าในการวิเคราะห์เฉพาะสิ่งที่เปลี่ยนแปลงไป

เมื่อต้องการทำเช่นนี้ เราได้รับความแตกต่างระหว่างสาขา โดยอยู่ใน HEAD ของสาขาที่เราต้องการรวมเข้ากับสาขาหลัก:

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

$MERGE_BASE เราจะดูรายละเอียดในภายหลัง ความจริงก็คือไม่ใช่ว่าทุกบริการ CI จะให้ข้อมูลที่จำเป็นเกี่ยวกับฐานข้อมูลสำหรับการรวม ดังนั้นทุกครั้งที่คุณต้องหาวิธีใหม่ในการรับข้อมูลนี้ ซึ่งจะอธิบายรายละเอียดด้านล่างในแต่ละบริการบนเว็บที่อธิบายไว้

ดังนั้นเราจึงเห็นความแตกต่างระหว่างสาขาหรือรายการชื่อไฟล์ที่เปลี่ยนไป ตอนนี้เราต้องให้ไฟล์ .pvs-pr.list (เราเปลี่ยนเส้นทางเอาต์พุตด้านบนไปยังมัน) ไปยังเครื่องวิเคราะห์:

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

หลังจากการวิเคราะห์ เราจำเป็นต้องแปลงไฟล์บันทึก (PVS-Studio.log) ให้เป็นรูปแบบที่อ่านง่าย:

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

คำสั่งนี้จะแสดงรายการข้อผิดพลาด สตเดอร์ (เอาต์พุตข้อความแสดงข้อผิดพลาดมาตรฐาน)

ตอนนี้เราไม่เพียงต้องแสดงข้อผิดพลาดเท่านั้น แต่ยังต้องแจ้งบริการประกอบและทดสอบเกี่ยวกับปัญหาด้วย เพื่อจุดประสงค์นี้ จึงมีการเพิ่มแฟล็กลงในตัวแปลง -W (--ระบุคำเตือน). หากมีคำเตือนเครื่องวิเคราะห์อย่างน้อยหนึ่งรายการ รหัสส่งคืนยูทิลิตี้ แปลงปลั๊ก จะเปลี่ยนเป็น 2 ซึ่งจะแจ้งให้บริการ CI ทราบถึงข้อผิดพลาดที่อาจเกิดขึ้นในไฟล์คำขอดึง

Travis CI

การกำหนดค่าจะทำเป็นไฟล์ .travis.yml. เพื่อความสะดวกฉันแนะนำให้คุณใส่ทุกอย่างลงในสคริปต์ทุบตีแยกต่างหากพร้อมฟังก์ชันที่จะเรียกจากไฟล์ .travis.yml (ทุบตี script_name.sh function_name).

เราจะเพิ่มโค้ดที่จำเป็นลงในสคริปต์ที่ ทุบตีด้วยวิธีนี้เราจะได้รับฟังก์ชันการทำงานที่มากขึ้น ในส่วน ติดตั้ง มาเขียนสิ่งต่อไปนี้:

install:
  - bash .travis.sh travis_install

หากคุณมีคำแนะนำใดๆ คุณสามารถโอนคำแนะนำเหล่านั้นไปยังสคริปต์ได้โดยลบเครื่องหมายยัติภังค์ออก

มาเปิดไฟล์กันเถอะ .travis.sh และเพิ่มการตั้งค่าเครื่องวิเคราะห์ให้กับฟังก์ชัน travis_ติดตั้ง():

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 
}

ตอนนี้เรามาเพิ่มในส่วนนี้ ต้นฉบับ ดำเนินการวิเคราะห์:

script:
  - bash .travis.sh travis_script

และในสคริปต์ทุบตี:

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
}

ต้องเรียกใช้โค้ดนี้หลังจากสร้างโปรเจ็กต์แล้ว เช่น หากคุณมีบิลด์บน CMake:

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

มันจะออกมาดังนี้:

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
}

คุณอาจสังเกตเห็นตัวแปรสภาพแวดล้อมเหล่านี้แล้ว $TRAVIS_PULL_REQUEST и $TRAVIS_BRANCH. Travis CI ประกาศอย่างเป็นอิสระ:

  • $TRAVIS_PULL_REQUEST เก็บหมายเลขคำขอดึงหรือ เท็จหากเป็นสาขาปกติ
  • $TRAVIS_REPO_SLUG เก็บชื่อของที่เก็บโครงการ

อัลกอริทึมสำหรับฟังก์ชันนี้:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
Travis CI ตอบสนองต่อรหัสส่งคืน ดังนั้นการมีคำเตือนจะบอกบริการให้ทำเครื่องหมายการคอมมิตว่ามีข้อผิดพลาด

ตอนนี้เรามาดูโค้ดบรรทัดนี้กันดีกว่า:

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

ความจริงก็คือ Travis CI จะผสานสาขาโดยอัตโนมัติในขณะที่วิเคราะห์คำขอดึง:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ดังนั้นเราจึงวิเคราะห์ A4และไม่ B3->A3. เนื่องจากคุณสมบัตินี้เราจึงต้องคำนวณส่วนต่างด้วย A3ซึ่งอยู่ด้านบนสุดของสาขาอย่างแม่นยำ ที่มา.

ยังมีรายละเอียดที่สำคัญอีกประการหนึ่ง - การแคชการขึ้นต่อกันของไฟล์ส่วนหัวในหน่วยการแปลที่คอมไพล์แล้ว (*.c, *.cc, *.cpp ฯลฯ) เครื่องวิเคราะห์จะคำนวณการขึ้นต่อกันเหล่านี้เมื่อเปิดตัวครั้งแรกในโหมดการตรวจสอบรายการไฟล์ จากนั้นจึงบันทึกไว้ในไดเร็กทอรี .PVS-Studio Travis CI อนุญาตให้คุณแคชโฟลเดอร์ ดังนั้นเราจะบันทึกข้อมูลไดเร็กทอรี .PVS-สตูดิโอ/:

cache:
  directories:
    - .PVS-Studio/

จำเป็นต้องเพิ่มรหัสนี้ลงในไฟล์ .travis.yml. ไดเร็กทอรีนี้จัดเก็บข้อมูลต่างๆ ที่รวบรวมหลังการวิเคราะห์ ซึ่งจะช่วยเร่งการวิเคราะห์รายการไฟล์หรือการวิเคราะห์ส่วนเพิ่มในภายหลังได้อย่างมาก หากยังไม่เสร็จสิ้น ตัววิเคราะห์จะวิเคราะห์ไฟล์ทั้งหมดจริงๆ ทุกครั้ง

เพื่อน

เช่นเดียวกับทราวิส ซีไอ เพื่อน ให้ความสามารถในการสร้างและทดสอบโปรเจ็กต์ที่จัดเก็บไว้ใน GitHub โดยอัตโนมัติ ต่างจาก Travis CI ตรงที่ได้รับการกำหนดค่าในเว็บอินเทอร์เฟซ (รองรับ bash) ดังนั้นจึงไม่จำเป็นต้องจัดเก็บไฟล์การกำหนดค่าในโปรเจ็กต์

ก่อนอื่น เราต้องเพิ่มการดำเนินการใหม่ให้กับสายการประกอบ:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
เรามาระบุคอมไพเลอร์ที่ใช้สร้างโปรเจ็กต์กันดีกว่า สังเกตคอนเทนเนอร์นักเทียบท่าที่ติดตั้งในการดำเนินการนี้ ตัวอย่างเช่น มีคอนเทนเนอร์พิเศษสำหรับ GCC:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ตอนนี้มาติดตั้ง PVS-Studio และยูทิลิตี้ที่จำเป็น:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
มาเพิ่มบรรทัดต่อไปนี้ในตัวแก้ไข:

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

ตอนนี้ไปที่แท็บ Run (ไอคอนแรก) และเพิ่มโค้ดต่อไปนี้ลงในฟิลด์ตัวแก้ไขที่เกี่ยวข้อง:

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

หากคุณอ่านหัวข้อใน Travs-CI แสดงว่าคุณคุ้นเคยกับรหัสนี้แล้ว แต่ตอนนี้มีขั้นตอนใหม่แล้ว:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ความจริงก็คือตอนนี้เราไม่ได้วิเคราะห์ผลลัพธ์ของการผสาน แต่เป็น HEAD ของสาขาที่ทำคำขอดึง:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ดังนั้นเราจึงอยู่ในการกระทำแบบมีเงื่อนไข B3 และเราต้องได้ความแตกต่างจาก 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

เพื่อกำหนด A3 ลองใช้ GitHub API:

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

เราใช้ตัวแปรต่อไปนี้ที่ Buddy จัดเตรียมไว้ให้:

  • $BUDDY_EXECUTION_PULL_REQEUST_NO — ดึงหมายเลขคำขอ;
  • $BUDDY_REPO_SLUG — การรวมกันของชื่อผู้ใช้และพื้นที่เก็บข้อมูล (เช่น สูงสุด/ทดสอบ)

ตอนนี้มาบันทึกการเปลี่ยนแปลงโดยใช้ปุ่มด้านล่างและเปิดใช้งานการวิเคราะห์คำขอดึง:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
เราไม่จำเป็นต้องระบุซึ่งต่างจาก Travis CI .pvs-สตูดิโอ สำหรับการแคช เนื่องจาก Buddy จะแคชไฟล์ทั้งหมดโดยอัตโนมัติสำหรับการเปิดตัวครั้งต่อไป ดังนั้นสิ่งสุดท้ายที่เหลือคือบันทึกการเข้าสู่ระบบและรหัสผ่านสำหรับ PVS-Studio ใน Buddy หลังจากบันทึกการเปลี่ยนแปลงแล้ว เราจะนำกลับไปที่ไปป์ไลน์ เราจำเป็นต้องดำเนินการตั้งค่าตัวแปรและเพิ่มข้อมูลเข้าสู่ระบบและคีย์สำหรับ PVS-Studio:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
หลังจากนี้ การปรากฏตัวของคำขอดึงหรือการกระทำใหม่จะทริกเกอร์การตรวจสอบ หากการคอมมิตมีข้อผิดพลาด Buddy จะระบุสิ่งนี้ในหน้าคำขอดึง

AppVeyor

การตั้งค่า AppVeyor นั้นคล้ายคลึงกับ Buddy เนื่องจากทุกอย่างเกิดขึ้นในเว็บอินเทอร์เฟซ และไม่จำเป็นต้องเพิ่มไฟล์ *.yml ไปยังที่เก็บโปรเจ็กต์

ไปที่แท็บการตั้งค่าในภาพรวมโครงการ:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
เลื่อนลงมาที่หน้านี้และเปิดใช้งานการบันทึกแคชเพื่อรวบรวมคำขอดึง:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ตอนนี้ไปที่แท็บสภาพแวดล้อม ซึ่งเราระบุรูปภาพสำหรับแอสเซมบลีและตัวแปรสภาพแวดล้อมที่จำเป็น:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
หากคุณได้อ่านหัวข้อก่อนหน้านี้แล้ว คุณจะคุ้นเคยกับตัวแปรทั้งสองนี้เป็นอย่างดี - PVS_KEY и PVS_USERNAME. ถ้าไม่ ฉันขอเตือนคุณว่าพวกเขาจำเป็นต้องตรวจสอบใบอนุญาตของเครื่องวิเคราะห์ PVS-Studio เราจะเห็นพวกเขาอีกครั้งในสคริปต์ Bash ในอนาคต

ในหน้าเดียวกันด้านล่างเราระบุโฟลเดอร์สำหรับแคช:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
หากเราไม่ทำเช่นนี้ เราจะวิเคราะห์ทั้งโปรเจ็กต์แทนการใช้ไฟล์สองสามไฟล์ แต่เราจะได้ผลลัพธ์จากไฟล์ที่ระบุ ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องป้อนชื่อไดเรกทอรีที่ถูกต้อง

ตอนนี้ก็ถึงเวลาที่สคริปต์จะทดสอบ เปิดแท็บการทดสอบและเลือกสคริปต์:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
คุณต้องวางโค้ดต่อไปนี้ลงในแบบฟอร์มนี้:

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

มาดูส่วนโค้ดต่อไปนี้กัน:

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

การกำหนดค่าที่ค่อนข้างเจาะจงของคำสั่ง pwd ให้กับตัวแปรที่ควรเก็บค่าเริ่มต้นนี้ดูแปลกเมื่อมองแวบแรก อย่างไรก็ตาม ฉันจะอธิบายทุกอย่างตอนนี้

ขณะตั้งค่าเครื่องวิเคราะห์ใน AppVeyor ฉันพบพฤติกรรมที่แปลกประหลาดอย่างยิ่งของเครื่องวิเคราะห์ ในด้านหนึ่ง ทุกอย่างทำงานได้อย่างถูกต้อง แต่การวิเคราะห์ไม่ได้เริ่มต้นขึ้น ฉันใช้เวลาส่วนใหญ่สังเกตว่าเราอยู่ในไดเร็กทอรี /home/appveyor/projects/testcalc/ และผู้วิเคราะห์แน่ใจว่าเราอยู่ใน /opt/appveyor/build-agent/ จากนั้นฉันก็รู้ว่าตัวแปร $PWD นั้นโกหกเล็กน้อย ด้วยเหตุนี้ ฉันจึงอัปเดตค่าของมันด้วยตนเองก่อนที่จะเริ่มการวิเคราะห์

แล้วทุกอย่างก็เหมือนเดิม:

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio
ตอนนี้ให้พิจารณาส่วนต่อไปนี้:

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

ในนั้นเราได้รับความแตกต่างระหว่างสาขาที่มีการประกาศคำขอดึง ในการดำเนินการนี้ เราจำเป็นต้องมีตัวแปรสภาพแวดล้อมต่อไปนี้:

  • $APPVEYOR_PULL_REQUEST_NUMBER — หมายเลขคำขอดึง;
  • $APPVEYOR_REPO_NAME - ชื่อผู้ใช้และที่เก็บโปรเจ็กต์

ข้อสรุป

แน่นอนว่าเราไม่ได้พิจารณาถึงบริการบูรณาการอย่างต่อเนื่องที่เป็นไปได้ทั้งหมด อย่างไรก็ตาม บริการเหล่านี้ล้วนมีคุณลักษณะเฉพาะด้านการปฏิบัติงานที่คล้ายคลึงกันอย่างมาก ยกเว้นแคช แต่ละบริการสร้าง "จักรยาน" ของตัวเอง ดังนั้นทุกอย่างจึงแตกต่างกันเสมอ

เช่นเดียวกับใน Travis-CI โค้ดสองสามบรรทัดและการแคชทำงานได้อย่างไร้ที่ติ ที่ไหนสักแห่งเช่นใน AppVeyor คุณเพียงแค่ต้องระบุโฟลเดอร์ในการตั้งค่า แต่บางแห่งคุณต้องสร้างคีย์เฉพาะและพยายามโน้มน้าวระบบเพื่อให้คุณมีโอกาสเขียนทับส่วนที่แคชไว้ ดังนั้น หากคุณต้องการตั้งค่าการวิเคราะห์คำขอพุลในบริการการรวมอย่างต่อเนื่องที่ไม่ได้กล่าวถึงข้างต้น ขั้นแรกให้ตรวจสอบให้แน่ใจว่าคุณจะไม่มีปัญหากับการแคช

ขอขอบคุณสำหรับความสนใจของคุณ. หากมีบางอย่างไม่ได้ผล โปรดเขียนถึงเราที่ สนับสนุน. เราจะแนะนำและช่วยเหลือ

การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio

หากคุณต้องการแบ่งปันบทความนี้กับผู้ชมที่พูดภาษาอังกฤษ โปรดใช้ลิงก์การแปล: Maxim Zvyagintsev การวิเคราะห์คอมมิตและคำขอดึงใน Travis CI, Buddy และ AppVeyor โดยใช้ PVS-Studio.

ที่มา: will.com

เพิ่มความคิดเห็น