ชอบ GitLab และเกลียดแมลงใช่ไหม? ต้องการปรับปรุงคุณภาพของซอร์สโค้ดของคุณหรือไม่? ถ้าอย่างนั้นคุณก็มาถูกที่แล้ว วันนี้เราจะมาบอกวิธีกำหนดค่าตัววิเคราะห์ PVS-Studio C# เพื่อตรวจสอบคำขอผสาน มีอารมณ์ยูนิคอร์นและมีความสุขกับการอ่านสำหรับทุกคน
อย่างไรก็ตาม เราได้เปิดตัว PVS-Studio 7.08 ซึ่งเราได้ทำอะไรมากมาย
- ตัววิเคราะห์ C # สำหรับ Linux และ macOS;
- ปลั๊กอินสำหรับไรเดอร์;
- โหมดการตรวจสอบรายการไฟล์ใหม่
โหมดการตรวจสอบรายการไฟล์
ก่อนหน้านี้ เพื่อตรวจสอบไฟล์บางไฟล์ จำเป็นต้องส่ง .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 ที่จะใช้ในการติดตั้งการขึ้นต่อกันที่จำเป็นสำหรับเครื่องวิเคราะห์ การเพิ่มที่เก็บ Microsoft สำหรับการกระจาย Linux ต่างๆ
หากต้องการติดตั้ง PVS-Studio ผ่านตัวจัดการแพ็คเกจ คุณจะต้องเพิ่มที่เก็บ PVS-Studio ด้วย การเพิ่มที่เก็บข้อมูลสำหรับการแจกแจงที่แตกต่างกันมีอธิบายรายละเอียดเพิ่มเติมใน
เครื่องวิเคราะห์ต้องใช้รหัสลิขสิทธิ์จึงจะทำงานได้ คุณสามารถรับใบอนุญาตทดลองใช้งานได้ที่
หมายเหตุ. โปรดทราบว่าโหมดการทำงานที่อธิบายไว้ (การวิเคราะห์คำขอรวม) จำเป็นต้องมีใบอนุญาตระดับองค์กร ดังนั้นหากคุณต้องการลองใช้โหมดการทำงานนี้อย่าลืมระบุในช่อง "ข้อความ" ว่าคุณต้องมีใบอนุญาตระดับองค์กร
หากเกิดคำขอรวม เราจะต้องวิเคราะห์รายการไฟล์ที่เปลี่ยนแปลงเท่านั้น ไม่เช่นนั้นเราจะวิเคราะห์ไฟล์ทั้งหมด หลังจากการวิเคราะห์ เราจำเป็นต้องแปลงบันทึกเป็นรูปแบบที่เราต้องการ
ตอนนี้เมื่อมีอัลกอริธึมการทำงานต่อหน้าคุณแล้ว คุณก็สามารถเขียนสคริปต์ต่อไปได้ ในการดำเนินการนี้ คุณจะต้องเปลี่ยนไฟล์ .gitlab-ci.yml หรือถ้าไม่มีก็สร้างมันขึ้นมา หากต้องการสร้าง คุณต้องคลิกที่ชื่อโครงการของคุณ -> ตั้งค่า CI/ซีดี.
ตอนนี้เราพร้อมที่จะเขียนสคริปต์แล้ว ขั้นแรกให้เขียนโค้ดที่จะติดตั้งเครื่องวิเคราะห์และป้อนใบอนุญาต:
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
เนื่องจากการติดตั้งและการเปิดใช้งานจะต้องเกิดขึ้นก่อนสคริปต์อื่นๆ ทั้งหมด เราจึงใช้ป้ายกำกับพิเศษ before_script. ให้ฉันอธิบายส่วนนี้เล็กน้อย
การเตรียมการติดตั้งเครื่องวิเคราะห์:
- 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 ที่จำเป็น)
คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่มีข้อมูลใบอนุญาตได้โดยการคลิก การตั้งค่าและหลังจาก - เปิด ซีไอ/ซีดี.
ในหน้าต่างที่เปิดขึ้น ให้ค้นหารายการนั้น ตัวแปรคลิกที่ปุ่มทางด้านขวา แสดง และเพิ่มตัวแปร ผลลัพธ์ควรมีลักษณะดังนี้:
ตอนนี้คุณสามารถไปยังการวิเคราะห์ได้แล้ว ขั้นแรก ให้เพิ่มสคริปต์สำหรับการวิเคราะห์ที่สมบูรณ์ ถึงธง -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 และอรรถประโยชน์ แปลงปลั๊ก:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
คุณประโยชน์
อย่างไรก็ตาม หากคุณต้องการทำงานกับรายงาน .json จาก IDE ภายในเครื่องได้อย่างสะดวก ฉันขอแนะนำของเรา
เพื่อความสะดวกนี่เลย .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 / ซีดี -> ท่อ -> เล่น. หน้าต่างเครื่องเสมือนจะเปิดขึ้น ในตอนท้ายควรมีสิ่งต่อไปนี้:
เลื่อย งานสำเร็จ - ความสำเร็จทุกอย่างเรียบร้อยดี ตอนนี้คุณสามารถทดสอบสิ่งที่คุณได้ทำไปแล้ว
ตัวอย่างผลงาน
สำหรับตัวอย่างงาน มาสร้างโปรเจ็กต์ง่ายๆ (in เจ้านาย) ซึ่งจะมีไฟล์หลายไฟล์ หลังจากนั้นในสาขาอื่นเราจะเปลี่ยนเพียงไฟล์เดียวและพยายามส่งคำขอรวม
ลองพิจารณาสองกรณี: เมื่อไฟล์ที่แก้ไขมีข้อผิดพลาด และเมื่อไม่มีข้อผิดพลาด ขั้นแรก ตัวอย่างที่มีข้อผิดพลาด
สมมติว่ามีไฟล์อยู่ในสาขาหลัก โปรแกรม.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 ให้ลองฝังเครื่องวิเคราะห์แบบคงที่เพื่อตรวจสอบ นอกจากนี้ยังทำได้ค่อนข้างง่าย
ขอบคุณสำหรับความสนใจของคุณ
หากคุณต้องการแบ่งปันบทความนี้กับผู้ชมที่พูดภาษาอังกฤษ โปรดใช้ลิงก์การแปล: Nikolay Mironov
ที่มา: will.com