TigerGate scans the libraries your project uses and tells you which ones have known security problems. To do that, it first needs a list of your libraries and their exact version numbers. For most languages that list is already sitting in your repository, so everything works out of the box. For Java, Gradle, and some .NET projects, that list does not exist yet — it has to be worked out by running your build tool. If your build tool is not installed, TigerGate cannot get the list, and your libraries are never checked.
When this happens, nothing looks broken. The scan finishes, the build passes, and the report says no problems were found. The libraries were simply never checked. Find your language in the table below before you trust a clean result.

Find your language

We tested each of these with a real project.
Your languageWorks out of the box?What you need to do
Node.jsYesCommit package-lock.json (or yarn.lock / pnpm-lock.yaml)
PythonYesCommit requirements.txt, poetry.lock, or Pipfile.lock
GoYesCommit go.mod and go.sum
PHPYesCommit composer.lock
RubyYesCommit Gemfile.lock
.NETYes, if you commit packages.lock.jsonTurn on the lock file — it takes one line
.NETNo, if you only have a .csprojTurn on the lock file, or install the .NET SDK
Java (Maven)NoInstall Java and Maven
Java (Gradle)NoInstall Java and Gradle
If your language says “Yes”, the standard pipeline in Code scanning in CI/CD already works. You can stop reading here.

Why Java projects report no problems

This is the most common surprise, so it is worth seeing exactly what happens. Spring Boot projects do not write version numbers next to their libraries. They inherit them from a parent file instead:
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.5.4</version>
</parent>
<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
    <!-- notice: no version here -->
  </dependency>
</dependencies>
Working out the real version numbers means reading that parent file, and only Maven knows how to do that. Without Java installed, TigerGate sees the library names but not their versions:
NAME                        VERSION
spring-boot-starter-log4j2  UNKNOWN
spring-boot-starter-web     UNKNOWN
TigerGate cannot tell you whether “UNKNOWN” is a safe version or a dangerous one, so it reports nothing:
No vulnerabilities found
That project is not safe. Spring Boot 2.5.4 actually pulls in Log4j 2.14.1 — the version behind Log4Shell, one of the most exploited vulnerabilities ever found. Once Java and Maven are installed, the same project correctly reports it as Critical.
If you write an exact version next to every library in your pom.xml, those libraries are checked correctly without Java. But the libraries they pull in behind the scenes are still missed, and that is where most problems hide.

If you see this error

The JAVA_HOME environment variable is not defined correctly,
this environment variable is needed to run this program.
Maven is installed but Java is not, or JAVA_HOME points somewhere that is not a real Java installation. The fix is below.

Add your build tool to the scanner

TigerGate runs your build tool itself, so the build tool has to live in the same place as TigerGate. Pointing at a copy of Maven elsewhere on the machine will not work. The simplest way is to make your own version of the scanner image with the build tool added. Copy the file for your language, build it once, and push it to a registry your CI can reach.
FROM tigergate/tigergate-cli:latest

# Copy Java in
COPY --from=eclipse-temurin:17-jdk /opt/java/openjdk /opt/java/openjdk
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH="/opt/java/openjdk/bin:${PATH}"

# Copy Maven in
COPY --from=maven:3.9-eclipse-temurin-17 /usr/share/maven /usr/share/maven
ENV PATH="/usr/share/maven/bin:${PATH}"

ENTRYPOINT ["tigergate"]
We built and tested this exact file: Java 17.0.19, Maven 3.9.16. It makes the image about 290 MB bigger.It copies Java from the official Java image rather than installing it with apt, because that keeps the version predictable and does not break when the base image is updated.
Build it and push it:
docker build -t registry.example.com/tigergate-cli-java:1.0.0 .
docker push registry.example.com/tigergate-cli-java:1.0.0
Then use that image name in your pipeline wherever the examples say tigergate/tigergate-cli.

Java (Maven)

Pick your CI system and copy the file. Each pipeline does three things: download your libraries, scan them, and fail the build if the scan finds something bad. On a pull request it checks only the code you changed. On your main branch it checks everything.
name: TigerGate Security
on:
  push:
    branches: [main]
  pull_request:

env:
  TIGERGATE_API_KEY: ${{ secrets.TIGERGATE_API_KEY }}

jobs:
  scan:
    runs-on: ubuntu-latest
    container:
      image: registry.example.com/tigergate-cli-java:1.0.0
      credentials:
        username: ${{ secrets.REGISTRY_USER }}
        password: ${{ secrets.REGISTRY_TOKEN }}
    permissions:
      contents: read
      pull-requests: write
      statuses: write
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }

      # Remember downloaded libraries so the next run is faster
      - uses: actions/cache@v4
        with:
          path: ~/.m2/repository
          key: m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: m2-

      # Download the libraries
      - run: mvn -B -q dependency:go-offline

      # Scan
      - run: tigergate scan --type all --scan-scope diff --upload
        if: github.event_name == 'pull_request'
      - run: tigergate scan --type all --scan-scope full --upload
        if: github.event_name == 'push'

Java (Gradle)

The same idea, using the Gradle image. Use ./gradlew if your project has one.
jobs:
  scan:
    runs-on: ubuntu-latest
    container:
      image: registry.example.com/tigergate-cli-gradle:1.0.0
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - uses: actions/cache@v4
        with:
          path: ~/.gradle/caches
          key: gradle-${{ hashFiles('**/*.gradle*') }}
          restore-keys: gradle-
      - run: ./gradlew --no-daemon dependencies
      - run: tigergate scan --type all --scan-scope full --upload
        env:
          TIGERGATE_API_KEY: ${{ secrets.TIGERGATE_API_KEY }}

.NET

You have two options. The first is easier and gives better results.
1

Best: turn on the lock file

Add this line to your .csproj:
<PropertyGroup>
  <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
Then run dotnet restore once and commit the file it creates:
dotnet restore
git add packages.lock.json
git commit -m "Add NuGet lock file"
That file lists every library and its exact version, including the ones pulled in behind the scenes. TigerGate reads it directly, so you do not need the .NET SDK on your CI machine and you can use the normal scanner image.
2

Otherwise: install the .NET SDK

If you cannot commit a lock file, use the .NET image from above and run dotnet restore before the scan.
jobs:
  scan:
    runs-on: ubuntu-latest
    container:
      image: tigergate/tigergate-cli:latest
    steps:
      - uses: actions/checkout@v4
        with: { fetch-depth: 0 }
      - run: tigergate scan --type all --scan-scope full --upload
        env:
          TIGERGATE_API_KEY: ${{ secrets.TIGERGATE_API_KEY }}
These examples assume you committed the lock file. If you did not, change the image to your .NET one and add dotnet restore --use-lock-file before the scan.

Node.js, Python, Go, Ruby, PHP

Nothing to install. Just make sure the right file is committed to Git.
LanguageCommit this fileIf it is missing
Node.jspackage-lock.json, yarn.lock, or pnpm-lock.yamlpackage.json gives version ranges like ^4.17.0, not real versions
Pythonrequirements.txt, poetry.lock, or Pipfile.lockPin exact versions; >= ranges cannot be checked
Gogo.mod and go.sum—
RubyGemfile.lockGemfile alone is not enough
PHPcomposer.lockcomposer.json alone is not enough
The rule is the same everywhere: a file saying “some version of this library” cannot be checked. A file saying “exactly version 4.17.15” can. If one of these reports nothing, check that the file is really in Git and not excluded by .gitignore.

Common problems

What you seeWhat it meansHow to fix it
JAVA_HOME is not defined correctlyJava is not installed, or JAVA_HOME points to the wrong placeUse the Java image above — it sets this for you
Spring Boot project says No vulnerabilities foundVersion numbers were never worked out, so nothing could be checkedInstall Java and Maven, and run mvn dependency:go-offline before scanning
Libraries listed with version UNKNOWNSame problem as aboveSame fix
.NET project shows no librariesThere is no lock file and no .NET SDKCommit packages.lock.json
Gradle project shows no librariesbuild.gradle is not a list of exact versionsUse the Gradle image and run ./gradlew dependencies
mvn: not foundThe job is using the normal scanner imageSwitch it to your Java image
Works on my laptop, not in CIThe download step and the scan step ran in different placesBoth must run in the same job, using the same image
Every run is slowLibraries are downloaded again each timeAdd the cache section shown for your CI system