Dostosowywanie języków i kompilacji na potrzeby skanowania kodu

Zakończone

Skanowanie kodu CodeQL domyślnie obsługuje wiele języków za pomocą funkcji autobuild. Jeśli jednak kod korzysta z niestandardowego procesu kompilacji, może być konieczne dostosowanie przepływu pracy przy użyciu niestandardowych kroków kompilacji.

W tej lekcji opisano, jak zmienić języki analizowane przez skanowanie kodu i jak dodać niestandardowe kroki kompilacji do przepływu pracy skanowania kodu CodeQL.

Zmienianie analizowanych języków

Skanowanie kodu CodeQL automatycznie wykrywa kod napisany w następujących obsługiwanych językach: C/C++, C#, Go, Java, JavaScript/TypeScript, Python i Ruby.

Uwaga

CodeQL stale aktualizuje obsługiwane języki i struktury, aby uzyskać pełną listę dostępnych języków, wariantów i kompilatorów, zobacz dokumentację[7].

Domyślny plik przepływu pracy analizy CodeQL zawiera macierz kompilacji o nazwie language , która zawiera listę języków w analizowanym repozytorium. Funkcja CodeQL automatycznie wypełnia tę macierz podczas dodawania skanowania kodu do repozytorium. Korzystając z macierzy języków, optymalizuje język CodeQL w celu równoległego uruchamiania każdej analizy. Zalecamy, aby wszystkie przepływy pracy przyjęły tę konfigurację ze względu na zalety wydajności kompilacji równoległych.

Jeśli repozytorium zawiera kod w więcej niż jednym z obsługiwanych języków, możesz wybrać języki, które chcesz przeanalizować. Istnieje kilka powodów, dla których warto zapobiec analizowaniu języka. Na przykład projekt może mieć zależności w innym języku niż treść głównego kodu i możesz nie widzieć alertów dotyczących tych zależności.

Jeśli przepływ pracy używa macierzy językowej, kod CodeQL jest zakodowany na stałe w celu analizowania tylko języków w macierzy. Aby zmienić języki, które chcesz przeanalizować, zmodyfikuj wartość zmiennej macierzy. Możesz usunąć język, aby uniemożliwić jego analizowanie lub dodać język, który nie był obecny w repozytorium podczas konfigurowania skanowania kodu. Jeśli na przykład repozytorium początkowo zawierało tylko JavaScript podczas konfigurowania skanowania kodu, a później dodano kod w Pythonie, musisz dodać python do macierzy.

jobs:
  analyze:
    name: Analyze
    ...
    strategy:
      fail-fast: false
      matrix:
        language: ['javascript', 'python']

Jeśli przepływ pracy nie zawiera macierzy nazywanej językiem, język CodeQL jest skonfigurowany do sekwencyjnego uruchamiania analizy. Jeśli nie określisz języków w przepływie pracy, kodQL automatycznie wykryje i spróbuje przeanalizować wszystkie obsługiwane języki w repozytorium. Jeśli chcesz wybrać języki do przeanalizowania bez użycia macierzy, możesz użyć parametru languages w ramach init akcji.

- uses: github/codeql-action/init@v1
  with:
    languages: cpp, csharp, python

Niestandardowe kroki kompilacji na potrzeby skanowania kodu

W przypadku obsługiwanych języków skompilowanych możesz użyć akcji autobuild w przepływie pracy analizy CodeQL, aby skompilować kod. Pozwala to uniknąć konieczności określania jawnych poleceń kompilacji dla języków C/C++, C# i Java. CodeQL uruchamia również kompilację dla projektów Języka Go w celu skonfigurowania projektu. Jednak w przeciwieństwie do innych skompilowanych języków wszystkie pliki Go w repozytorium są wyodrębniane, a nie tylko te, które zostały skompilowane. Możesz użyć niestandardowych poleceń kompilacji, aby pominąć wyodrębnianie plików języka Go, których kompilacja nie dotyka.

Dodawanie kroków kompilacji dla skompilowanego języka

Jeśli kod C/C++, C# lub Java w repozytorium ma niestandardowy proces kompilacji, autobuild może zakończyć się niepowodzeniem. Musisz usunąć autobuild krok z przepływu pracy i ręcznie dodać kroki kompilacji.

Po usunięciu autobuild kroku odkomentuj krok uruchamiania i dodaj polecenia kompilacji odpowiednie dla twojego repozytorium. Krok uruchamiania przepływu pracy uruchamia programy wiersza polecenia przy użyciu powłoki systemu operacyjnego. Możesz zmodyfikować te polecenia i dodać więcej poleceń, aby dostosować proces kompilacji.

- run: |
  make bootstrap
  make release

Jeśli repozytorium zawiera wiele skompilowanych języków, możesz określić polecenia kompilacji specyficzne dla języka. Jeśli na przykład repozytorium zawiera języki C/C++, C# i Java oraz autobuild poprawnie kompiluje języki C/C++ i C#, ale nie można skompilować języka Java, możesz użyć następującej konfiguracji w przepływie pracy po kroku inicjowania. Określa kroki kompilacji dla języka Java, podczas gdy autobuild jest nadal używane dla języków C/C++ i C#.

- if: matrix.language == 'cpp' || matrix.language == 'csharp'
  name: Autobuild
  uses: github/codeql-action/autobuild@v1

- if: matrix.language == 'java'
  name: Build Java
  run: |
    make bootstrap
    make release