Skip to content

Commit a683bbd

Browse files
committed
Update CI to use colcon cache (ros-navigation#2343)
* Disable dockerhub workflow for testing * Disable debug jobs for testing * Disable extra rmw jobs for testing * Rename docker images for testing * Default to cache from main branch * Use colcon cache * Install colcon cache * Fix xargs typo * List names only * Checksum overlay ws src after restore and store to restore ws cache for incremental builds * Disable test jobs * Revert checksum update but use underlay src * Only cache ws build and install folder to avoide overwritting ws src folder with restore * Don't remove git files from underlay so vcs tools can export underlay to checksum * Save build cache regardless of failure * cache tests * Update colcon cache * No need to remove log folder as its no longer cached * Bypass .dockerignore for dockerhub build hooks to include .git folder in overlay for colcon cache * Simplify checkout now that underlay and overload have lockfiles * Remove overlay src folder for checkout * Echo env for debug * Use if checks for empty package sets as --packages-above with empty args will not skip any package * Save workspace log to cache * Set TEST_PACKAGES to empty instead of skipping * Update colcon cache * Update colcon cache * Explicitltly list packages to build using an environment variable * Enable debug and nightly jobs * Test all packages if cache_test is false * Revert testing fork changes * Install pip in rolling image * Rename checksum file to lockfile.txt * Config formatting * Simplify testing
1 parent e3bc536 commit a683bbd

File tree

4 files changed

+150
-50
lines changed

4 files changed

+150
-50
lines changed

.circleci/config.yml

+142-48
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,17 @@ _commands:
1212
steps:
1313
- restore_cache:
1414
name: Restore Cache << parameters.key >>
15-
key: "<< parameters.key >>-v1\
16-
-{{ arch }}\
17-
-{{ .Branch }}\
18-
-{{ .Environment.CIRCLE_PR_NUMBER }}\
19-
-{{ checksum \"<< parameters.workspace >>/checksum.txt\" }}"
15+
keys:
16+
- "<< parameters.key >>-v1\
17+
-{{ arch }}\
18+
-{{ .Branch }}\
19+
-{{ .Environment.CIRCLE_PR_NUMBER }}\
20+
-{{ checksum \"<< parameters.workspace >>/lockfile.txt\" }}"
21+
- "<< parameters.key >>-v1\
22+
-{{ arch }}\
23+
-main\
24+
-<no value>\
25+
-{{ checksum \"<< parameters.workspace >>/lockfile.txt\" }}"
2026
save_to_cache:
2127
description: "Save To Cache"
2228
parameters:
@@ -36,10 +42,12 @@ _commands:
3642
-{{ arch }}\
3743
-{{ .Branch }}\
3844
-{{ .Environment.CIRCLE_PR_NUMBER }}\
39-
-{{ checksum \"<< parameters.workspace >>/checksum.txt\" }}\
45+
-{{ checksum \"<< parameters.workspace >>/lockfile.txt\" }}\
4046
-{{ epoch }}"
4147
paths:
42-
- << parameters.path >>
48+
- << parameters.path >>/build
49+
- << parameters.path >>/install
50+
- << parameters.path >>/log
4351
when: << parameters.when >>
4452
install_dependencies:
4553
description: "Install Dependencies"
@@ -54,13 +62,13 @@ _commands:
5462
working_directory: << parameters.workspace >>
5563
command: |
5664
. << parameters.underlay >>/install/setup.sh
57-
cat << parameters.underlay >>/checksum.txt > checksum.txt
58-
vcs export --exact src | \
59-
(echo vcs_export && cat) >> checksum.txt
60-
sha256sum $PWD/checksum.txt >> checksum.txt
65+
cat << parameters.underlay >>/lockfile.txt > lockfile.txt
66+
vcs export --exact << parameters.underlay >>/src | \
67+
(echo vcs_export && cat) >> lockfile.txt
68+
sha256sum $PWD/lockfile.txt >> lockfile.txt
6169
apt-get update
6270
rosdep update
63-
71+
6472
# workarround for OMPL and rosdep
6573
# https://github.com/ompl/ompl/issues/753
6674
# Prevent searching $ROS_WS/install given it's too big for rosdep
@@ -85,8 +93,8 @@ _commands:
8593
awk -F'[][]' '{print $2}' | \
8694
tr -d \, | xargs -n1 | sort -u | xargs)
8795
dpkg -s $dependencies | \
88-
(echo workspace_dependencies && cat) >> checksum.txt
89-
sha256sum $PWD/checksum.txt >> checksum.txt
96+
(echo workspace_dependencies && cat) >> lockfile.txt
97+
sha256sum $PWD/lockfile.txt >> lockfile.txt
9098
setup_workspace:
9199
description: "Setup Workspace"
92100
parameters:
@@ -103,7 +111,7 @@ _commands:
103111
type: boolean
104112
steps:
105113
- store_artifacts:
106-
path: << parameters.workspace >>/checksum.txt
114+
path: << parameters.workspace >>/lockfile.txt
107115
- restore_from_cache:
108116
key: << parameters.key >>
109117
workspace: << parameters.workspace >>
@@ -114,21 +122,55 @@ _commands:
114122
name: Build Workspace | << parameters.workspace >>
115123
working_directory: << parameters.workspace >>
116124
command: |
117-
BUILD_UNFINISHED=$(colcon list --packages-skip-build-finished)
118-
BUILD_FAILED=$(colcon list --packages-select-build-failed)
119-
if [ -n "$BUILD_UNFINISHED" ] || [ -n "$BUILD_FAILED" ]
125+
colcon cache lock
126+
127+
BUILD_UNFINISHED=$(
128+
colcon list \
129+
--names-only \
130+
--packages-skip-build-finished \
131+
| xargs)
132+
echo BUILD_UNFINISHED: $BUILD_UNFINISHED
133+
134+
BUILD_FAILED=$(
135+
colcon list \
136+
--names-only \
137+
--packages-select-build-failed \
138+
| xargs)
139+
echo BUILD_FAILED: $BUILD_FAILED
140+
141+
BUILD_INVALID=$(
142+
colcon list \
143+
--names-only \
144+
--packages-select-cache-invalid \
145+
--packages-select-cache-key build \
146+
| xargs)
147+
echo BUILD_INVALID: $BUILD_INVALID
148+
149+
BUILD_PACKAGES=""
150+
if [ -n "$BUILD_UNFINISHED" ] || \
151+
[ -n "$BUILD_FAILED" ] || \
152+
[ -n "$BUILD_INVALID" ]
120153
then
121-
. << parameters.underlay >>/install/setup.sh
122-
rm -rf build install log
123-
colcon build \
124-
--mixin << parameters.mixins >>
125-
else
126-
echo "Skipping Build"
154+
BUILD_PACKAGES=$(
155+
colcon list \
156+
--names-only \
157+
--packages-above \
158+
$BUILD_UNFINISHED \
159+
$BUILD_FAILED \
160+
$BUILD_INVALID \
161+
| xargs)
127162
fi
163+
echo BUILD_PACKAGES: $BUILD_PACKAGES
164+
165+
. << parameters.underlay >>/install/setup.sh
166+
colcon build \
167+
--packages-select ${BUILD_PACKAGES} \
168+
--mixin << parameters.mixins >>
128169
- save_to_cache:
129170
key: << parameters.key >>
130171
path: << parameters.workspace >>
131172
workspace: << parameters.workspace >>
173+
when: always
132174
- run:
133175
name: Copy Build Logs
134176
working_directory: << parameters.workspace >>
@@ -139,28 +181,72 @@ _commands:
139181
test_workspace:
140182
description: "Test Workspace"
141183
parameters:
184+
key:
185+
type: string
142186
workspace:
143187
type: string
188+
cache_test:
189+
type: boolean
144190
steps:
145191
- run:
146192
name: Test Workspace | << parameters.workspace >>
147193
working_directory: << parameters.workspace >>
148194
command: |
149-
. install/setup.sh
195+
TEST_FAILURES=$(
196+
colcon list \
197+
--names-only \
198+
--packages-select-test-failures \
199+
| xargs)
200+
echo TEST_FAILURES: $TEST_FAILURES
201+
202+
TEST_INVALID=$(
203+
colcon list \
204+
--names-only \
205+
--packages-select-cache-invalid \
206+
--packages-select-cache-key test \
207+
| xargs)
208+
echo TEST_INVALID: $TEST_INVALID
209+
210+
TEST_PACKAGES=""
211+
if [ -n "$TEST_FAILURES" ] || \
212+
[ -n "$TEST_INVALID" ]
213+
then
214+
TEST_PACKAGES=$(
215+
colcon list \
216+
--names-only \
217+
--packages-above \
218+
$TEST_FAILURES \
219+
$TEST_INVALID)
220+
fi
221+
if ( ! << parameters.cache_test >> )
222+
then
223+
TEST_PACKAGES=$(
224+
colcon list \
225+
--names-only)
226+
fi
150227
TEST_PACKAGES=$(
151-
colcon list --names-only | \
152-
circleci tests split \
153-
--split-by=timings \
154-
--timings-type=classname \
155-
--show-counts | \
156-
xargs)
228+
echo $TEST_PACKAGES \
229+
| circleci tests split \
230+
--split-by=timings \
231+
--timings-type=classname \
232+
--show-counts \
233+
| xargs)
234+
echo TEST_PACKAGES: $TEST_PACKAGES
235+
236+
. install/setup.sh
157237
set -o xtrace
158238
colcon test \
159-
--packages-select ${TEST_PACKAGES} \
160-
--retest-until-pass ${RETEST_UNTIL_PASS} \
161-
--ctest-args --test-regex "test_.*"
239+
--packages-select ${TEST_PACKAGES}
162240
colcon test-result \
163241
--verbose
242+
- when:
243+
condition: << parameters.cache_test >>
244+
steps:
245+
- save_to_cache:
246+
key: << parameters.key >>
247+
path: << parameters.workspace >>
248+
workspace: << parameters.workspace >>
249+
when: always
164250
- run:
165251
name: Copy Test Logs
166252
working_directory: << parameters.workspace >>
@@ -211,16 +297,16 @@ _steps:
211297
run:
212298
name: Pre Checkout
213299
command: |
214-
mkdir -p $ROS_WS && cd $ROS_WS
300+
mkdir -p $ROS_WS/src && cd $ROS_WS
215301
ln -s /opt/ros/$ROS_DISTRO install
216302
echo $CACHE_NONCE | \
217-
(echo cache_nonce && cat) >> checksum.txt
218-
sha256sum $PWD/checksum.txt >> checksum.txt
303+
(echo cache_nonce && cat) >> lockfile.txt
304+
sha256sum $PWD/lockfile.txt >> lockfile.txt
219305
TZ=utc stat -c '%y' /ros_entrypoint.sh | \
220-
(echo ros_entrypoint && cat) >> checksum.txt
221-
sha256sum $PWD/checksum.txt >> checksum.txt
222-
rm -rf $OVERLAY_WS/*
306+
(echo ros_entrypoint && cat) >> lockfile.txt
307+
sha256sum $PWD/lockfile.txt >> lockfile.txt
223308
mv ~/.ccache $CCACHE_DIR
309+
rm -rf $OVERLAY_WS/src
224310
on_checkout: &on_checkout
225311
checkout:
226312
path: src/navigation2
@@ -233,11 +319,9 @@ _steps:
233319
$OVERLAY_WS/src/navigation2/tools/underlay.repos \
234320
$UNDERLAY_WS/underlay.repos >/dev/null 2>&1
235321
then
236-
echo "Cleaning Underlay"
237-
rm -rf $UNDERLAY_WS/*
322+
echo "Importing Underlay"
238323
cp $OVERLAY_WS/src/navigation2/tools/underlay.repos \
239324
$UNDERLAY_WS/underlay.repos
240-
mkdir -p $UNDERLAY_WS/src
241325
vcs import $UNDERLAY_WS/src \
242326
< $UNDERLAY_WS/underlay.repos
243327
fi
@@ -292,7 +376,9 @@ _steps:
292376
when: always
293377
test_overlay_workspace: &test_overlay_workspace
294378
test_workspace:
379+
key: overlay_ws
295380
workspace: /opt/overlay_ws
381+
cache_test: << parameters.cache_test >>
296382
collect_overlay_coverage: &collect_overlay_coverage
297383
run:
298384
name: Collect Code Coverage
@@ -360,6 +446,9 @@ commands:
360446
- *restore_overlay_workspace
361447
test_build:
362448
description: "Test Build"
449+
parameters:
450+
cache_test:
451+
type: boolean
363452
steps:
364453
- *test_overlay_workspace
365454
report_coverage:
@@ -378,14 +467,14 @@ _environments:
378467
ROS_WS: "/opt/ros_ws"
379468
UNDERLAY_WS: "/opt/underlay_ws"
380469
OVERLAY_WS: "/opt/overlay_ws"
470+
UNDERLAY_MIXINS: "release ccache"
381471
CCACHE_DIR: "/tmp/.ccache"
382472
CCACHE_LOGFILE: "/tmp/ccache.log"
383473
CCACHE_MAXSIZE: "200M"
384474
MAKEFLAGS: "-j 2 -l 2 "
385475
COLCON_DEFAULTS_FILE: "/tmp/defaults.yaml"
386476
RCUTILS_LOGGING_BUFFERED_STREAM: "0"
387477
RCUTILS_LOGGING_USE_STDOUT: "0"
388-
RETEST_UNTIL_PASS: "2"
389478
DEBIAN_FRONTEND: "noninteractive"
390479

391480
executors:
@@ -397,7 +486,6 @@ executors:
397486
<<: *common_environment
398487
CACHE_NONCE: "Debug"
399488
OVERLAY_MIXINS: "debug ccache coverage-gcc"
400-
UNDERLAY_MIXINS: "release ccache"
401489
release_exec:
402490
docker:
403491
- image: rosplanning/navigation2:main.release
@@ -406,11 +494,13 @@ executors:
406494
<<: *common_environment
407495
CACHE_NONCE: "Release"
408496
OVERLAY_MIXINS: "release ccache"
409-
UNDERLAY_MIXINS: "release ccache"
410497

411498
_jobs:
412499
job_test: &job_test
413500
parameters:
501+
cache_test:
502+
type: boolean
503+
default: false
414504
rmw:
415505
default: "rmw_cyclonedds_cpp"
416506
type: string
@@ -433,14 +523,16 @@ jobs:
433523
executor: debug_exec
434524
steps:
435525
- restore_build
436-
- test_build
526+
- test_build:
527+
cache_test: << parameters.cache_test >>
437528
- report_coverage
438529
release_test:
439530
<<: *job_test
440531
executor: release_exec
441532
steps:
442533
- restore_build
443-
- test_build
534+
- test_build:
535+
cache_test: << parameters.cache_test >>
444536
rebuild_dockerhub:
445537
executor: release_exec
446538
steps:
@@ -454,10 +546,12 @@ workflows:
454546
- debug_test:
455547
requires:
456548
- debug_build
549+
cache_test: true
457550
- release_build
458551
- release_test:
459552
requires:
460553
- release_build
554+
cache_test: true
461555
nightly:
462556
jobs:
463557
- debug_build

.dockerhub/debug/hooks/build

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/bin/bash
22
set -ex
3+
rm -rf ../../.dockerignore
34

45
export FROM_IMAGE=ros:rolling
56
export FAIL_ON_BUILD_FAILURE=""

.dockerhub/release/hooks/build

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#!/bin/bash
22
set -ex
3+
rm -rf ../../.dockerignore
34

45
export FROM_IMAGE=ros:rolling
56
export FAIL_ON_BUILD_FAILURE=""

0 commit comments

Comments
 (0)