Skip to content

Commit e3c68a8

Browse files
authored
feat: find-grained file filter for CI tests (#6)
This separates reason files from embodied files to avoid unnecessary tests. Signed-off-by: Hao Lin <linhaomails@gmail.com>
1 parent de0280a commit e3c68a8

File tree

2 files changed

+119
-14
lines changed

2 files changed

+119
-14
lines changed

.github/workflows/ci-tests.yml

Lines changed: 118 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,19 @@ jobs:
2121
check-changes:
2222
runs-on: ubuntu-latest
2323
outputs:
24-
file_filter: ${{ steps.filter.outputs.file_filter }}
2524
install_filter: ${{ steps.filter.outputs.install_filter }}
2625
docker_filter: ${{ steps.filter.outputs.docker_filter }}
26+
shared_filter: ${{ steps.filter.outputs.shared_filter }}
27+
embodied_filter: ${{ steps.filter.outputs.embodied_filter }}
28+
agent_reason_filter: ${{ steps.filter.outputs.agent_reason_filter }}
29+
unit_test_filter: ${{ steps.filter.outputs.unit_test_filter }}
30+
scheduler_test_filter: ${{ steps.filter.outputs.scheduler_test_filter }}
31+
32+
checked_files_filter: ${{ steps.filter.outputs.checked_files_filter }}
33+
all_changes_filter: ${{ steps.filter.outputs.all_changes }}
34+
checked_files_filter_files: ${{ steps.filter.outputs.checked_files_filter_files }}
35+
all_changes_filter_files: ${{ steps.filter.outputs.all_changes_filter_files }}
36+
2737
steps:
2838
- name: Checkout code
2939
uses: actions/checkout@v4
@@ -44,20 +54,113 @@ jobs:
4454
id: filter
4555
uses: dorny/paths-filter@v3
4656
with:
57+
list-files: json
4758
filters: |
48-
file_filter:
49-
- '**/*.py'
50-
- 'tests/**'
51-
- '.github/workflows/*tests.yml'
52-
- '*.yaml'
53-
install_filter:
59+
install_filter: &install
5460
- 'pyproject.toml'
5561
- 'requirements/*.sh'
5662
- 'requirements/*.txt'
5763
- '.github/workflows/install.yml'
58-
docker_filter:
59-
- 'docker/torch*/**'
64+
docker_filter: &docker
65+
- *install
66+
- 'docker/**'
6067
- '.github/workflows/docker-build.yml'
68+
shared_filter: &shared
69+
- *install
70+
- 'rlinf/scheduler/**'
71+
- 'rlinf/utils/**'
72+
- 'rlinf/workers/**'
73+
- 'rlinf/hybrid_engines/**'
74+
- 'rlinf/config.py'
75+
- 'rlinf/__init__.py'
76+
- 'rlinf/*/__init__.py'
77+
- 'toolkits/**'
78+
- '.github/workflows/ci-tests.yml'
79+
embodied_filter: &embodied
80+
- *shared
81+
- 'rlinf/envs/**'
82+
- 'rlinf/models/embodiment/**'
83+
- 'rlinf/models/worldmodel/**'
84+
- 'rlinf/runners/embodied_*.py'
85+
- 'examples/embodiment/**'
86+
- 'tests/e2e_tests/embodied/**'
87+
- '.github/workflows/embodied-e2e-tests.yml'
88+
agent_reason_filter: &agent
89+
- *shared
90+
- 'rlinf/agents/**'
91+
- 'rlinf/runners/agent_runner.py'
92+
- 'rlinf/runners/reasoning_runner.py'
93+
- 'rlinf/runners/coding_online_rl_runner.py'
94+
- 'examples/coding_online_rl/**'
95+
- 'examples/multiturn_demo/**'
96+
- 'examples/reasoning/**'
97+
- 'tests/e2e_tests/agent/**'
98+
- 'tests/e2e_tests/coding_online_rl/**'
99+
- 'tests/e2e_tests/reasoning/**'
100+
- '.github/workflows/agent-e2e-tests.yml'
101+
unit_test_filter: &unit
102+
- *shared
103+
- 'tests/unit_tests/**'
104+
- '.github/workflows/unit-tests.yml'
105+
scheduler_test_filter: &scheduler
106+
- *shared
107+
- *embodied
108+
- *agent
109+
- 'tests/e2e_tests/auto_placement/**'
110+
- 'tests/e2e_tests/dynamic_scheduler/**'
111+
- '.github/workflows/scheduler-tests.yml'
112+
checked_files_filter:
113+
- *install
114+
- *docker
115+
- *shared
116+
- *embodied
117+
- *agent
118+
- *unit
119+
- *scheduler
120+
all_changes_filter:
121+
- *install
122+
- *docker
123+
- '**/*.py'
124+
- 'tests/**'
125+
- '.github/workflows/*tests.yml'
126+
- '*.yaml'
127+
128+
# =============================================== filter coverage test ============================================
129+
130+
filter-coverage-test:
131+
needs: [check-changes]
132+
runs-on: ubuntu-latest
133+
steps:
134+
- name: Print files not covered by any CI filter
135+
run: |
136+
set -euo pipefail
137+
138+
json_input=$(cat << 'EOF'
139+
{
140+
"all": ${{ needs.check-changes.outputs.all_changes_filter_files }},
141+
"checked": ${{ needs.check-changes.outputs.checked_files_filter_files }}
142+
}
143+
EOF
144+
)
145+
146+
missing=$(echo "$json_input" | jq -r '
147+
def to_set:
148+
reduce .[] as $x ({}; .[$x] = true);
149+
150+
.all as $all
151+
| (.checked // []) as $chk
152+
| $chk | to_set as $covered
153+
| [
154+
$all[]
155+
| select((. as $p | ($covered[$p] // false)) | not)
156+
]
157+
')
158+
159+
if [ "$missing" != "[]" ]; then
160+
echo "The following changed files are not covered by any CI filter:" >&2
161+
echo "$missing" | jq -r '.[]' >&2
162+
exit 1
163+
fi
61164
62165
63166
# =============================================== install tests ====================================================
@@ -71,42 +174,43 @@ jobs:
71174

72175
docker-tests:
73176
needs: [check-changes]
74-
if: needs.check-changes.outputs.docker_filter == 'true' || needs.check-changes.outputs.install_filter == 'true'
177+
if: needs.check-changes.outputs.docker_filter == 'true'
75178
uses: ./.github/workflows/docker-build.yml
76179

77180
# =============================================== unit tests ====================================================
78181

79182
unit-tests:
80183
needs: [check-changes]
81-
if: needs.check-changes.outputs.file_filter == 'true' || needs.check-changes.outputs.install_filter == 'true'
184+
if: needs.check-changes.outputs.unit_test_filter == 'true'
82185
uses: ./.github/workflows/unit-tests.yml
83186

84187
# =============================================== agent e2e tests ====================================================
85188

86189
agent-reason-e2e-tests:
87190
needs: [check-changes]
88-
if: needs.check-changes.outputs.file_filter == 'true' || needs.check-changes.outputs.install_filter == 'true'
191+
if: needs.check-changes.outputs.agent_reason_filter == 'true'
89192
uses: ./.github/workflows/agent-e2e-tests.yml
90193

91194
# =============================================== embodied e2e tests ====================================================
92195

93196
embodied-e2e-tests:
94197
needs: [check-changes]
95-
if: needs.check-changes.outputs.file_filter == 'true' || needs.check-changes.outputs.install_filter == 'true'
198+
if: needs.check-changes.outputs.embodied_filter == 'true'
96199
uses: ./.github/workflows/embodied-e2e-tests.yml
97200

98201
# =============================================== scheduler tests ====================================================
99202

100203
scheduler-tests:
101204
needs: [check-changes]
102-
if: needs.check-changes.outputs.file_filter == 'true' || needs.check-changes.outputs.install_filter == 'true'
205+
if: needs.check-changes.outputs.scheduler_test_filter == 'true'
103206
uses: ./.github/workflows/scheduler-tests.yml
104207

105208
# =============================================== finale ====================================================
106209

107210
ci-test-finish:
108211
needs: [
109212
check-changes,
213+
filter-coverage-test,
110214
install-tests,
111215
docker-tests,
112216
unit-tests,

.github/workflows/embodied-e2e-tests.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ jobs:
285285
- name: Robocasa GRPO test
286286
timeout-minutes: 20
287287
run: |
288+
unset PYTHONPATH
288289
export REPO_PATH=$(pwd)
289290
source .venv/bin/activate
290291
bash tests/e2e_tests/embodied/run.sh robocasa_grpo_openpi

0 commit comments

Comments
 (0)