Chạy kiểm tra IntelliJ IDEA trên Jenkins

IntelliJ IDEA ngày nay có bộ phân tích mã Java tĩnh tiên tiến nhất, với khả năng của nó bỏ xa những “cựu chiến binh” như kiểu kiểm tra и Lỗi đốm. Nhiều cuộc “kiểm tra” của nó kiểm tra mã ở nhiều khía cạnh khác nhau, từ kiểu mã hóa đến các lỗi điển hình.

Tuy nhiên, miễn là kết quả phân tích chỉ được hiển thị trong giao diện cục bộ của IDE của nhà phát triển thì chúng ít có tác dụng đối với quá trình phát triển. Phân tích tĩnh phải được đáp ứng Là bước đầu tiên của quy trình xây dựng, kết quả của nó sẽ xác định các cổng chất lượng và quá trình xây dựng sẽ thất bại nếu các cổng chất lượng không được vượt qua. Được biết, TeamCity CI được tích hợp với IDEA. Nhưng ngay cả khi không sử dụng TeamCity, bạn vẫn có thể dễ dàng thử chạy kiểm tra IDEA trên bất kỳ máy chủ CI nào khác. Tôi khuyên bạn nên xem cách thực hiện việc này bằng cách sử dụng plugin IDEA Community Edition, Jenkins và Warnings NG.

Bước 1. Chạy phân tích trong vùng chứa và nhận báo cáo

Lúc đầu, ý tưởng chạy IDE (ứng dụng máy tính để bàn!) Bên trong hệ thống CI không có giao diện đồ họa có vẻ mơ hồ và rất rắc rối. May mắn thay, các nhà phát triển IDEA đã cung cấp khả năng chạy định dạng mã и thanh tra từ dòng lệnh. Hơn nữa, để chạy IDEA ở chế độ này, không cần phải có hệ thống con đồ họa và các tác vụ này có thể được thực hiện trên các máy chủ có vỏ văn bản.

Việc kiểm tra được khởi chạy bằng cách sử dụng tập lệnh bin/inspect.sh từ thư mục cài đặt IDEA. Các thông số cần có là:

  • đường dẫn đầy đủ đến dự án (những đường dẫn tương đối không được hỗ trợ),
  • đường dẫn đến tệp .xml có cài đặt kiểm tra (thường nằm bên trong dự án ở .idea/inspectionProfiles/Project_Default.xml),
  • đường dẫn đầy đủ đến thư mục chứa các tệp .xml có báo cáo về kết quả phân tích sẽ được lưu trữ.

Ngoài ra, người ta mong đợi rằng

  • đường dẫn đến SDK Java sẽ được định cấu hình trong IDE, nếu không quá trình phân tích sẽ không hoạt động. Các cài đặt này được chứa trong tập tin cấu hình jdk.table.xml trong thư mục cấu hình toàn cầu IDEA. Bản thân cấu hình toàn cầu IDEA được đặt trong thư mục chính của người dùng theo mặc định, nhưng vị trí này có thể được chỉ định rõ ràng trong tập tin idea.properties.
  • Dự án được phân tích phải là một dự án IDEA hợp lệ, trong đó bạn sẽ phải cam kết một số tệp thường bị bỏ qua để kiểm soát phiên bản, cụ thể là:
    • .idea/inspectionProfiles/Project_Default.xml — cài đặt máy phân tích, chúng rõ ràng sẽ được sử dụng khi tiến hành kiểm tra trong thùng chứa,
    • .idea/modules.xml - nếu không chúng ta sẽ gặp lỗi 'Dự án này không chứa mô-đun',
    • .idea/misc.xml - nếu không chúng ta sẽ gặp lỗi 'JDK không được cấu hình đúng cho dự án này',
    • *.iml-файлы - nếu không, chúng tôi sẽ gặp lỗi về JDK chưa được định cấu hình trong mô-đun.

Mặc dù những tập tin này thường được bao gồm trong .gitignore, chúng không chứa bất kỳ thông tin cụ thể nào về môi trường của một nhà phát triển cụ thể - chẳng hạn như không giống như một tệp workspace.xml, nơi chứa thông tin đó và do đó không cần phải cam kết nó.

Giải pháp rõ ràng là đóng gói JDK cùng với IDEA Community Edition vào một thùng chứa ở dạng sẵn sàng để “đấu sức” trên các dự án được phân tích. Hãy chọn một vùng chứa cơ sở phù hợp và đây là Dockerfile của chúng ta:

Dockerfile

FROM openkbs/ubuntu-bionic-jdk-mvn-py3

ARG INTELLIJ_VERSION="ideaIC-2019.1.1"

ARG INTELLIJ_IDE_TAR=${INTELLIJ_VERSION}.tar.gz

ENV IDEA_PROJECT_DIR="/var/project"

WORKDIR /opt

COPY jdk.table.xml /etc/idea/config/options/

RUN wget https://download-cf.jetbrains.com/idea/${INTELLIJ_IDE_TAR} && 
    tar xzf ${INTELLIJ_IDE_TAR} && 
    tar tzf ${INTELLIJ_IDE_TAR} | head -1 | sed -e 's//.*//' | xargs -I{} ln -s {} idea && 
    rm ${INTELLIJ_IDE_TAR} && 
    echo idea.config.path=/etc/idea/config >> idea/bin/idea.properties && 
    chmod -R 777 /etc/idea

CMD idea/bin/inspect.sh ${IDEA_PROJECT_DIR} ${IDEA_PROJECT_DIR}/.idea/inspectionProfiles/Project_Default.xml ${IDEA_PROJECT_DIR}/target/idea_inspections -v2

Sử dụng tùy chọn idea.config.path chúng tôi đã buộc IDEA tìm kiếm cấu hình chung của nó trong thư mục /etc/idea, bởi vì home folder của người dùng khi làm việc trong CI là một thứ không chắc chắn và thường hoàn toàn không có.

Tệp được sao chép vào vùng chứa trông như thế này: jdk.table.xml, chứa các đường dẫn đến OpenJDK được cài đặt bên trong vùng chứa (có thể lấy một tệp tương tự từ thư mục của riêng bạn với cài đặt IDEA làm cơ sở):

jdk.table.xml

<application>
 <component name="ProjectJdkTable">
   <jdk version="2">
     <name value="1.8" />
     <type value="JavaSDK" />
     <version value="1.8" />
     <homePath value="/usr/java" />
     <roots>
       <annotationsPath>
         <root type="composite">
           <root url="jar://$APPLICATION_HOME_DIR$/lib/jdkAnnotations.jar!/" type="simple" />
         </root>
       </annotationsPath>
       <classPath>
         <root type="composite">
           <root url="jar:///usr/java/jre/lib/charsets.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/deploy.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/access-bridge-64.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/cldrdata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/dnsns.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jaccess.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/jfxrt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/localedata.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/nashorn.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunec.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunjce_provider.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunmscapi.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/sunpkcs11.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/ext/zipfs.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/javaws.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jce.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfr.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jfxswt.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/jsse.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/management-agent.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/plugin.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/resources.jar!/" type="simple" />
           <root url="jar:///usr/java/jre/lib/rt.jar!/" type="simple" />
         </root>
       </classPath>
     </roots>
     <additional />
   </jdk>
 </component>
</application>

Hình ảnh đã hoàn thành có sẵn trên Docker Hub.

Trước khi tiếp tục, hãy kiểm tra xem trình phân tích IDEA có đang chạy trong vùng chứa không:

docker run --rm -v <путь/к/вашему/проекту>:/var/project inponomarev/intellij-idea-analyzer

Quá trình phân tích sẽ chạy thành công và nhiều tệp .xml có báo cáo của trình phân tích sẽ xuất hiện trong thư mục con target/idea_inspections.

Bây giờ không còn nghi ngờ gì nữa rằng máy phân tích IDEA có thể chạy độc lập trong bất kỳ môi trường CI nào và chúng ta chuyển sang bước thứ hai.

Bước 2. Hiển thị và phân tích báo cáo

Lấy báo cáo ở dạng tệp .xml đã là một nửa trận chiến; bây giờ bạn cần làm cho báo cáo có thể đọc được. Và kết quả của nó cũng nên được sử dụng trong cổng chất lượng - logic để xác định xem thay đổi được chấp nhận có đạt hay không theo tiêu chí chất lượng.

Điều này sẽ giúp chúng tôi Plugin NG cảnh báo của Jenkins, được phát hành vào tháng 2019 năm XNUMX. Với sự ra đời của nó, nhiều plugin riêng lẻ để làm việc với các kết quả phân tích tĩnh trong Jenkins (CheckStyle, FindBugs, PMD, v.v.) hiện được đánh dấu là lỗi thời.

Plugin bao gồm hai phần:

  • nhiều người thu thập tin nhắn phân tích (danh sách đầy đủ bao gồm tất cả các máy phân tích được khoa học biết đến từ AcuCobol đến ZPT Lint),
  • một trình xem báo cáo duy nhất cho tất cả chúng.

Danh sách những thứ mà Cảnh báo NG có thể phân tích bao gồm các cảnh báo từ trình biên dịch Java và cảnh báo từ nhật ký thực thi Maven: mặc dù chúng liên tục hiển thị nhưng chúng hiếm khi được phân tích cụ thể. Báo cáo IntelliJ IDEA cũng được đưa vào danh sách các định dạng được công nhận.

Vì plugin này mới nên ban đầu nó tương tác tốt với Jenkins Pipeline. Bước xây dựng với sự tham gia của nó sẽ trông như thế này (chúng tôi chỉ cần cho plugin biết định dạng báo cáo mà chúng tôi nhận ra và những tệp nào sẽ được quét):

stage ('Static analysis'){
    sh 'rm -rf target/idea_inspections'
    docker.image('inponomarev/intellij-idea-analyzer').inside {
       sh '/opt/idea/bin/inspect.sh $WORKSPACE $WORKSPACE/.idea/inspectionProfiles/Project_Default.xml $WORKSPACE/target/idea_inspections -v2'
    }
    recordIssues(
       tools: [ideaInspection(pattern: 'target/idea_inspections/*.xml')]
    )
}

Giao diện báo cáo trông như thế này:

Chạy kiểm tra IntelliJ IDEA trên Jenkins

Thuận tiện, giao diện này phổ biến cho tất cả các máy phân tích được công nhận. Nó chứa một sơ đồ tương tác về việc phân phối các phát hiện theo danh mục và biểu đồ về động lực thay đổi số lượng phát hiện. Bạn có thể thực hiện tìm kiếm nhanh trong lưới ở cuối trang. Điều duy nhất không hoạt động chính xác khi kiểm tra IDEA là khả năng duyệt mã trực tiếp trong Jenkins (mặc dù đối với các báo cáo khác, chẳng hạn như Checkstyle, plugin này có thể thực hiện điều này rất tốt). Có vẻ như đây là một lỗi trong trình phân tích cú pháp báo cáo IDEA cần được sửa.

Trong số các tính năng của Cảnh báo NG là khả năng tổng hợp các phát hiện từ các nguồn khác nhau trong một báo cáo và Chương trình Cổng Chất lượng, bao gồm cả một “bánh cóc” cho tập hợp tham chiếu. Có sẵn một số tài liệu lập trình của Quality Gates đây - tuy nhiên, nó chưa hoàn chỉnh và bạn phải xem mã nguồn. Mặt khác, để kiểm soát hoàn toàn những gì đang xảy ra, “bánh cóc” có thể được thực hiện độc lập (xem phần của tôi bài trước về chủ đề này).

Kết luận

Trước khi bắt đầu chuẩn bị tài liệu này, tôi quyết định tìm kiếm: có ai đã viết về chủ đề này trên Habré chưa? Tôi chỉ tìm thấy phỏng vấn 2017 с dây buộcnơi anh ấy nói:

Theo những gì tôi biết, không có sự tích hợp nào với Jenkins hoặc plugin maven […] Về nguyên tắc, bất kỳ người đam mê nào cũng có thể kết bạn với IDEA Community Edition và Jenkins, nhiều người sẽ chỉ được hưởng lợi từ việc này.

Chà, hai năm sau chúng ta có Plugin Warnings NG và cuối cùng tình bạn này đã đơm hoa kết trái!

Nguồn: www.habr.com

Thêm một lời nhận xét