การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
ชอบ GitLab และเกลียดแมลงใช่ไหม? ต้องการปรับปรุงคุณภาพของซอร์สโค้ดของคุณหรือไม่? ถ้าอย่างนั้นคุณก็มาถูกที่แล้ว วันนี้เราจะมาบอกวิธีกำหนดค่าตัววิเคราะห์ PVS-Studio C# เพื่อตรวจสอบคำขอผสาน มีอารมณ์ยูนิคอร์นและมีความสุขกับการอ่านสำหรับทุกคน

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

อย่างไรก็ตาม เราได้เปิดตัว 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

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

หลักการตรวจสอบคำขอรวม

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

นี่คือลักษณะคำขอรวมก่อนที่จะใช้งานตัววิเคราะห์แบบคงที่:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
นั่นคือข้อผิดพลาดทั้งหมดที่อยู่ในสาขา การเปลี่ยนแปลง, จะย้ายไปที่สาขาหลัก เนื่องจากเราไม่ต้องการสิ่งนี้ เราจึงเพิ่มการวิเคราะห์ และตอนนี้ไดอะแกรมจะมีลักษณะดังนี้:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
กำลังวิเคราะห์ การเปลี่ยนแปลง2 และหากไม่มีข้อผิดพลาด เราจะยอมรับคำขอรวม มิฉะนั้นเราจะปฏิเสธ

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

GitLab

GitLab เป็นเครื่องมือวงจรชีวิต DevOps บนเว็บแบบโอเพ่นซอร์สที่ให้ระบบจัดการที่เก็บโค้ดสำหรับ Git พร้อมด้วยวิกิ ระบบติดตามปัญหา ไปป์ไลน์ CI/CD และคุณสมบัติอื่นๆ ของตัวเอง

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

หมายเหตุ. วิธีการตั้งค่าสภาพแวดล้อมที่อธิบายด้านล่างนี้เป็นหนึ่งในวิธีที่เป็นไปได้ เป้าหมายคือการแสดงขั้นตอนในการตั้งค่าสภาพแวดล้อมที่จำเป็นสำหรับการวิเคราะห์และเปิดใช้เครื่องวิเคราะห์ บางทีในกรณีของคุณ การแยกขั้นตอนการเตรียมสภาพแวดล้อม (การเพิ่มที่เก็บข้อมูล การติดตั้งเครื่องวิเคราะห์) และการวิเคราะห์อาจเหมาะสมกว่า: ตัวอย่างเช่น การเตรียมอิมเมจ Docker ด้วยสภาพแวดล้อมที่จำเป็นและใช้งาน หรือวิธีอื่น

เพื่อให้เข้าใจได้ดีขึ้นว่าจะเกิดอะไรขึ้นตอนนี้ ฉันขอแนะนำให้ดูแผนภาพต่อไปนี้:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
เครื่องวิเคราะห์ต้องใช้ .NET Core SDK 3 เพื่อดำเนินการ ดังนั้นก่อนที่จะติดตั้งเครื่องวิเคราะห์ คุณต้องเพิ่มพื้นที่เก็บข้อมูลของ Microsoft ที่จะใช้ในการติดตั้งการขึ้นต่อกันที่จำเป็นสำหรับเครื่องวิเคราะห์ การเพิ่มที่เก็บ Microsoft สำหรับการกระจาย Linux ต่างๆ อธิบายไว้ในเอกสารที่เกี่ยวข้อง.

หากต้องการติดตั้ง PVS-Studio ผ่านตัวจัดการแพ็คเกจ คุณจะต้องเพิ่มที่เก็บ PVS-Studio ด้วย การเพิ่มที่เก็บข้อมูลสำหรับการแจกแจงที่แตกต่างกันมีอธิบายรายละเอียดเพิ่มเติมใน ส่วนที่เกี่ยวข้องของเอกสาร.

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

หมายเหตุ. โปรดทราบว่าโหมดการทำงานที่อธิบายไว้ (การวิเคราะห์คำขอรวม) จำเป็นต้องมีใบอนุญาตระดับองค์กร ดังนั้นหากคุณต้องการลองใช้โหมดการทำงานนี้อย่าลืมระบุในช่อง "ข้อความ" ว่าคุณต้องมีใบอนุญาตระดับองค์กร

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

ตอนนี้เมื่อมีอัลกอริธึมการทำงานต่อหน้าคุณแล้ว คุณก็สามารถเขียนสคริปต์ต่อไปได้ ในการดำเนินการนี้ คุณจะต้องเปลี่ยนไฟล์ .gitlab-ci.yml หรือถ้าไม่มีก็สร้างมันขึ้นมา หากต้องการสร้าง คุณต้องคลิกที่ชื่อโครงการของคุณ -> ตั้งค่า CI/ซีดี.

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
ตอนนี้เราพร้อมที่จะเขียนสคริปต์แล้ว ขั้นแรกให้เขียนโค้ดที่จะติดตั้งเครื่องวิเคราะห์และป้อนใบอนุญาต:

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 ที่จำเป็น)

คุณสามารถตั้งค่าตัวแปรสภาพแวดล้อมที่มีข้อมูลใบอนุญาตได้โดยการคลิก การตั้งค่าและหลังจาก - เปิด ซีไอ/ซีดี.

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
ในหน้าต่างที่เปิดขึ้น ให้ค้นหารายการนั้น ตัวแปรคลิกที่ปุ่มทางด้านขวา แสดง และเพิ่มตัวแปร ผลลัพธ์ควรมีลักษณะดังนี้:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
ตอนนี้คุณสามารถไปยังการวิเคราะห์ได้แล้ว ขั้นแรก ให้เพิ่มสคริปต์สำหรับการวิเคราะห์ที่สมบูรณ์ ถึงธง -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)" ของเอกสาร "การตรวจสอบโครงการ Visual Studio / MSBuild / .NET Core จากบรรทัดคำสั่งโดยใช้ PVS-Studio".

ในกรณีนี้ เราสนใจโค้ดส่งคืนทั้งหมดที่มีเลข 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

คุณประโยชน์ แปลงปลั๊ก เป็นโครงการโอเพ่นซอร์สที่ใช้ในการแปลงรายงานข้อผิดพลาดของพาร์เซอร์เป็นรูปแบบต่างๆ เช่น HTML คำอธิบายโดยละเอียดเพิ่มเติมของยูทิลิตี้นี้มีให้ในส่วนย่อย "Plog Converter Utility" ส่วนที่เกี่ยวข้องของเอกสาร.

อย่างไรก็ตาม หากคุณต้องการทำงานกับรายงาน .json จาก IDE ภายในเครื่องได้อย่างสะดวก ฉันขอแนะนำของเรา ปลั๊กอิน สำหรับไรเดอร์ 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 / ซีดี -> ท่อ -> เล่น. หน้าต่างเครื่องเสมือนจะเปิดขึ้น ในตอนท้ายควรมีสิ่งต่อไปนี้:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
เลื่อย งานสำเร็จ - ความสำเร็จทุกอย่างเรียบร้อยดี ตอนนี้คุณสามารถทดสอบสิ่งที่คุณได้ทำไปแล้ว

ตัวอย่างผลงาน

สำหรับตัวอย่างงาน มาสร้างโปรเจ็กต์ง่ายๆ (in เจ้านาย) ซึ่งจะมีไฟล์หลายไฟล์ หลังจากนั้นในสาขาอื่นเราจะเปลี่ยนเพียงไฟล์เดียวและพยายามส่งคำขอรวม

ลองพิจารณาสองกรณี: เมื่อไฟล์ที่แก้ไขมีข้อผิดพลาด และเมื่อไม่มีข้อผิดพลาด ขั้นแรก ตัวอย่างที่มีข้อผิดพลาด

สมมติว่ามีไฟล์อยู่ในสาขาหลัก โปรแกรม.csซึ่งไม่มีข้อผิดพลาด แต่ในสาขาอื่นนักพัฒนาได้เพิ่มรหัสที่ผิดพลาดและต้องการส่งคำขอรวม เขาทำผิดพลาดแบบไหนไม่สำคัญสิ่งสำคัญคือมันมีอยู่จริง เช่น โอเปอเรเตอร์ลืม โยน (ใช่, ผิดมาก):

void MyAwesomeMethod(String name)
{
  if (name == null)
    new ArgumentNullException(....);
  // do something
  ....
}

มาดูผลลัพธ์ของการวิเคราะห์ตัวอย่างที่มีข้อผิดพลาดกัน นอกจากนี้เพื่อให้แน่ใจว่ามีการแยกวิเคราะห์ไฟล์เดียวเท่านั้น ฉันจึงเพิ่มแฟล็ก -r ไปยังบรรทัดเปิดตัว pvs-studio-dotnet:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
เราเห็นว่าเครื่องวิเคราะห์พบข้อผิดพลาดและไม่อนุญาตให้รวมสาขา

ลองตรวจสอบตัวอย่างโดยไม่มีข้อผิดพลาด การแก้ไขรหัส:

void MyAwesomeMethod(String name)
{
  if (name == null)
    throw new ArgumentNullException(....);
  // do something
  ....
}

รวมผลการวิเคราะห์คำขอ:

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
ดังที่เราเห็น ไม่พบข้อผิดพลาด และการดำเนินงานก็ประสบผลสำเร็จ ซึ่งเป็นสิ่งที่เราต้องการตรวจสอบ

ข้อสรุป

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

ขอบคุณสำหรับความสนใจของคุณ

การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #
หากคุณต้องการแบ่งปันบทความนี้กับผู้ชมที่พูดภาษาอังกฤษ โปรดใช้ลิงก์การแปล: Nikolay Mironov การวิเคราะห์คำขอรวมใน GitLab โดยใช้ PVS-Studio สำหรับ C #.

ที่มา: will.com

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