Skip to content

Commit 562157e

Browse files
vnherdeirojameslambStrikerRUS
authored
[ci] fix shellcheck warnings in CI scripts (#6646)
Co-authored-by: James Lamb <[email protected]> Co-authored-by: Nikita Titov <[email protected]>
1 parent 7eae66a commit 562157e

File tree

3 files changed

+69
-65
lines changed

3 files changed

+69
-65
lines changed

Diff for: .ci/setup.sh

+5-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ if [[ $OS_NAME == "macos" ]]; then
2929
brew install swig
3030
fi
3131
else # Linux
32-
if type -f apt 2>&1 > /dev/null; then
32+
if type -f apt > /dev/null 2>&1; then
3333
sudo apt-get update
3434
sudo apt-get install --no-install-recommends -y \
3535
ca-certificates \
@@ -42,10 +42,10 @@ else # Linux
4242
fi
4343
CMAKE_VERSION="3.30.0"
4444
curl -O -L \
45-
https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${ARCH}.sh \
45+
"https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${ARCH}.sh" \
4646
|| exit 1
4747
sudo mkdir /opt/cmake || exit 1
48-
sudo sh cmake-${CMAKE_VERSION}-linux-${ARCH}.sh --skip-license --prefix=/opt/cmake || exit 1
48+
sudo sh "cmake-${CMAKE_VERSION}-linux-${ARCH}.sh" --skip-license --prefix=/opt/cmake || exit 1
4949
sudo ln -sf /opt/cmake/bin/cmake /usr/local/bin/cmake || exit 1
5050

5151
if [[ $IN_UBUNTU_BASE_CONTAINER == "true" ]]; then
@@ -147,8 +147,8 @@ if [[ "${TASK}" != "r-package" ]] && [[ "${TASK}" != "r-rchk" ]]; then
147147
curl \
148148
-sL \
149149
-o miniforge.sh \
150-
https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-${ARCH}.sh
151-
sh miniforge.sh -b -p $CONDA
150+
"https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-$(uname)-${ARCH}.sh"
151+
sh miniforge.sh -b -p "${CONDA}"
152152
fi
153153
conda config --set always_yes yes --set changeps1 no
154154
conda update -q -y conda

Diff for: .ci/test-r-package.sh

+14-15
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if [[ $R_BUILD_TYPE != "cran" ]]; then
1919
fi
2020

2121
# Get details needed for installing R components
22-
R_MAJOR_VERSION=( ${R_VERSION//./ } )
22+
R_MAJOR_VERSION="${R_VERSION%.*}"
2323
if [[ "${R_MAJOR_VERSION}" == "3" ]]; then
2424
export R_MAC_VERSION=3.6.3
2525
export R_MAC_PKG_URL=${CRAN_MIRROR}/bin/macosx/R-${R_MAC_VERSION}.nn.pkg
@@ -69,7 +69,7 @@ if [[ $OS_NAME == "linux" ]]; then
6969
sudo apt-get install \
7070
--no-install-recommends \
7171
-y \
72-
autoconf=$(cat R-package/AUTOCONF_UBUNTU_VERSION) \
72+
"autoconf=$(cat R-package/AUTOCONF_UBUNTU_VERSION)" \
7373
automake \
7474
|| exit 1
7575
fi
@@ -90,17 +90,17 @@ if [[ $OS_NAME == "macos" ]]; then
9090
sudo tlmgr --verify-repo=none update --self || exit 1
9191
sudo tlmgr --verify-repo=none install inconsolata helvetic rsfs || exit 1
9292

93-
curl -sL ${R_MAC_PKG_URL} -o R.pkg || exit 1
93+
curl -sL "${R_MAC_PKG_URL}" -o R.pkg || exit 1
9494
sudo installer \
95-
-pkg $(pwd)/R.pkg \
95+
-pkg "$(pwd)/R.pkg" \
9696
-target / || exit 1
9797

9898
# install tidy v5.8.0
9999
# ref: https://groups.google.com/g/r-sig-mac/c/7u_ivEj4zhM
100100
TIDY_URL=https://github.com/htacg/tidy-html5/releases/download/5.8.0/tidy-5.8.0-macos-x86_64+arm64.pkg
101101
curl -sL ${TIDY_URL} -o tidy.pkg
102102
sudo installer \
103-
-pkg $(pwd)/tidy.pkg \
103+
-pkg "$(pwd)/tidy.pkg" \
104104
-target /
105105

106106
# ensure that this newer version of 'tidy' is used by 'R CMD check'
@@ -169,34 +169,33 @@ elif [[ $R_BUILD_TYPE == "cran" ]]; then
169169
if [[ "${TASK}" == "r-rchk" ]]; then
170170
echo "Checking R-package with rchk"
171171
mkdir -p packages
172-
cp ${PKG_TARBALL} packages
172+
cp "${PKG_TARBALL}" packages
173173
RCHK_LOG_FILE="rchk-logs.txt"
174174
docker run \
175-
-v $(pwd)/packages:/rchk/packages \
175+
-v "$(pwd)/packages:/rchk/packages" \
176176
kalibera/rchk:latest \
177177
"/rchk/packages/${PKG_TARBALL}" \
178-
2>&1 > ${RCHK_LOG_FILE} \
178+
> "${RCHK_LOG_FILE}" 2>&1 \
179179
|| (cat ${RCHK_LOG_FILE} && exit 1)
180180
cat ${RCHK_LOG_FILE}
181181

182182
# the exceptions below are from R itself and not LightGBM:
183183
# https://github.com/kalibera/rchk/issues/22#issuecomment-656036156
184-
exit $(
185-
cat ${RCHK_LOG_FILE} \
186-
| grep -v "in function strptime_internal" \
184+
exit "$(
185+
grep "${RCHK_LOG_FILE}" -v "in function strptime_internal" \
187186
| grep -v "in function RunGenCollect" \
188187
| grep --count -E '\[PB\]|ERROR'
189-
)
188+
)"
190189
fi
191190

192191
# Test CRAN source .tar.gz in a directory that is not this repo or below it.
193192
# When people install.packages('lightgbm'), they won't have the LightGBM
194193
# git repo around. This is to protect against the use of relative paths
195194
# like ../../CMakeLists.txt that would only work if you are in the repo
196195
R_CMD_CHECK_DIR="${HOME}/tmp-r-cmd-check/"
197-
mkdir -p ${R_CMD_CHECK_DIR}
198-
mv ${PKG_TARBALL} ${R_CMD_CHECK_DIR}
199-
cd ${R_CMD_CHECK_DIR}
196+
mkdir -p "${R_CMD_CHECK_DIR}"
197+
mv "${PKG_TARBALL}" "${R_CMD_CHECK_DIR}"
198+
cd "${R_CMD_CHECK_DIR}"
200199
fi
201200

202201
declare -i allowed_notes=0

Diff for: .ci/test.sh

+50-45
Original file line numberDiff line numberDiff line change
@@ -48,26 +48,30 @@ if [[ "${TASK}" == "r-package" ]] || [[ "${TASK}" == "r-rchk" ]]; then
4848
fi
4949

5050
if [[ "$TASK" == "cpp-tests" ]]; then
51+
cmake_args=(
52+
-DBUILD_CPP_TEST=ON
53+
-DUSE_OPENMP=OFF
54+
-DUSE_DEBUG=ON
55+
)
5156
if [[ $METHOD == "with-sanitizers" ]]; then
52-
extra_cmake_opts="-DUSE_SANITIZER=ON"
57+
cmake_args+=("-DUSE_SANITIZER=ON")
5358
if [[ -n $SANITIZERS ]]; then
54-
extra_cmake_opts="$extra_cmake_opts -DENABLED_SANITIZERS=$SANITIZERS"
59+
cmake_args+=("-DENABLED_SANITIZERS=$SANITIZERS")
5560
fi
56-
else
57-
extra_cmake_opts=""
5861
fi
59-
cmake -B build -S . -DBUILD_CPP_TEST=ON -DUSE_OPENMP=OFF -DUSE_DEBUG=ON $extra_cmake_opts
62+
cmake -B build -S . "${cmake_args[@]}"
6063
cmake --build build --target testlightgbm -j4 || exit 1
6164
./testlightgbm || exit 1
6265
exit 0
6366
fi
6467

6568
# including python=version[build=*cpython] to ensure that conda doesn't fall back to pypy
66-
CONDA_PYTHON_REQUIREMENT="python=$PYTHON_VERSION[build=*cpython]"
69+
CONDA_PYTHON_REQUIREMENT="python=${PYTHON_VERSION}[build=*cpython]"
6770

6871
if [[ $TASK == "if-else" ]]; then
69-
conda create -q -y -n $CONDA_ENV ${CONDA_PYTHON_REQUIREMENT} numpy
70-
source activate $CONDA_ENV
72+
conda create -q -y -n "${CONDA_ENV}" "${CONDA_PYTHON_REQUIREMENT}" numpy
73+
# shellcheck disable=SC1091
74+
source activate "${CONDA_ENV}"
7175
cmake -B build -S . || exit 1
7276
cmake --build build --target lightgbm -j4 || exit 1
7377
cd "$BUILD_DIRECTORY/tests/cpp_tests"
@@ -89,14 +93,14 @@ if [[ $TASK == "swig" ]]; then
8993
python ./.ci/check-dynamic-dependencies.py ./objdump.log || exit 1
9094
fi
9195
if [[ $PRODUCES_ARTIFACTS == "true" ]]; then
92-
cp ./build/lightgbmlib.jar $BUILD_ARTIFACTSTAGINGDIRECTORY/lightgbmlib_$OS_NAME.jar
96+
cp ./build/lightgbmlib.jar "${BUILD_ARTIFACTSTAGINGDIRECTORY}/lightgbmlib_${OS_NAME}.jar"
9397
fi
9498
exit 0
9599
fi
96100

97101
if [[ $TASK == "lint" ]]; then
98-
conda create -q -y -n $CONDA_ENV \
99-
${CONDA_PYTHON_REQUIREMENT} \
102+
conda create -q -y -n "${CONDA_ENV}" \
103+
"${CONDA_PYTHON_REQUIREMENT}" \
100104
'cmakelint>=1.4.3' \
101105
'cpplint>=1.6.0' \
102106
'matplotlib-base>=3.9.1' \
@@ -105,7 +109,8 @@ if [[ $TASK == "lint" ]]; then
105109
'pyarrow-core>=17.0' \
106110
'scikit-learn>=1.5.2' \
107111
'r-lintr>=3.1.2'
108-
source activate $CONDA_ENV
112+
# shellcheck disable=SC1091
113+
source activate "${CONDA_ENV}"
109114
echo "Linting Python code"
110115
bash ./.ci/lint-python.sh || exit 1
111116
echo "Linting R code"
@@ -116,32 +121,31 @@ if [[ $TASK == "lint" ]]; then
116121
fi
117122

118123
if [[ $TASK == "check-docs" ]] || [[ $TASK == "check-links" ]]; then
119-
cd "${BUILD_DIRECTORY}/docs"
120124
conda env create \
121-
-n $CONDA_ENV \
122-
--file ./env.yml || exit 1
125+
-n "${CONDA_ENV}" \
126+
--file ./docs/env.yml || exit 1
123127
conda install \
124128
-q \
125129
-y \
126-
-n $CONDA_ENV \
130+
-n "${CONDA_ENV}" \
127131
'doxygen>=1.10.0' \
128132
'rstcheck>=6.2.4' || exit 1
129-
source activate $CONDA_ENV
133+
# shellcheck disable=SC1091
134+
source activate "${CONDA_ENV}"
130135
# check reStructuredText formatting
131-
cd "${BUILD_DIRECTORY}/python-package"
132-
rstcheck --report-level warning $(find . -type f -name "*.rst") || exit 1
133-
cd "${BUILD_DIRECTORY}/docs"
134-
rstcheck --report-level warning --ignore-directives=autoclass,autofunction,autosummary,doxygenfile $(find . -type f -name "*.rst") || exit 1
136+
find "${BUILD_DIRECTORY}/python-package" -type f -name "*.rst" \
137+
-exec rstcheck --report-level warning {} \+ || exit 1
138+
find "${BUILD_DIRECTORY}/docs" -type f -name "*.rst" \
139+
-exec rstcheck --report-level warning --ignore-directives=autoclass,autofunction,autosummary,doxygenfile {} \+ || exit 1
135140
# build docs
136-
make html || exit 1
141+
make -C docs html || exit 1
137142
if [[ $TASK == "check-links" ]]; then
138143
# check docs for broken links
139144
pip install linkchecker
140-
linkchecker --config=.linkcheckerrc ./_build/html/*.html || exit 1
145+
linkchecker --config=.linkcheckerrc ./docs/_build/html/*.html || exit 1
141146
exit 0
142147
fi
143148
# check the consistency of parameters' descriptions and other stuff
144-
cd "${BUILD_DIRECTORY}"
145149
cp ./docs/Parameters.rst ./docs/Parameters-backup.rst
146150
cp ./src/io/config_auto.cpp ./src/io/config_auto-backup.cpp
147151
python ./.ci/parameter-generator.py || exit 1
@@ -151,30 +155,31 @@ if [[ $TASK == "check-docs" ]] || [[ $TASK == "check-links" ]]; then
151155
fi
152156

153157
if [[ $PYTHON_VERSION == "3.7" ]]; then
154-
CONDA_REQUIREMENT_FILES="--file ${BUILD_DIRECTORY}/.ci/conda-envs/ci-core-py37.txt"
158+
CONDA_REQUIREMENT_FILE="${BUILD_DIRECTORY}/.ci/conda-envs/ci-core-py37.txt"
155159
elif [[ $PYTHON_VERSION == "3.8" ]]; then
156-
CONDA_REQUIREMENT_FILES="--file ${BUILD_DIRECTORY}/.ci/conda-envs/ci-core-py38.txt"
160+
CONDA_REQUIREMENT_FILE="${BUILD_DIRECTORY}/.ci/conda-envs/ci-core-py38.txt"
157161
else
158-
CONDA_REQUIREMENT_FILES="--file ${BUILD_DIRECTORY}/.ci/conda-envs/ci-core.txt"
162+
CONDA_REQUIREMENT_FILE="${BUILD_DIRECTORY}/.ci/conda-envs/ci-core.txt"
159163
fi
160164

161165
conda create \
162166
-y \
163-
-n $CONDA_ENV \
164-
${CONDA_REQUIREMENT_FILES} \
165-
${CONDA_PYTHON_REQUIREMENT} \
167+
-n "${CONDA_ENV}" \
168+
--file "${CONDA_REQUIREMENT_FILE}" \
169+
"${CONDA_PYTHON_REQUIREMENT}" \
166170
|| exit 1
167171

172+
# shellcheck disable=SC1091
168173
source activate $CONDA_ENV
169174

170175
cd "${BUILD_DIRECTORY}"
171176

172177
if [[ $TASK == "sdist" ]]; then
173178
sh ./build-python.sh sdist || exit 1
174179
sh .ci/check-python-dists.sh ./dist || exit 1
175-
pip install ./dist/lightgbm-$LGB_VER.tar.gz -v || exit 1
180+
pip install "./dist/lightgbm-${LGB_VER}.tar.gz" -v || exit 1
176181
if [[ $PRODUCES_ARTIFACTS == "true" ]]; then
177-
cp ./dist/lightgbm-$LGB_VER.tar.gz $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
182+
cp "./dist/lightgbm-${LGB_VER}.tar.gz" "${BUILD_ARTIFACTSTAGINGDIRECTORY}" || exit 1
178183
fi
179184
pytest ./tests/python_package_test || exit 1
180185
exit 0
@@ -183,7 +188,7 @@ elif [[ $TASK == "bdist" ]]; then
183188
sh ./build-python.sh bdist_wheel || exit 1
184189
sh .ci/check-python-dists.sh ./dist || exit 1
185190
if [[ $PRODUCES_ARTIFACTS == "true" ]]; then
186-
cp dist/lightgbm-$LGB_VER-py3-none-macosx*.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
191+
cp "$(echo "dist/lightgbm-${LGB_VER}-py3-none-macosx"*.whl)" "${BUILD_ARTIFACTSTAGINGDIRECTORY}" || exit 1
187192
fi
188193
else
189194
if [[ $ARCH == "x86_64" ]]; then
@@ -199,10 +204,10 @@ elif [[ $TASK == "bdist" ]]; then
199204
./dist/tmp.whl || exit 1
200205
mv \
201206
./dist/tmp.whl \
202-
./dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl || exit 1
207+
"./dist/lightgbm-${LGB_VER}-py3-none-${PLATFORM}.whl" || exit 1
203208
sh .ci/check-python-dists.sh ./dist || exit 1
204209
if [[ $PRODUCES_ARTIFACTS == "true" ]]; then
205-
cp dist/lightgbm-$LGB_VER-py3-none-$PLATFORM.whl $BUILD_ARTIFACTSTAGINGDIRECTORY || exit 1
210+
cp "dist/lightgbm-${LGB_VER}-py3-none-${PLATFORM}.whl" "${BUILD_ARTIFACTSTAGINGDIRECTORY}" || exit 1
206211
fi
207212
# Make sure we can do both CPU and GPU; see tests/python_package_test/test_dual.py
208213
export LIGHTGBM_TEST_DUAL_CPU_GPU=1
@@ -221,14 +226,14 @@ if [[ $TASK == "gpu" ]]; then
221226
pip install \
222227
-v \
223228
--config-settings=cmake.define.USE_GPU=ON \
224-
./dist/lightgbm-$LGB_VER.tar.gz \
229+
"./dist/lightgbm-${LGB_VER}.tar.gz" \
225230
|| exit 1
226231
pytest ./tests/python_package_test || exit 1
227232
exit 0
228233
elif [[ $METHOD == "wheel" ]]; then
229234
sh ./build-python.sh bdist_wheel --gpu || exit 1
230235
sh ./.ci/check-python-dists.sh ./dist || exit 1
231-
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
236+
pip install "$(echo "./dist/lightgbm-${LGB_VER}"*.whl)" -v || exit 1
232237
pytest ./tests || exit 1
233238
exit 0
234239
elif [[ $METHOD == "source" ]]; then
@@ -246,14 +251,14 @@ elif [[ $TASK == "cuda" ]]; then
246251
pip install \
247252
-v \
248253
--config-settings=cmake.define.USE_CUDA=ON \
249-
./dist/lightgbm-$LGB_VER.tar.gz \
254+
"./dist/lightgbm-${LGB_VER}.tar.gz" \
250255
|| exit 1
251256
pytest ./tests/python_package_test || exit 1
252257
exit 0
253258
elif [[ $METHOD == "wheel" ]]; then
254259
sh ./build-python.sh bdist_wheel --cuda || exit 1
255260
sh ./.ci/check-python-dists.sh ./dist || exit 1
256-
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
261+
pip install "$(echo "./dist/lightgbm-${LGB_VER}"*.whl)" -v || exit 1
257262
pytest ./tests || exit 1
258263
exit 0
259264
elif [[ $METHOD == "source" ]]; then
@@ -266,14 +271,14 @@ elif [[ $TASK == "mpi" ]]; then
266271
pip install \
267272
-v \
268273
--config-settings=cmake.define.USE_MPI=ON \
269-
./dist/lightgbm-$LGB_VER.tar.gz \
274+
"./dist/lightgbm-${LGB_VER}.tar.gz" \
270275
|| exit 1
271276
pytest ./tests/python_package_test || exit 1
272277
exit 0
273278
elif [[ $METHOD == "wheel" ]]; then
274279
sh ./build-python.sh bdist_wheel --mpi || exit 1
275280
sh ./.ci/check-python-dists.sh ./dist || exit 1
276-
pip install ./dist/lightgbm-$LGB_VER*.whl -v || exit 1
281+
pip install "$(echo "./dist/lightgbm-${LGB_VER}"*.whl)" -v || exit 1
277282
pytest ./tests || exit 1
278283
exit 0
279284
elif [[ $METHOD == "source" ]]; then
@@ -291,13 +296,13 @@ pytest ./tests || exit 1
291296
if [[ $TASK == "regular" ]]; then
292297
if [[ $PRODUCES_ARTIFACTS == "true" ]]; then
293298
if [[ $OS_NAME == "macos" ]]; then
294-
cp ./lib_lightgbm.dylib $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.dylib
299+
cp ./lib_lightgbm.dylib "${BUILD_ARTIFACTSTAGINGDIRECTORY}/lib_lightgbm.dylib"
295300
else
296301
if [[ $COMPILER == "gcc" ]]; then
297302
objdump -T ./lib_lightgbm.so > ./objdump.log || exit 1
298303
python ./.ci/check-dynamic-dependencies.py ./objdump.log || exit 1
299304
fi
300-
cp ./lib_lightgbm.so $BUILD_ARTIFACTSTAGINGDIRECTORY/lib_lightgbm.so
305+
cp ./lib_lightgbm.so "${BUILD_ARTIFACTSTAGINGDIRECTORY}/lib_lightgbm.so"
301306
fi
302307
fi
303308
cd "$BUILD_DIRECTORY/examples/python-guide"
@@ -311,10 +316,10 @@ matplotlib.use\(\"Agg\"\)\
311316
'h5py>=3.10' \
312317
'ipywidgets>=8.1.2' \
313318
'notebook>=7.1.2'
314-
for f in *.py **/*.py; do python $f || exit 1; done # run all examples
319+
for f in *.py **/*.py; do python "${f}" || exit 1; done # run all examples
315320
cd "$BUILD_DIRECTORY/examples/python-guide/notebooks"
316321
sed -i'.bak' 's/INTERACTIVE = False/assert False, \\"Interactive mode disabled\\"/' interactive_plot_example.ipynb
317-
jupyter nbconvert --ExecutePreprocessor.timeout=180 --to notebook --execute --inplace *.ipynb || exit 1 # run all notebooks
322+
jupyter nbconvert --ExecutePreprocessor.timeout=180 --to notebook --execute --inplace ./*.ipynb || exit 1 # run all notebooks
318323

319324
# importing the library should succeed even if all optional dependencies are not present
320325
conda uninstall -n $CONDA_ENV --force --yes \

0 commit comments

Comments
 (0)