Skip to content

Commit c4fe1d9

Browse files
committed
Avoid 'Directory not empty' race when removing dashboard dir
Replace 'sudo rm -rf ~/dashboard' with an atomic mv-then-delete pattern. On NFS or overlayfs, rm -rf can race against open file handles (e.g. from Docker mounts or node processes), causing ENOTEMPTY on core-js and similar deeply nested node_modules directories. The mv is atomic on the same filesystem, so the clone can proceed immediately while the old directory is cleaned up in the background.
1 parent c4bd488 commit c4fe1d9

2 files changed

Lines changed: 8 additions & 4 deletions

File tree

cypress/jenkins/Jenkinsfile

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ node('harvester-vpn-1') {
4141
stage('Pre-Clean') {
4242
sh """#!/bin/bash
4343
set +x
44-
sudo rm -rf "\${HOME}/dashboard" 2>/dev/null || true
44+
mv "\${HOME}/dashboard" "\${HOME}/dashboard.old.\$\$" 2>/dev/null || true
45+
rm -rf "\${HOME}/dashboard.old."* 2>/dev/null &
4546
rm -f "\${HOME}/.env" 2>/dev/null || true
4647
rm -rf "\${HOME}/.corral" 2>/dev/null || true
4748
docker rm -f \$(docker ps -aq --filter ancestor=dashboard-test) 2>/dev/null || true
@@ -103,8 +104,9 @@ node('harvester-vpn-1') {
103104
set +x
104105
# Remove credentials file
105106
rm -f "\${HOME}/.env" || true
106-
# Remove cloned dashboard (may have root-owned files from Docker)
107-
sudo rm -rf "\${HOME}/dashboard" || true
107+
# Remove cloned dashboard (move-then-delete avoids NFS/overlayfs race)
108+
mv "\${HOME}/dashboard" "\${HOME}/dashboard.old.\$\$" 2>/dev/null || true
109+
rm -rf "\${HOME}/dashboard.old."* 2>/dev/null || true
108110
# Remove corral config to prevent stale vars leaking between runs
109111
rm -rf "\${HOME}/.corral" || true
110112
# Remove stale Docker containers and image

cypress/jenkins/run.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ build_image() {
5353

5454
echo "Cloning ${target_branch}$([ "${target_branch}" != "master" ] && echo ', overlaying CI from master')"
5555

56-
sudo rm -rf "${HOME}"/dashboard
56+
# Move-then-delete avoids "Directory not empty" race on NFS/overlayfs
57+
mv "${HOME}/dashboard" "${HOME}/dashboard.old.$$" 2>/dev/null || true
58+
rm -rf "${HOME}/dashboard.old."* 2>/dev/null &
5759
git clone -b "${target_branch}" \
5860
"${GITHUB_URL}${DASHBOARD_REPO}" "${HOME}"/dashboard
5961

0 commit comments

Comments
 (0)