test_r_package.sh 7.03 KB
Newer Older
1
2
3
#!/bin/bash

# set up R environment
4
CRAN_MIRROR="https://cloud.r-project.org/"
5
6
R_LIB_PATH=~/Rlib
mkdir -p $R_LIB_PATH
7
export R_LIBS=$R_LIB_PATH
8
9
export PATH="$R_LIB_PATH/R/bin:$PATH"

10
11
12
13
# hack to get around this:
# https://stat.ethz.ch/pipermail/r-package-devel/2020q3/005930.html
export _R_CHECK_SYSTEM_CLOCK_=0

14
# Get details needed for installing R components
15
16
17
18
19
20
21
22
23
24
25
26
R_MAJOR_VERSION=( ${R_VERSION//./ } )
if [[ "${R_MAJOR_VERSION}" == "3" ]]; then
    export R_MAC_VERSION=3.6.3
    export R_LINUX_VERSION="3.6.3-1bionic"
    export R_APT_REPO="bionic-cran35/"
elif [[ "${R_MAJOR_VERSION}" == "4" ]]; then
    export R_MAC_VERSION=4.0.2
    export R_LINUX_VERSION="4.0.2-1.1804.0"
    export R_APT_REPO="bionic-cran40/"
else
    echo "Unrecognized R version: ${R_VERSION}"
    exit -1
27
28
fi

29
30
31
# installing precompiled R for Ubuntu
# https://cran.r-project.org/bin/linux/ubuntu/#installation
# adding steps from https://stackoverflow.com/a/56378217/3986677 to get latest version
32
if [[ $OS_NAME == "linux" ]]; then
33
34
35
    sudo apt-key adv \
        --keyserver keyserver.ubuntu.com \
        --recv-keys E298A3A825C0D65DFD57CBB651716619E084DAB9
36
    sudo add-apt-repository \
37
        "deb https://cloud.r-project.org/bin/linux/ubuntu ${R_APT_REPO}"
38
39
40
    sudo apt-get update
    sudo apt-get install \
        --no-install-recommends \
Guolin Ke's avatar
Guolin Ke committed
41
        -y --allow-downgrades \
42
            r-base-dev=${R_LINUX_VERSION} \
43
44
45
46
47
48
            texinfo \
            texlive-latex-recommended \
            texlive-fonts-recommended \
            texlive-fonts-extra \
            qpdf \
            || exit -1
49
50
51
52
53
54
55
56
57
58

    # https://github.com/r-lib/actions/issues/111
    if [[ $R_BUILD_TYPE == "cran" ]]; then
        sudo apt-get install \
            --no-install-recommends \
            -y \
                autoconf=$(cat R-package/AUTOCONF_UBUNTU_VERSION) \
                devscripts \
                || exit -1
    fi
59
60
61
62
fi

# Installing R precompiled for Mac OS 10.11 or higher
if [[ $OS_NAME == "macos" ]]; then
63
64
65
66
67
    if [[ $R_BUILD_TYPE == "cran" ]]; then
        brew install \
            automake \
            checkbashisms
    fi
68
69
70
    brew install qpdf
    brew cask install basictex
    export PATH="/Library/TeX/texbin:$PATH"
71
72
    sudo tlmgr --verify-repo=none update --self
    sudo tlmgr --verify-repo=none install inconsolata helvetic
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

    wget -q https://cran.r-project.org/bin/macosx/R-${R_MAC_VERSION}.pkg -O R.pkg
    sudo installer \
        -pkg $(pwd)/R.pkg \
        -target /

    # Fix "duplicate libomp versions" issue on Mac
    # by replacing the R libomp.dylib with a symlink to the one installed with brew
    if [[ $COMPILER == "clang" ]]; then
        ver_arr=( ${R_MAC_VERSION//./ } )
        R_MAJOR_MINOR="${ver_arr[0]}.${ver_arr[1]}"
        sudo ln -sf \
            "$(brew --cellar libomp)"/*/lib/libomp.dylib \
            /Library/Frameworks/R.framework/Versions/${R_MAJOR_MINOR}/Resources/lib/libomp.dylib
    fi
fi

conda install \
    -y \
    -q \
    --no-deps \
        pandoc

# Manually install Depends and Imports libraries + 'testthat'
# to avoid a CI-time dependency on devtools (for devtools::install_deps())
98
99
100
101
packages="c('data.table', 'jsonlite', 'Matrix', 'R6', 'testthat')"
if [[ $OS_NAME == "macos" ]]; then
    packages+=", type = 'binary'"
fi
102
Rscript --vanilla -e "install.packages(${packages}, repos = '${CRAN_MIRROR}', lib = '${R_LIB_PATH}', dependencies = c('Depends', 'Imports', 'LinkingTo'))" || exit -1
103

104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
if [[ $TASK == "r-package-check-docs" ]]; then
    Rscript build_r.R || exit -1
    Rscript --vanilla -e "install.packages('roxygen2', repos = '${CRAN_MIRROR}', lib = '${R_LIB_PATH}', dependencies = c('Depends', 'Imports', 'LinkingTo'))" || exit -1
    Rscript --vanilla -e "roxygen2::roxygenize('R-package/', load = 'installed')" || exit -1
    num_doc_files_changed=$(
        git diff --name-only | grep -E "\.Rd|NAMESPACE" | wc -l
    )
    if [[ ${num_doc_files_changed} -gt 0 ]]; then
        echo "Some R documentation files have changed. Please re-generate them and commit those changes."
        echo ""
        echo "    Rscript build_r.R"
        echo "    Rscript -e \"roxygen2::roxygenize('R-package/', load = 'installed')\""
        echo ""
        exit -1
    fi
    exit 0
fi

122
123
cd ${BUILD_DIRECTORY}

Guolin Ke's avatar
Guolin Ke committed
124
PKG_TARBALL="lightgbm_*.tar.gz"
125
LOG_FILE_NAME="lightgbm.Rcheck/00check.log"
126
127
128
129
130
131
132
if [[ $R_BUILD_TYPE == "cmake" ]]; then
    Rscript build_r.R --skip-install || exit -1
elif [[ $R_BUILD_TYPE == "cran" ]]; then

    # on Linux, we recreate configure in CI to test if
    # a change in a PR has changed configure.ac
    if [[ $OS_NAME == "linux" ]]; then
133
        ${BUILD_DIRECTORY}/R-package/recreate-configure.sh
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158

        num_files_changed=$(
            git diff --name-only | wc -l
        )
        if [[ ${num_files_changed} -gt 0 ]]; then
            echo "'configure' in the R package has changed. Please recreate it and commit the changes."
            echo "Changed files:"
            git diff --compact-summary
            echo "See R-package/README.md for details on how to recreate this script."
            echo ""
            exit -1
        fi
    fi

    ./build-cran-package.sh || exit -1

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

# fails tests if either ERRORs or WARNINGs are thrown by
# R CMD CHECK
162
check_succeeded="yes"
163
164
165
(
    R CMD check ${PKG_TARBALL} \
        --as-cran \
166
        --run-dontrun \
167
168
169
170
171
172
173
174
175
176
177
178
    || check_succeeded="no"
) &

# R CMD check suppresses output, some CIs kill builds after
# a few minutes with no output. This trick gives R CMD check more time
#     * https://github.com/travis-ci/travis-ci/issues/4190#issuecomment-169987525
#     * https://stackoverflow.com/a/29890106/3986677
CHECK_PID=$!
while kill -0 ${CHECK_PID} >/dev/null 2>&1; do
    echo -n -e " \b"
    sleep 5
done
179
180

echo "R CMD check build logs:"
181
182
BUILD_LOG_FILE=lightgbm.Rcheck/00install.out
cat ${BUILD_LOG_FILE}
183
184
185
186

if [[ $check_succeeded == "no" ]]; then
    exit -1
fi
187
188
189
190
191
192

if grep -q -R "WARNING" "$LOG_FILE_NAME"; then
    echo "WARNINGS have been found by R CMD check!"
    exit -1
fi

193
ALLOWED_CHECK_NOTES=2
194
195
196
197
198
199
200
201
202
NUM_CHECK_NOTES=$(
    cat ${LOG_FILE_NAME} \
        | grep -e '^Status: .* NOTE.*' \
        | sed 's/[^0-9]*//g'
)
if [[ ${NUM_CHECK_NOTES} -gt ${ALLOWED_CHECK_NOTES} ]]; then
    echo "Found ${NUM_CHECK_NOTES} NOTEs from R CMD check. Only ${ALLOWED_CHECK_NOTES} are allowed"
    exit -1
fi
203
204
205
206
207
208
209
210
211
212
213
214
215
216

# this check makes sure that CI builds of the CRAN package on Mac
# actually use OpenMP
if [[ $OS_NAME == "macos" ]] && [[ $R_BUILD_TYPE == "cran" ]]; then
    omp_working=$(
        cat $BUILD_LOG_FILE \
        | grep -E "checking whether OpenMP will work .*yes" \
        | wc -l
    )
    if [[ $omp_working -ne 1 ]]; then
        echo "OpenMP was not found, and should be when testing the CRAN package on macOS"
        exit -1
    fi
fi