Dostosowywanie języków i kompilacji na potrzeby skanowania kodu
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