Skip to content

Commit 3c34726

Browse files
authored
Merge pull request #7 from sa1g0n1337/add-multi-java-environment
Customizable JDK and Maven Versions for CodeQL Agent
2 parents 77e1f28 + d81fdd5 commit 3c34726

File tree

4 files changed

+103
-71
lines changed

4 files changed

+103
-71
lines changed

Dockerfile

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ RUN apt-get update && \
3333
file \
3434
dos2unix \
3535
default-jdk \
36-
openjdk-8-jdk \
3736
maven \
3837
gettext && \
3938
apt-get clean && \

Dockerfile-java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# FROM --platform=amd64 maven:3.8-openjdk-17-slim
2+
FROM --platform=amd64 maven:3-jdk-8-slim
3+
4+
RUN ls -lia $JAVA_HOME
5+
6+
RUN mkdir -p /opt/jdk/ /opt/maven/
7+
8+
RUN cp -r $JAVA_HOME/* /opt/jdk/
9+
10+
RUN cp -r $MAVEN_HOME/* /opt/maven/
11+
12+
CMD ["echo"]

README.md

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@ You can set environment variables to use the following supported options:
5656
`SAVE_CACHE_FLAG` | Value `--save-cache`. Aggressively save intermediate results to the disk cache. This may speed up subsequent queries if they are similar. Be aware that using this option will greatly increase disk usage and initial evaluation time.
5757
`ACTION` | Value `create-database-only`. Creating CodeQL database only without executing CodeQL analysis.
5858
`COMMAND` | Value `<command>`. The variable used when you create a CodeQL database for one or more compiled languages, omit if the only languages requested are Python and JavaScript. This specifies the build commands needed to invoke the compiler. If you don't set this variable, CodeQL will attempt to detect the build system automatically, using a built-in autobuilder.
59-
`JAVA_VERSION` | Value `<java_version>`. Set the Java version. The default Java version is Java 11. It must be `8` or `11`.
6059
-----
6160

6261
***Disclaimer:** CodeQL Agent directly forwards these options to the command arguments while running the container. Please take it as your security responsibility.*
@@ -128,16 +127,39 @@ docker run --rm --name codeql-agent-docker \
128127
<details>
129128
<summary> Specify the Java version and the build database command </summary>
130129
131-
```bash
132-
docker run --rm --name codeql-agent-docker \
133-
-v "$PWD:/opt/src" \
134-
-v "$PWD/codeql-agent-results:/opt/results" \
135-
-e "LANGUAGE=java" \
136-
-e "JAVA_VERSION=8" \
137-
-e "COMMAND=mvn clean install" \
138-
doublevkay/codeql-agent
130+
By default, we use JDK 11 and Maven 3.6.3 for the CodeQL agent image. We can change the versions of Java and Maven by mounting a volume and setting the JAVA_HOME and MAVEN_HOME environment variables in the CodeQL agent container. For example:
139131
140-
```
132+
1. Create a Dockerfile (named Dockerfile-java) for the specific versions of Java and Maven, and place it in the directory that will be used for mounting later:
133+
```Dockerfile
134+
FROM --platform=amd64 maven:3-jdk-8-slim
135+
136+
RUN mkdir -p /opt/jdk/ /opt/maven/
137+
138+
RUN cp -r $JAVA_HOME/* /opt/jdk/
139+
140+
RUN cp -r $MAVEN_HOME/* /opt/maven/
141+
142+
CMD ["echo"]
143+
```
144+
2. Build and run the Docker container, mounting the JDK and Maven directories to the respective volumes:
145+
```bash
146+
docker buildx build -t codeql-java -f Dockerfile-java .
147+
docker run --rm -v "jdkvol:/opt/jdk" -v "mavenvol:/opt/maven" codeql-java
148+
```
149+
3. Finally, run codeql-agent container with mounted volumes and set env variable JAVA_HOME, MAVEN_HOME to the mounted volumes
150+
151+
```bash
152+
docker run --rm --name codeql-agent-docker \
153+
-v "$PWD:/opt/src" \
154+
-v "$PWD/codeql-agent-results:/opt/results" \
155+
-v "jdkvol:/opt/jdk" \
156+
-v "mavenvol:/opt/maven" \
157+
-e "LANGUAGE=java" \
158+
-e "JAVA_HOME=/opt/jdk" \
159+
-e "MAVEN_HOME=/opt/maven" \
160+
-e "COMMAND=mvn clean install" \
161+
doublevkay/codeql-agent
162+
```
141163
</details>
142164
143165
## Build

scripts/analyze.sh

Lines changed: 59 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,32 @@ print_red() {
1212
# Set SRC
1313
SRC=/opt/src
1414

15+
# Check if JAVA_HOME is set and not empty
16+
if [ -n "$JAVA_HOME" ]; then
17+
echo "JAVA_HOME is set to $JAVA_HOME"
18+
# Check and add JAVA_HOME/jre/bin to PATH if it exists
19+
if [ -d "$JAVA_HOME/jre/bin" ]; then
20+
export PATH="$JAVA_HOME/jre/bin:$PATH"
21+
fi
22+
# Check and add JAVA_HOME/bin to PATH if it exists
23+
if [ -d "$JAVA_HOME/bin" ]; then
24+
export PATH="$JAVA_HOME/bin:$PATH"
25+
fi
26+
else
27+
echo "JAVA_HOME is not set or empty. Use default."
28+
fi
29+
30+
# Check if MAVEN_HOME is set and not empty
31+
if [ -n "$MAVEN_HOME" ]; then
32+
echo "MAVEN_HOME is set to $MAVEN_HOME"
33+
# Check and add MAVEN_HOME/bin to PATH if it exists
34+
if [ -d "$MAVEN_HOME/bin" ]; then
35+
export PATH="$MAVEN_HOME/bin:$PATH"
36+
fi
37+
else
38+
echo "MAVEN_HOME is not set or empty. Use default."
39+
fi
40+
1541
if [[ -z "${CI_PROJECT_DIR}" ]]; then
1642
SRC=/opt/src
1743
else
@@ -29,71 +55,60 @@ if [ ! -d "$SRC" ]; then
2955
exit 3
3056
fi
3157

32-
if [ -z $LANGUAGE ]
33-
then
34-
if [ ! -z $CI_PROJECT_REPOSITORY_LANGUAGES ]
35-
then
36-
ListLanguages=(${CI_PROJECT_REPOSITORY_LANGUAGES//,/ })
37-
else
38-
chown -R $(id -u):$(id -g) $SRC
39-
mapfile -t ListLanguages <<< $(github-linguist $SRC)
40-
fi
41-
for val in "${ListLanguages[@]}"; do
42-
lang="$(echo $val | rev | cut -d' ' -f 1 | rev)"
43-
lang=${lang,,}
44-
if [[ "${SupportedLanguage[*]}" =~ "${lang}" ]]; then
45-
LANGUAGE=$lang
46-
break
47-
fi
48-
done
49-
if [[ $LANGUAGE == "" ]]; then
50-
print_red "[!] Can not auto detect language. Please check the source code or specify the LANGUAGE variable."
51-
finalize
52-
exit 4
58+
if [ -z $LANGUAGE ]; then
59+
if [ ! -z $CI_PROJECT_REPOSITORY_LANGUAGES ]; then
60+
ListLanguages=(${CI_PROJECT_REPOSITORY_LANGUAGES//,/ })
61+
else
62+
chown -R $(id -u):$(id -g) $SRC
63+
mapfile -t ListLanguages <<<$(github-linguist $SRC)
64+
fi
65+
for val in "${ListLanguages[@]}"; do
66+
lang="$(echo $val | rev | cut -d' ' -f 1 | rev)"
67+
lang=${lang,,}
68+
if [[ "${SupportedLanguage[*]}" =~ "${lang}" ]]; then
69+
LANGUAGE=$lang
70+
break
5371
fi
72+
done
73+
if [[ $LANGUAGE == "" ]]; then
74+
print_red "[!] Can not auto detect language. Please check the source code or specify the LANGUAGE variable."
75+
finalize
76+
exit 4
77+
fi
5478
fi
5579

5680
# Set options
5781
LANGUAGE=${LANGUAGE,,}
58-
if [[ "$LANGUAGE" == "python" || "$LANGUAGE" == "javascript" || "$LANGUAGE" == "cpp" || "$LANGUAGE" == "csharp" || "$LANGUAGE" == "java" || "$LANGUAGE" == "go" || "$LANGUAGE" == "typescript" || "$LANGUAGE" == "c" ]]
59-
then
60-
if [[ "$LANGUAGE" == "typescript" ]]
61-
then
82+
if [[ "$LANGUAGE" == "python" || "$LANGUAGE" == "javascript" || "$LANGUAGE" == "cpp" || "$LANGUAGE" == "csharp" || "$LANGUAGE" == "java" || "$LANGUAGE" == "go" || "$LANGUAGE" == "typescript" || "$LANGUAGE" == "c" ]]; then
83+
if [[ "$LANGUAGE" == "typescript" ]]; then
6284
LANGUAGE="javascript"
6385
fi
64-
if [[ "$LANGUAGE" == "c" ]]
65-
then
86+
if [[ "$LANGUAGE" == "c" ]]; then
6687
LANGUAGE="cpp"
6788
fi
6889

6990
else
70-
echo "[!] Invalid language: $LANGUAGE"
71-
finalize
72-
exit 5
91+
echo "[!] Invalid language: $LANGUAGE"
92+
finalize
93+
exit 5
7394
fi
7495

75-
if [ -z $FORMAT ]
76-
then
96+
if [ -z $FORMAT ]; then
7797
FORMAT="sarif-latest"
7898
fi
7999

80-
if [ -z $QS ]
81-
then
100+
if [ -z $QS ]; then
82101
QS="$LANGUAGE-security-extended.qls"
83102
fi
84103

85-
if [ -z $OUTPUT ]
86-
then
104+
if [ -z $OUTPUT ]; then
87105
OUTPUT="/opt/results"
88106
fi
89107

90-
if [ -z $THREADS ]
91-
then
108+
if [ -z $THREADS ]; then
92109
THREADS="0"
93110
fi
94111

95-
96-
97112
DB="$OUTPUT/codeql-db"
98113

99114
# Set THREADS
@@ -108,28 +123,14 @@ print_green " [+] Output: $OUTPUT"
108123
print_green " [+] Format: $FORMAT"
109124
echo "----------------"
110125

111-
# Switch to Java 8
112-
if [[ $JAVA_VERSION ]]
113-
then
114-
if [[ $JAVA_VERSION == "8" ]]; then
115-
update-java-alternatives -s $(update-java-alternatives -l | grep 8 | cut -d " " -f1) || echo '.'
116-
elif [[ $JAVA_VERSION == "11" ]]; then
117-
update-java-alternatives -s $(update-java-alternatives -l | grep 11 | cut -d " " -f1) || echo '.'
118-
else
119-
echo "[Warning] : JAVA_VERSION must be 8 or 11."
120-
fi
121-
fi
122-
123126
# Check action
124-
if [ -z $ACTION ]
125-
then
127+
if [ -z $ACTION ]; then
126128
ACTION='all'
127129
fi
128130

129131
# Functions
130132
create_database() {
131-
if [[ $COMMAND ]]
132-
then
133+
if [[ $COMMAND ]]; then
133134
print_green "[Running] Creating DB: codeql database create --threads=$THREADS --language=$LANGUAGE --command=\"$COMMAND\" $DB -s $SRC $OVERWRITE_FLAG"
134135
codeql database create --threads=$THREADS --language=$LANGUAGE --command="$COMMAND" $DB -s $SRC $OVERWRITE_FLAG
135136
else
@@ -145,7 +146,7 @@ create_database() {
145146

146147
scan() {
147148
print_green "[Running] Start Scanning: codeql database analyze --format=$FORMAT --threads=$THREADS $SAVE_CACHE_FLAG --output=$OUTPUT/issues.$FORMAT $DB $QS"
148-
codeql database analyze --format=$FORMAT --threads=$THREADS $SAVE_CACHE_FLAG --output=$OUTPUT/issues.$FORMAT $DB $QS
149+
codeql database analyze --off-heap-ram=0 --format=$FORMAT --threads=$THREADS $SAVE_CACHE_FLAG --output=$OUTPUT/issues.$FORMAT $DB $QS
149150
if [ $? -ne 0 ]; then
150151
print_red "[!] CodeQL analyze failed."
151152
finalize
@@ -163,8 +164,7 @@ convert_sarif_to_sast() {
163164
}
164165

165166
finalize() {
166-
if [[ $USERID && $GROUPID ]]
167-
then
167+
if [[ $USERID && $GROUPID ]]; then
168168
chown -R $USERID:$GROUPID $OUTPUT
169169
chown -R $USERID:$GROUPID $SRC
170170
fi
@@ -184,4 +184,3 @@ main() {
184184

185185
# Main
186186
main
187-

0 commit comments

Comments
 (0)