Configurar el flujo de trabajo de CodeQL para los lenguajes compilados

Puedes configurar cómo GitHub utiliza el Flujo de trabajo de análisis de CodeQL para escanear el código escrito en los lenguajes compilados para las vulnerabilidades y errores.

If you have write permissions to a repository, you can configure escaneo de código for that repository.

El Escaneo de código se encuentra disponible para todos los repositorios públicos y para los privados que pertenecen a organizaciones en donde se habilitó la GitHub Advanced Security. Para obtener más información, consulta la sección "Acerca de GitHub Advanced Security".

Acerca de Flujo de trabajo de análisis de CodeQL y los lenguajes compilados

Puedes configurar a GitHub para que ejecute el escaneo de código en tu repositorio si agregas un flujo de trabajo de GitHub Actions a este. Note: This article refers to escaneo de código powered by CodeQL, not to escaneo de código resulting from the upload of third-party static analysis tools. Para obtener más información, consulta la sección "Configurar el escaneo de código en un repositorio".

Habitualmente, no necesitas editar el flujo de trabajo predeterminado para escaneo de código. Sin embargo, si lo requieres, puedes editar el flujo de trabajo para personalizar algunos de los ajustes. Por ejemplo, puedes editar el Flujo de trabajo de análisis de CodeQL de GitHub para especificar la frecuencia de los escaneos, los idiomas o los directorios a escanear, y qué debe buscar el CodeQL del escaneo de código en tu código. También podrías necesitar editar el Flujo de trabajo de análisis de CodeQL si utilizas un conjunto de comandos específicos para compilar tu código. Para obtener información general acerca de cómo configurar el escaneo de código y de cómo editar los archivos de flujo de trabajo, consulta las secciones "Configurar el escaneo de código" y "Aprende sobre las GitHub Actions".

Acerca de autobuild para CodeQL

El escaneo de código funciona ejecutando consultas contra una o más bases de datos. Cada base de datos contiene una representación de todo el código de tu repositorio en un solo lenguaje. Para los lenguajes compilados de C/C++, C#, y Java, el proceso de poblar esta base de datos involucra compilar el código y extraer los datos. CodeQL también ejecuta una compilación para que los proyectos de Go configuren el proyecto. Sin embargo, en contraste con el resto de los lenguajes compilados, todos los archivos de Go en el repositorio se extraen, y no únicamente aquellos que se compilaron. Puedes utilizar comandos personalizados de compilación para saltarte la extracción de archivos de Go que no haya tocado la compilación.

Para los lenguajes compilados compatibles, puedes utilizar la acción de autobuild en el Flujo de trabajo de análisis de CodeQL para compilar tu código. Esto te evita tener que especificar los comandos de compilación explícitos paraC/C++, C#, y Java.

Si tu flujo de trabajo utiliza una matriz de language, el autobuild intentará compilar cada uno de los lenguajes que se listen en ella. Sin una matriz, el autobuild intentará compilar el lenguaje compatible que tenga más archivos de origen 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 utilizas los ejecutores auto-hospedados para GitHub Actions, tal vez necesites instalar software adicional para utilizar el proceso de autobuild. Adicionalmente, si tu repositorio requiere de una versión específica de una herramienta de compilación, tal vez necesites instalarla manualmente. Para obtener más información, consulta la sección "Especificaciones para los ejecutores hospedados en GitHub".

C/C++

Tipo de sistema compatibleNombre del sistema
Sistema operativoWindows, macOS, y Linux
Sistema de compilaciónWindows: 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 de autobuild varía de acuerdo con el sistema operativo en el que se ejecute la extracción. En Windows, el paso de autobuild intenta autodetectar un método de compilación adecuado para C/C++ utilizando el siguiente enfoque:

  1. Invocar aMSBuild.exe en el archivo de la solución (.sln) o del proyecto (.vcxproj) que esté más cercano a la raíz. Si autobuild detecta soluciones o archivos de proyecto múltiples en la misma profundidad (la más corta) desde el directorio de nivel superior, entonces intentará compilarlos todos.
  2. Invocar un script que se ve como un script de compilación—build.bat, build.cmd, and build.exe (en ese órden).

En Linux y macOS, el paso de autobuild revisa los archivos presentes en el repositorio para determinar el sistema de compilación que se utilizó:

  1. Busca un sistema de compilación en el directorio raíz.
  2. Si no se encuentra ninguno, busca un directorio único en los subdirectorios, el cual cuente con un sistema de compilación para C/C++.
  3. Ejecuta un comando adecuado para configurar el sistema.

C

Tipo de sistema compatibleNombre del sistema
Sistema operativoWindows y Linux
Sistema de compilación.NET y MSbuild, así como los scripts de compilación

El proceso de autobuild intenta autodetectar un método de compilación adecuado para C# utilizando el siguiente acercamiento:

  1. Invoca a dotnet build en el archivo (.sln) de la solución o en el archivo (.csproj) del proyecto que esté más cercano a la raíz.
  2. Invoca a MSbuild (Linux) o a MSBuild.exe (Windows) en el archivo de la solución o del proyecto más cercano a la raíz. Si autobuild detecta soluciones o archivos de proyecto múltiples en la misma profundidad (la más corta) desde el directorio de nivel superior, entonces intentará compilarlos todos.
  3. Invoca un script que se parece a un script de compilación—build y build.sh (en ese orden, para Linux) o build.bat, build.cmd, y build.exe (en ese orden, para Windows).

Java

Tipo de sistema compatibleNombre del sistema
Sistema operativoWindows, macOS, y Linux (sin restricción)
Sistema de compilaciónGradle, Maven y Ant

El proceso de autobuild intenta determinar el sistema de compilación para las bases de código de Java aplicando esta estrategia:

  1. Busca un archivo de compilación en el directorio raíz. Busca a Gradle en Maven y luego Ant compila los archivos.
  2. 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.
  3. 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 el código de C/C++, C# o de Java en tu repositorio tiene un proceso de compilación diferente al estándar, el autobuild podría fallar. Necesitarás eliminar el paso de autobuild del flujo de trabajo y agregar los pasos de compilación manualmente. Si quieres especificar qué archivos de Go se deben extraer de tu repositorio, necesitarás agregar pasos de compilación. Para obtener más información sobre cómo editar el archivo de flujo de trabajo, consulta la sección "Configurar el escaneo de código".

Después de eliminar el paso de autobuild, quita el comentario del paso de run y agrega los comandos de compilación que son adecuados para tu repositorio. El paso de run en el flujo de trabajo ejecuta programas de línea de comandos que utiizan el shell del sistema operativo. Puedes modificar estos comandos y agregar más de ellos para personalizar el proceso de compilación.

- run: |
  make bootstrap
  make release

Para obtener más información acerca de la palabra clave run, consulta la sección "Sintaxis de flujo de trabajo para { site.data.variables.product.prodname_actions }}".

Si tu repositorio contiene lenguajes compilados múltiples, puedes especificar los compandos de compilación específicos de estos lenguajes. Por ejemplo, si tu repositorio contiene C/C++, C# y Java, y el autobuild compila correctamente C/C++ y C#, pero falla con Java, puedes utilizar la siguiente configuración en tu flujo de trabajo, después del paso init. Esto especifica los pasos de compilación para Java mientras que aún utiliza el autobuild para C/C++ y 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

Para obtener más información acerca del condicional if, consulta la sección "Sintaxis de flujo de trabajo para GitHub Actions".

Para obtener más tips e ides sobre por qué el autobuild no está compilando tu código, consulta la sección "Solucionar errores en el flujo de trabajo de CodeQL".

Si agregas pasos de compilación manualmente para los lenguajes compilados y el escaneo de código aún no funciona en tu repositorio, contacta a Soporte de GitHub.

¿Te ayudó este documento?

Política de privacidad

¡Ayúdanos a hacer geniales estos documentos!

Todos los documentos de GitHub son de código abierto. ¿Notas algo que esté mal o que no sea claro? Emite una solicitud de cambios.

Haz una contribución

O, aprende cómo contribuir.