Skip to content

Commit c2fdd46

Browse files
authored
Merge pull request #763 from ELIXIR-NO/chore/improve-build-ci
chore: eliminate redundant Gradle builds from dev and CI pipelines
2 parents a8dd9b3 + 8c65feb commit c2fdd46

File tree

7 files changed

+112
-55
lines changed

7 files changed

+112
-55
lines changed

.dockerignore

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
.git
2+
.github
3+
.gradle
4+
.idea
5+
**/build
6+
**/*.md
7+
dev.sh
8+
*.png
9+
*.jpg

.github/workflows/build-and-test.yml

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ jobs:
2929
uses: actions/cache@v5
3030
with:
3131
path: |
32-
~/.gradle/cache
32+
~/.gradle/caches
3333
~/.gradle/wrapper
34-
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
34+
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle.properties') }}
3535
restore-keys: |
3636
${{ runner.os }}-gradle-
3737
@@ -42,24 +42,21 @@ jobs:
4242
run: ./gradlew :lib:crypt4gh:test :lib:clearinghouse:test :lib:tsd-file-api-client:test :services:tsd-api-mock:test :services:mq-interceptor:test :services:localega-tsd-proxy:test :services:cega-mock:test :cli:lega-commander:test
4343

4444

45-
- name: Run e2e tests
46-
run: |
47-
./gradlew clean
48-
./gradlew start-docker-containers
45+
- name: Start e2e environment
46+
run: ./dev.sh start
4947

50-
# Wait for the e2e-tests container to complete
48+
- name: Wait for e2e tests
49+
run: |
5150
echo "Waiting for e2e-tests container to complete..."
5251
while [ "$(docker inspect --format='{{.State.Running}}' e2e-tests 2>/dev/null)" == "true" ]; do
5352
echo "e2e-tests still running, waiting for 5 seconds..."
5453
sleep 5
5554
done
5655
57-
# Show the logs from the e2e-tests container
5856
echo "=============== e2e-tests Container Logs ==============="
5957
docker logs e2e-tests
6058
echo "========================================================"
6159
62-
# Get the exit code once the container has finished
6360
EXIT_CODE=$(docker inspect --format='{{.State.ExitCode}}' e2e-tests)
6461
if [ $EXIT_CODE -ne 0 ]; then
6562
echo "e2e tests failed with exit code $EXIT_CODE"

dev.sh

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ function log_step() {
6767
}
6868

6969
function show_header() {
70-
clear
70+
[[ -t 1 ]] && clear
7171
printf "${PURPLE}${BOLD}"
7272
printf "===============================================================\n"
7373
printf " FEGA Development Tools \n"
@@ -82,9 +82,17 @@ function start() {
8282
show_header
8383
log_step "Starting development environment"
8484

85-
if ./gradlew clean && bash -c "./gradlew start-docker-containers"; then
85+
log_step "Preparing configuration"
86+
cd e2eTests
87+
source env.sh
88+
./scripts/bootstrap.sh apply_configs
89+
./scripts/bootstrap.sh check_requirements
90+
log_step "Starting containers (Docker will build images)"
91+
if docker compose up --build -d; then
92+
cd ..
8693
log_success "Development environment started successfully!"
8794
else
95+
cd ..
8896
log_error "Failed to start development environment"
8997
return 1
9098
fi
@@ -94,9 +102,12 @@ function stop() {
94102
show_header
95103
log_step "Stopping development environment"
96104

97-
if ./gradlew stop-docker-containers; then
105+
cd e2eTests
106+
if docker compose down --rmi local -v; then
107+
cd ..
98108
log_success "Development environment stopped successfully!"
99109
else
110+
cd ..
100111
log_error "Failed to stop development environment"
101112
return 1
102113
fi
@@ -106,37 +117,22 @@ function reexecute_tests_in_container() {
106117
show_header
107118
log_step "Rebuilding and reexecuting E2E tests"
108119

109-
./gradlew :e2eTests:clean > /dev/null &&
110-
./gradlew :e2eTests:assemble > /dev/null &&
111120
docker rm e2e-tests -f > /dev/null 2>&1 &&
112121
docker rmi fega-norway-e2e-tests:latest -f > /dev/null 2>&1 &&
113122
cd e2eTests &&
114-
docker compose up -d e2e-tests > /dev/null &&
123+
docker compose up --build -d e2e-tests > /dev/null &&
115124
cd .. &&
116125
log_success "E2E tests rebuilt and reexecuted!"
117126
}
118127

119-
function reexecute_tests_in_container() {
120-
./gradlew :e2eTests:clean > /dev/null &&
121-
./gradlew :e2eTests:assemble > /dev/null &&
122-
docker rm e2e-tests -f > /dev/null &&
123-
docker rmi fega-norway-e2e-tests:latest -f > /dev/null &&
124-
cd e2eTests &&
125-
docker compose up -d e2e-tests > /dev/null &&
126-
cd .. &&
127-
echo "Task done ✅ Built and reexecuting e2e-tests."
128-
}
129-
130128
function rebuild_and_deploy_proxy() {
131129
show_header
132130
log_step "Rebuilding and deploying proxy service"
133131

134-
./gradlew :services:localega-tsd-proxy:clean > /dev/null &&
135-
./gradlew :services:localega-tsd-proxy:assemble > /dev/null &&
136132
docker rm proxy -f > /dev/null 2>&1 &&
137133
docker rmi tsd-proxy:latest -f > /dev/null 2>&1 &&
138134
cd e2eTests &&
139-
docker compose up -d proxy > /dev/null &&
135+
docker compose up --build -d proxy > /dev/null &&
140136
cd .. &&
141137
log_success "Proxy service rebuilt and deployed!"
142138
}
@@ -145,12 +141,10 @@ function rebuild_and_deploy_mq_interceptor() {
145141
show_header
146142
log_step "Rebuilding and deploying MQ interceptor"
147143

148-
./gradlew :services:mq-interceptor:clean > /dev/null &&
149-
./gradlew :services:mq-interceptor:assemble > /dev/null &&
150144
docker rm interceptor -f > /dev/null 2>&1 &&
151145
docker rmi mq-interceptor:latest -f > /dev/null 2>&1 &&
152146
cd e2eTests &&
153-
docker compose up -d interceptor > /dev/null &&
147+
docker compose up --build -d interceptor > /dev/null &&
154148
cd .. &&
155149
log_success "MQ interceptor rebuilt and deployed!"
156150
}
@@ -184,12 +178,10 @@ function rebuild_and_deploy_tsd() {
184178
show_header
185179
log_step "Rebuilding and deploying TSD API mock"
186180

187-
./gradlew :services:tsd-api-mock:clean > /dev/null &&
188-
./gradlew :services:tsd-api-mock:assemble > /dev/null &&
189181
docker rm tsd -f > /dev/null 2>&1 &&
190182
docker rmi tsd-api-mock:latest -f > /dev/null 2>&1 &&
191183
cd e2eTests &&
192-
docker compose up -d tsd > /dev/null &&
184+
docker compose up --build -d tsd > /dev/null &&
193185
cd .. &&
194186
log_success "TSD API mock rebuilt and deployed!"
195187
}
@@ -198,7 +190,6 @@ function rebuild_clearinghouse() {
198190
show_header
199191
log_step "Rebuilding clearinghouse library"
200192

201-
./gradlew :lib:clearinghouse:clean > /dev/null &&
202193
./gradlew :lib:clearinghouse:assemble > /dev/null &&
203194
log_success "Clearinghouse library rebuilt!"
204195
log_info "This library is used by localega-tsd-proxy."
@@ -212,7 +203,6 @@ function rebuild_tsd_file_api_client() {
212203
show_header
213204
log_step "Rebuilding TSD file API client"
214205

215-
./gradlew :lib:tsd-file-api-client:clean > /dev/null &&
216206
./gradlew :lib:tsd-file-api-client:assemble > /dev/null &&
217207
log_success "TSD file API client rebuilt!"
218208
log_info "This library is used by localega-tsd-proxy."
@@ -226,7 +216,6 @@ function rebuild_crypt4gh() {
226216
show_header
227217
log_step "Rebuilding crypt4gh library"
228218

229-
./gradlew :lib:crypt4gh:clean > /dev/null &&
230219
./gradlew :lib:crypt4gh:assemble > /dev/null &&
231220
log_success "Crypt4gh library rebuilt!"
232221
}

e2eTests/e2e-tests.Dockerfile

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,40 @@
1-
# Use Temurin 21 as the base image for Java 21
21
FROM eclipse-temurin:21-jdk-alpine AS builder
3-
42
WORKDIR /app
53

6-
COPY . .
4+
# Layer 1: build infrastructure (rarely changes)
5+
COPY gradlew settings.gradle.kts build.gradle.kts gradle.properties ./
6+
COPY gradle/ gradle/
7+
COPY buildSrc/ buildSrc/
8+
9+
# Layer 2: all module build files so Gradle can configure the project graph
10+
COPY lib/clearinghouse/build.gradle.kts lib/clearinghouse/
11+
COPY lib/tsd-file-api-client/build.gradle.kts lib/tsd-file-api-client/
12+
COPY lib/crypt4gh/build.gradle.kts lib/crypt4gh/
13+
COPY services/localega-tsd-proxy/build.gradle.kts services/localega-tsd-proxy/
14+
COPY services/tsd-api-mock/build.gradle.kts services/tsd-api-mock/
15+
COPY services/cega-mock/build.gradle.kts services/cega-mock/
16+
COPY services/mq-interceptor/build.gradle.kts services/mq-interceptor/
17+
COPY e2eTests/build.gradle.kts e2eTests/
18+
RUN mkdir -p cli/lega-commander
19+
20+
# Layer 3: resolve dependencies (cached until build.gradle.kts changes)
21+
RUN ./gradlew :e2eTests:dependencies --no-daemon 2>&1 || true
22+
23+
# Layer 4: source code (changes frequently — only what this module needs)
24+
COPY lib/crypt4gh/src/ lib/crypt4gh/src/
25+
COPY e2eTests/src/ e2eTests/src/
726

827
RUN ./gradlew :e2eTests:jar --no-daemon
928

1029
FROM eclipse-temurin:21-jre-alpine
1130

12-
# Install bash
1331
RUN apk add --no-cache bash
1432

15-
# Set the working directory in the container
1633
WORKDIR /fega-norway
1734

18-
# Copy the application JAR, env, and scripts
1935
COPY --from=builder /app/e2eTests/build/libs/e2eTests.jar /fega-norway/e2eTests.jar
20-
COPY --from=builder /app/e2eTests/entrypoint.sh /fega-norway/entrypoint.sh
36+
COPY e2eTests/entrypoint.sh /fega-norway/entrypoint.sh
2137

22-
# Make entrypoint executable
2338
RUN chmod +x /fega-norway/entrypoint.sh
2439

25-
# Run the entrypoint using bash
2640
CMD ["/bin/bash", "/fega-norway/entrypoint.sh"]

gradle.properties

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
org.gradle.parallel=true
2+
org.gradle.caching=true
3+
org.gradle.daemon=true
4+
org.gradle.jvmargs=-Xmx2g -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError
Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,34 @@
11
FROM eclipse-temurin:21-jdk-alpine AS builder
22
WORKDIR /app
33

4-
COPY . .
5-
RUN ./gradlew :services:localega-tsd-proxy:clean :services:localega-tsd-proxy:build -x test --no-daemon
4+
# Layer 1: build infrastructure (rarely changes)
5+
COPY gradlew settings.gradle.kts build.gradle.kts gradle.properties ./
6+
COPY gradle/ gradle/
7+
COPY buildSrc/ buildSrc/
8+
9+
# Layer 2: all module build files so Gradle can configure the project graph
10+
COPY lib/clearinghouse/build.gradle.kts lib/clearinghouse/
11+
COPY lib/tsd-file-api-client/build.gradle.kts lib/tsd-file-api-client/
12+
COPY lib/crypt4gh/build.gradle.kts lib/crypt4gh/
13+
COPY services/localega-tsd-proxy/build.gradle.kts services/localega-tsd-proxy/
14+
COPY services/tsd-api-mock/build.gradle.kts services/tsd-api-mock/
15+
COPY services/cega-mock/build.gradle.kts services/cega-mock/
16+
COPY services/mq-interceptor/build.gradle.kts services/mq-interceptor/
17+
COPY e2eTests/build.gradle.kts e2eTests/
18+
RUN mkdir -p cli/lega-commander
19+
20+
# Layer 3: resolve dependencies (cached until build.gradle.kts changes)
21+
RUN ./gradlew :services:localega-tsd-proxy:dependencies --no-daemon || true
22+
23+
# Layer 4: source code (changes frequently — only what this service needs)
24+
COPY lib/clearinghouse/src/ lib/clearinghouse/src/
25+
COPY lib/tsd-file-api-client/src/ lib/tsd-file-api-client/src/
26+
COPY services/localega-tsd-proxy/src/ services/localega-tsd-proxy/src/
27+
28+
RUN ./gradlew :services:localega-tsd-proxy:build -x test --no-daemon
629

730
FROM eclipse-temurin:21-jre-alpine
831
WORKDIR /app
9-
COPY --from=builder app/services/localega-tsd-proxy/build/libs/localega-tsd-proxy.jar /app/app.jar
32+
COPY --from=builder /app/services/localega-tsd-proxy/build/libs/localega-tsd-proxy.jar /app/app.jar
1033
EXPOSE 8080
11-
CMD ["java","-XX:+UseG1GC", "-jar","app.jar"]
34+
CMD ["java", "-XX:+UseG1GC", "-jar", "app.jar"]

services/tsd-api-mock/Dockerfile

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,33 @@
11
FROM eclipse-temurin:21-jdk-alpine AS builder
22
WORKDIR /app
33

4-
COPY . .
5-
RUN ./gradlew :services:tsd-api-mock:clean :services:tsd-api-mock:build -x test --no-daemon
4+
# Layer 1: build infrastructure (rarely changes)
5+
COPY gradlew settings.gradle.kts build.gradle.kts gradle.properties ./
6+
COPY gradle/ gradle/
7+
COPY buildSrc/ buildSrc/
8+
9+
# Layer 2: all module build files so Gradle can configure the project graph
10+
COPY lib/clearinghouse/build.gradle.kts lib/clearinghouse/
11+
COPY lib/tsd-file-api-client/build.gradle.kts lib/tsd-file-api-client/
12+
COPY lib/crypt4gh/build.gradle.kts lib/crypt4gh/
13+
COPY services/localega-tsd-proxy/build.gradle.kts services/localega-tsd-proxy/
14+
COPY services/tsd-api-mock/build.gradle.kts services/tsd-api-mock/
15+
COPY services/cega-mock/build.gradle.kts services/cega-mock/
16+
COPY services/mq-interceptor/build.gradle.kts services/mq-interceptor/
17+
COPY e2eTests/build.gradle.kts e2eTests/
18+
RUN mkdir -p cli/lega-commander
19+
20+
# Layer 3: resolve dependencies (cached until build.gradle.kts changes)
21+
RUN ./gradlew :services:tsd-api-mock:dependencies --no-daemon || true
22+
23+
# Layer 4: source code (changes frequently — only what this service needs)
24+
COPY services/tsd-api-mock/src/ services/tsd-api-mock/src/
25+
26+
RUN ./gradlew :services:tsd-api-mock:build -x test --no-daemon
627

728
FROM eclipse-temurin:21-jre-alpine
829
RUN mkdir -p /etc/jwt/public_keys
930
WORKDIR /app
10-
COPY --from=builder app/services/tsd-api-mock/build/libs/tsd-api-mock.jar /app/app.jar
31+
COPY --from=builder /app/services/tsd-api-mock/build/libs/tsd-api-mock.jar /app/app.jar
1132
EXPOSE 8080
12-
CMD ["java","-XX:+UseG1GC", "-jar","app.jar"]
33+
CMD ["java", "-XX:+UseG1GC", "-jar", "app.jar"]

0 commit comments

Comments
 (0)