Acerca de CodeQL analysis workflow y los lenguajes compilados
Para CodeQL code scanning, puedes usar la configuración predeterminada, que analiza el código y configura automáticamente tu code scanning, o la configuración avanzada, que genera un archivo de flujo de trabajo que puedes editar. Actualmente, la configuración predeterminada no admite ningún lenguaje compilado, por lo que deberás usar la configuración avanzada. Para más información, consulta "Configuración de code scanning para un repositorio".
Habitualmente, no necesitas editar el archivo de flujo de trabajo generado para code scanning. Sin embargo, si lo requieres, puedes editar el flujo de trabajo para personalizar algunos de los ajustes. Por ejemplo, puedes editar el CodeQL analysis workflow de GitHub para especificar la frecuencia de los escaneos, los idiomas o los directorios a escanear, y qué debe buscar el CodeQL del code scanning en tu código. También podrías necesitar editar el CodeQL analysis workflow si utilizas un conjunto de comandos específicos para compilar tu código. Para obtener información general sobre cómo configurar code scanning y editar archivos de flujo de trabajo, consulta "Configuración de code scanning" y "Más información sobre GitHub Actions".
Acerca de autobuild para CodeQL
El Code scanning funciona ejecutando consultas en una o varias bases de datos. Cada base de datos contiene una representación de todo el código de tu repositorio en un solo lenguaje.
En los lenguajes compilados C/C++, C#, Go, Kotlin y Java, el proceso de poblar esta base de datos conlleva compilar el código y extraer los datos. En estos lenguajes, CodeQL analiza los archivos de origen del repositorio que se han compilado. En cualquiera de estos lenguajes, puedes deshabilitar autobuild y, en su lugar, usar comandos de compilación personalizados para analizar solo los archivos compilados con estos comandos personalizados.
Para los lenguajes compilados compatibles, puedes utilizar la acción autobuild en CodeQL analysis workflow para compilar tu código. Esto evita tener que especificar comandos de compilación explícitos para C/C++, C#, Go, Kotlin y Java.
Si en el flujo de trabajo se usa una matriz language, autobuild intenta compilar cada uno de los lenguajes compilados enumerados en la matriz. Sin una matriz, autobuild intentará compilar el lenguaje compilado compatible que tenga más archivos de código fuente en el repositorio. Con la excepción de Go, el análisis de otros lenguajes compilados en tu repositorio siempre fallará a menos de que proporciones comandos de compilación específicos.
Nota: Si usa ejecutores autohospedados para GitHub Actions, es posible que tenga que instalar software adicional para usar el proceso autobuild. Adicionalmente, si tu repositorio requiere de una versión específica de una herramienta de compilación, tal vez necesites instalarla manualmente. Para más información, vea "Especificaciones para los ejecutores hospedados en GitHub".
C/C++
| Tipo de sistema compatible | Nombre del sistema |
|---|---|
| Sistema operativo | Windows, macOS y Linux. |
| Sistema de compilación | Windows: MSbuild y scripts de compilación Linux y macOS: Autoconf, Make, CMake, qmake, Meson, Waf, SCons, Linux Kbuild y scripts de compilación |
El comportamiento del paso autobuild varía en función del sistema operativo en el que se ejecute la extracción. En Windows, el paso autobuild intenta detectar de forma automática un método de compilación adecuado para C/C++ mediante el enfoque siguiente:
- Se invoca
MSBuild.exeen el archivo de solución (.sln) o proyecto (.vcxproj) más cercano a la raíz. Siautobuilddetecta varios archivos de solución o del proyecto en la misma profundidad (la más corta) con respecto al directorio de nivel superior, intentará compilarlos todos. - Invoque un script similar a un script de compilación:build.bat, build.cmd y build.exe (en ese orden).
En Linux y macOS, el paso autobuild revisa los archivos presentes en el repositorio para determinar el sistema de compilación que usar:
- Busca un sistema de compilación en el directorio raíz.
- Si no se encuentra ninguno, busca un directorio único en los subdirectorios, el cual cuente con un sistema de compilación para C/C++.
- Ejecuta un comando adecuado para configurar el sistema.
C#
| Tipo de sistema compatible | Nombre del sistema |
|---|---|
| Sistema operativo | Windows y Linux |
| Sistema de compilación | .NET y MSbuild, así como los scripts de compilación |
El proceso autobuild intenta detectar de forma automática un método de compilación adecuado para C# mediante el enfoque siguiente:
- Se invoca
dotnet builden el archivo de solución (.sln) o proyecto (.csproj) más cercano a la raíz. - Se invoca
MSbuild(Linux) oMSBuild.exe(Windows) en el archivo de solución o del proyecto más cercano a la raíz. Siautobuilddetecta varios archivos de solución o del proyecto en la misma profundidad (la más corta) con respecto al directorio de nivel superior, intentará compilarlos todos. - Se invoca un script similar a un script de compilación: build y build.sh (en ese orden, para Linux), o bien build.bat, build.cmd y build.exe (en ese orden, para Windows).
Go
| Tipo de sistema compatible | Nombre del sistema |
|---|---|
| Sistema operativo | Windows, macOS y Linux. |
| Sistema de compilación | Módulos de Go, dep y Glide, así como scripts de compilación, incluidos scripts de Makefiles y Ninja |
El proceso autobuild intenta detectar automáticamente una forma adecuada de instalar las dependencias necesarias para un repositorio de Go antes de extraer todos los archivos .go:
- Invoca
make,ninja``./buildo./build.sh(en ese orden) hasta que uno de estos comandos se complete correctamente y otro comandogo list ./...posterior también lo haga, lo que indica que las dependencias necesarias se han instalado. - Si ninguno de esos comandos se completa correctamente, busca
go.mod,Gopkg.tomloglide.yamly ejecutago get(a menos que se use el traslado al directorio "vendor"),dep ensure -voglide installrespectivamente para intentar instalar las dependencias. - Por último, si no hay forma de encontrar los archivos de configuración de estos administradores de dependencias, reorganiza la estructura de directorios del repositorio adecuada para la adición a
GOPATHy usago getpara instalar las dependencias. La estructura de directorios vuelve a su estado normal después de que se complete la extracción. - Extrae todo el código de Go en el repositorio, similar a ejecutar
go build ./....
Java y Kotlin
| Tipo de sistema compatible | Nombre del sistema |
|---|---|
| Sistema operativo | Windows, macOS, y Linux (sin restricción) |
| Sistema de compilación | Gradle, Maven y Ant |
El proceso autobuild intenta determinar el sistema de compilación para las bases de código de Java mediante la aplicación de esta estrategia:
- Busca un archivo de compilación en el directorio raíz. Busca a Gradle en Maven y luego Ant compila los archivos.
- Ejecuta el primer archivo de compilación que encuentre. Si tanto los archivos de Gradle como los de Maven están presentes, se utiliza el archivo de Gradle.
- De lo contrario, usca los archivos de compilación en los subidrectorios directos del directorio raíz. Si solo un subdirectorio contiene archivos de compilación, ejecuta el primer archivo identificado en este subdirectorio (utilizando la misma preferencia que para 1). Si más de un subdirectorio contiene archivos de compilación, reporta un error.
Agregar pasos de compilación para un lenguaje compilado
Si se produce un error de autobuild o quiere analizar un conjunto diferente de archivos de origen de los compilados por el proceso autobuild, deberá quitar el paso autobuild del flujo de trabajo y agregar manualmente pasos de compilación. Para proyectos de C/C++, C#, Go, Kotlin y Java, CodeQL analizará el código fuente que creen los pasos de compilación especificados. Para información sobre cómo editar el archivo de flujo de trabajo, consulta "Personalización de code scanning".
Después de quitar el paso autobuild, quite la marca de comentario del paso run y agregue comandos de compilación que sean adecuados para el repositorio. El paso run del flujo de trabajo ejecuta herramientas de línea de comandos mediante el shell del sistema operativo. Puede modificar estos comandos y agregar más comandos para personalizar el proceso de compilación.
- run: |
make bootstrap
make release
Para más información sobre la palabra clave run, vea "Sintaxis de flujo de trabajo para GitHub Actions".
Si el repositorio contiene varios lenguajes compilados, puede especificar comandos de compilación específicos del lenguaje. Por ejemplo, si el repositorio contiene C/C++, C# y Java, y autobuild compila correctamente C/C++ y C# pero no puede compilar Java, podría usar la configuración siguiente en el flujo de trabajo, después del paso init. Esto especifica los pasos de compilación para Java mientras se sigue usando autobuild para C/C++ y C#:
- if: matrix.language == 'cpp' || matrix.language == 'csharp'
name: Autobuild
uses: github/codeql-action/autobuild@v2
- if: matrix.language == 'java'
name: Build Java
run: |
make bootstrap
make release
Para más información sobre el condicional if, vea "Sintaxis de flujo de trabajo para Acciones de GitHub".
Para obtener más sugerencias y trucos sobre por qué autobuild no compilará el código, vea "Solución de problemas del flujo de trabajo de CodeQL".
Si agregas pasos de compilación manualmente para los lenguajes compilados y el code scanning aún no funciona en tu repositorio, contacta a GitHub Support.