ในตัววิเคราะห์ PVS-Studio สำหรับภาษา C และ C++ บน Linux และ macOS ตั้งแต่เวอร์ชัน 7.04 เป็นต้นไป มีตัวเลือกการทดสอบปรากฏขึ้นเพื่อตรวจสอบรายการไฟล์ที่ระบุ เมื่อใช้โหมดใหม่ คุณสามารถกำหนดค่าตัววิเคราะห์เพื่อตรวจสอบคอมมิตและคำขอดึงได้ บทความนี้จะบอกวิธีตั้งค่าการตรวจสอบรายการไฟล์ที่เปลี่ยนแปลงของโปรเจ็กต์ GitHub ในระบบ CI (Continuous Integration) ยอดนิยม เช่น Travis CI, Buddy และ AppVeyor
โหมดการตรวจสอบรายการไฟล์
ในเวอร์ชัน PVS-Studio 7.04 สำหรับ Linux และ macOS โหมดสำหรับตรวจสอบรายการไฟล์ต้นฉบับปรากฏขึ้น สิ่งนี้ใช้ได้กับโปรเจ็กต์ที่ระบบบิลด์อนุญาตให้คุณสร้างไฟล์ได้
นอกจากนี้ โหมดการตรวจสอบรายชื่อไฟล์ยังสามารถใช้ร่วมกับบันทึกการติดตาม 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 สาขา:
ลองจินตนาการถึงการกระทำนั้น 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 ตอบสนองต่อรหัสส่งคืน ดังนั้นการมีคำเตือนจะบอกบริการให้ทำเครื่องหมายการคอมมิตว่ามีข้อผิดพลาด
ตอนนี้เรามาดูโค้ดบรรทัดนี้กันดีกว่า:
git diff --name-only origin/HEAD > .pvs-pr.list
ความจริงก็คือ Travis CI จะผสานสาขาโดยอัตโนมัติในขณะที่วิเคราะห์คำขอดึง:
ดังนั้นเราจึงวิเคราะห์ A4และไม่ B3->A3. เนื่องจากคุณสมบัตินี้เราจึงต้องคำนวณส่วนต่างด้วย A3ซึ่งอยู่ด้านบนสุดของสาขาอย่างแม่นยำ ที่มา.
ยังมีรายละเอียดที่สำคัญอีกประการหนึ่ง - การแคชการขึ้นต่อกันของไฟล์ส่วนหัวในหน่วยการแปลที่คอมไพล์แล้ว (*.c, *.cc, *.cpp ฯลฯ) เครื่องวิเคราะห์จะคำนวณการขึ้นต่อกันเหล่านี้เมื่อเปิดตัวครั้งแรกในโหมดการตรวจสอบรายการไฟล์ จากนั้นจึงบันทึกไว้ในไดเร็กทอรี .PVS-Studio Travis CI อนุญาตให้คุณแคชโฟลเดอร์ ดังนั้นเราจะบันทึกข้อมูลไดเร็กทอรี .PVS-สตูดิโอ/:
cache:
directories:
- .PVS-Studio/
จำเป็นต้องเพิ่มรหัสนี้ลงในไฟล์ .travis.yml. ไดเร็กทอรีนี้จัดเก็บข้อมูลต่างๆ ที่รวบรวมหลังการวิเคราะห์ ซึ่งจะช่วยเร่งการวิเคราะห์รายการไฟล์หรือการวิเคราะห์ส่วนเพิ่มในภายหลังได้อย่างมาก หากยังไม่เสร็จสิ้น ตัววิเคราะห์จะวิเคราะห์ไฟล์ทั้งหมดจริงๆ ทุกครั้ง
เพื่อน
เช่นเดียวกับทราวิส ซีไอ
ก่อนอื่น เราต้องเพิ่มการดำเนินการใหม่ให้กับสายการประกอบ:
เรามาระบุคอมไพเลอร์ที่ใช้สร้างโปรเจ็กต์กันดีกว่า สังเกตคอนเทนเนอร์นักเทียบท่าที่ติดตั้งในการดำเนินการนี้ ตัวอย่างเช่น มีคอนเทนเนอร์พิเศษสำหรับ GCC:
ตอนนี้มาติดตั้ง 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 แสดงว่าคุณคุ้นเคยกับรหัสนี้แล้ว แต่ตอนนี้มีขั้นตอนใหม่แล้ว:
ความจริงก็คือตอนนี้เราไม่ได้วิเคราะห์ผลลัพธ์ของการผสาน แต่เป็น HEAD ของสาขาที่ทำคำขอดึง:
ดังนั้นเราจึงอยู่ในการกระทำแบบมีเงื่อนไข 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 .pvs-สตูดิโอ สำหรับการแคช เนื่องจาก Buddy จะแคชไฟล์ทั้งหมดโดยอัตโนมัติสำหรับการเปิดตัวครั้งต่อไป ดังนั้นสิ่งสุดท้ายที่เหลือคือบันทึกการเข้าสู่ระบบและรหัสผ่านสำหรับ PVS-Studio ใน Buddy หลังจากบันทึกการเปลี่ยนแปลงแล้ว เราจะนำกลับไปที่ไปป์ไลน์ เราจำเป็นต้องดำเนินการตั้งค่าตัวแปรและเพิ่มข้อมูลเข้าสู่ระบบและคีย์สำหรับ PVS-Studio:
หลังจากนี้ การปรากฏตัวของคำขอดึงหรือการกระทำใหม่จะทริกเกอร์การตรวจสอบ หากการคอมมิตมีข้อผิดพลาด Buddy จะระบุสิ่งนี้ในหน้าคำขอดึง
AppVeyor
การตั้งค่า AppVeyor นั้นคล้ายคลึงกับ Buddy เนื่องจากทุกอย่างเกิดขึ้นในเว็บอินเทอร์เฟซ และไม่จำเป็นต้องเพิ่มไฟล์ *.yml ไปยังที่เก็บโปรเจ็กต์
ไปที่แท็บการตั้งค่าในภาพรวมโครงการ:
เลื่อนลงมาที่หน้านี้และเปิดใช้งานการบันทึกแคชเพื่อรวบรวมคำขอดึง:
ตอนนี้ไปที่แท็บสภาพแวดล้อม ซึ่งเราระบุรูปภาพสำหรับแอสเซมบลีและตัวแปรสภาพแวดล้อมที่จำเป็น:
หากคุณได้อ่านหัวข้อก่อนหน้านี้แล้ว คุณจะคุ้นเคยกับตัวแปรทั้งสองนี้เป็นอย่างดี - PVS_KEY и PVS_USERNAME. ถ้าไม่ ฉันขอเตือนคุณว่าพวกเขาจำเป็นต้องตรวจสอบใบอนุญาตของเครื่องวิเคราะห์ PVS-Studio เราจะเห็นพวกเขาอีกครั้งในสคริปต์ Bash ในอนาคต
ในหน้าเดียวกันด้านล่างเราระบุโฟลเดอร์สำหรับแคช:
หากเราไม่ทำเช่นนี้ เราจะวิเคราะห์ทั้งโปรเจ็กต์แทนการใช้ไฟล์สองสามไฟล์ แต่เราจะได้ผลลัพธ์จากไฟล์ที่ระบุ ดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องป้อนชื่อไดเรกทอรีที่ถูกต้อง
ตอนนี้ก็ถึงเวลาที่สคริปต์จะทดสอบ เปิดแท็บการทดสอบและเลือกสคริปต์:
คุณต้องวางโค้ดต่อไปนี้ลงในแบบฟอร์มนี้:
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 นั้นโกหกเล็กน้อย ด้วยเหตุนี้ ฉันจึงอัปเดตค่าของมันด้วยตนเองก่อนที่จะเริ่มการวิเคราะห์
แล้วทุกอย่างก็เหมือนเดิม:
ตอนนี้ให้พิจารณาส่วนต่อไปนี้:
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 คุณเพียงแค่ต้องระบุโฟลเดอร์ในการตั้งค่า แต่บางแห่งคุณต้องสร้างคีย์เฉพาะและพยายามโน้มน้าวระบบเพื่อให้คุณมีโอกาสเขียนทับส่วนที่แคชไว้ ดังนั้น หากคุณต้องการตั้งค่าการวิเคราะห์คำขอพุลในบริการการรวมอย่างต่อเนื่องที่ไม่ได้กล่าวถึงข้างต้น ขั้นแรกให้ตรวจสอบให้แน่ใจว่าคุณจะไม่มีปัญหากับการแคช
ขอขอบคุณสำหรับความสนใจของคุณ. หากมีบางอย่างไม่ได้ผล โปรดเขียนถึงเราที่
หากคุณต้องการแบ่งปันบทความนี้กับผู้ชมที่พูดภาษาอังกฤษ โปรดใช้ลิงก์การแปล: Maxim Zvyagintsev
ที่มา: will.com