.vsts-ci.yml 13.5 KB
Newer Older
1
2
3
trigger:
  branches:
    include:
4
    - master
5
6
7
  tags:
    include:
    - v*
8
9
pr:
- master
10
variables:
11
  AZURE: 'true'
12
  PYTHON_VERSION: '3.10'
13
  CONDA_ENV: test-env
14
15
16
resources:
  containers:
  - container: ubuntu1404
17
    image: lightgbm/vsts-agent:ubuntu-14.04
18
19
20
  - container: ubuntu-latest
    image: 'ubuntu:latest'
    options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
21
  - container: rbase
22
    image: wch1/r-debug
23
jobs:
Guolin Ke's avatar
Guolin Ke committed
24
###########################################
25
- job: Linux
Guolin Ke's avatar
Guolin Ke committed
26
###########################################
27
  variables:
28
    COMPILER: gcc
29
    SETUP_CONDA: 'false'
30
31
    OS_NAME: 'linux'
    PRODUCES_ARTIFACTS: 'true'
32
  pool: sh-ubuntu
33
  container: ubuntu1404
34
  strategy:
Guolin Ke's avatar
Guolin Ke committed
35
36
37
    matrix:
      regular:
        TASK: regular
38
        PYTHON_VERSION: '3.9'
Guolin Ke's avatar
Guolin Ke committed
39
40
      sdist:
        TASK: sdist
41
        PYTHON_VERSION: '3.7'
Guolin Ke's avatar
Guolin Ke committed
42
43
      bdist:
        TASK: bdist
44
        PYTHON_VERSION: '3.8'
45
46
47
48
49
      inference:
        TASK: if-else
      mpi_source:
        TASK: mpi
        METHOD: source
50
        PYTHON_VERSION: '3.8'
51
52
      gpu_source:
        TASK: gpu
Guolin Ke's avatar
Guolin Ke committed
53
        METHOD: source
54
55
        # on Ubuntu 14.04, gpu_source build segfaults with newer version of Python
        # (and newer version of scipy as a consequence)
56
        PYTHON_VERSION: '3.7'
57
58
      swig:
        TASK: swig
Guolin Ke's avatar
Guolin Ke committed
59
  steps:
60
  - script: |
61
      echo "##vso[task.setvariable variable=BUILD_DIRECTORY]$BUILD_SOURCESDIRECTORY"
62
      echo "##vso[task.setvariable variable=LGB_VER]$(head -n 1 VERSION.txt)"
Nikita Titov's avatar
Nikita Titov committed
63
64
      echo "##vso[task.prependpath]$CONDA/bin"
      AMDAPPSDK_PATH=$BUILD_SOURCESDIRECTORY/AMDAPPSDK
65
66
67
68
69
      echo "##vso[task.setvariable variable=AMDAPPSDK_PATH]$AMDAPPSDK_PATH"
      LD_LIBRARY_PATH=$AMDAPPSDK_PATH/lib/x86_64:$LD_LIBRARY_PATH
      echo "##vso[task.setvariable variable=LD_LIBRARY_PATH]$LD_LIBRARY_PATH"
      echo "##vso[task.setvariable variable=OPENCL_VENDOR_PATH]$AMDAPPSDK_PATH/etc/OpenCL/vendors"
    displayName: 'Set variables'
70
71
72
  - script: |
      echo '$(Build.SourceVersion)' > '$(Build.ArtifactStagingDirectory)/commit.txt'
    displayName: 'Add commit hash to artifacts archive'
73
  - bash: $(Build.SourcesDirectory)/.ci/setup.sh
74
    displayName: Setup
75
  - bash: $(Build.SourcesDirectory)/.ci/test.sh
76
    displayName: Test
Nikita Titov's avatar
Nikita Titov committed
77
  - task: PublishBuildArtifacts@1
78
    condition: and(succeeded(), in(variables['TASK'], 'regular', 'sdist', 'bdist', 'swig'), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
Nikita Titov's avatar
Nikita Titov committed
79
80
81
82
    inputs:
      pathtoPublish: '$(Build.ArtifactStagingDirectory)'
      artifactName: PackageAssets
      artifactType: container
Guolin Ke's avatar
Guolin Ke committed
83
###########################################
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
- job: Linux_latest
###########################################
  variables:
    COMPILER: clang
    DEBIAN_FRONTEND: 'noninteractive'
    IN_UBUNTU_LATEST_CONTAINER: 'true'
    OS_NAME: 'linux'
    SETUP_CONDA: 'true'
  pool: sh-ubuntu
  container: ubuntu-latest
  strategy:
    matrix:
      regular:
        TASK: regular
      sdist:
        TASK: sdist
      bdist:
        TASK: bdist
102
        PYTHON_VERSION: '3.8'
103
104
105
106
107
108
109
110
      inference:
        TASK: if-else
      mpi_source:
        TASK: mpi
        METHOD: source
      mpi_pip:
        TASK: mpi
        METHOD: pip
111
        PYTHON_VERSION: '3.9'
112
113
114
      mpi_wheel:
        TASK: mpi
        METHOD: wheel
115
        PYTHON_VERSION: '3.7'
116
117
118
      gpu_source:
        TASK: gpu
        METHOD: source
119
        PYTHON_VERSION: '3.9'
120
121
122
      gpu_pip:
        TASK: gpu
        METHOD: pip
123
        PYTHON_VERSION: '3.8'
124
125
126
      gpu_wheel:
        TASK: gpu
        METHOD: wheel
127
        PYTHON_VERSION: '3.7'
128
129
130
      cpp_tests:
        TASK: cpp-tests
        METHOD: with-sanitizers
131
132
133
134
  steps:
  - script: |
      echo "##vso[task.setvariable variable=BUILD_DIRECTORY]$BUILD_SOURCESDIRECTORY"
      echo "##vso[task.setvariable variable=LGB_VER]$(head -n 1 VERSION.txt)"
135
      CONDA=$HOME/miniforge
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
      echo "##vso[task.setvariable variable=CONDA]$CONDA"
      echo "##vso[task.prependpath]$CONDA/bin"
      AMDAPPSDK_PATH=$BUILD_SOURCESDIRECTORY/AMDAPPSDK
      echo "##vso[task.setvariable variable=AMDAPPSDK_PATH]$AMDAPPSDK_PATH"
      LD_LIBRARY_PATH=$AMDAPPSDK_PATH/lib/x86_64:$LD_LIBRARY_PATH
      echo "##vso[task.setvariable variable=LD_LIBRARY_PATH]$LD_LIBRARY_PATH"
      echo "##vso[task.setvariable variable=OPENCL_VENDOR_PATH]$AMDAPPSDK_PATH/etc/OpenCL/vendors"
    displayName: 'Set variables'
  # https://github.com/microsoft/azure-pipelines-agent/issues/2043#issuecomment-687983301
  - script: |
      /tmp/docker exec -t -u 0 ci-container \
      sh -c "apt-get update && apt-get -o Dpkg::Options::="--force-confold" -y install sudo"
    displayName: 'Install sudo'
  - bash: $(Build.SourcesDirectory)/.ci/setup.sh
    displayName: Setup
  - bash: $(Build.SourcesDirectory)/.ci/test.sh
    displayName: Test
###########################################
154
155
156
157
158
159
160
161
- job: QEMU_multiarch
###########################################
  variables:
    COMPILER: gcc
    OS_NAME: 'linux'
    PRODUCES_ARTIFACTS: 'true'
  pool:
    vmImage: ubuntu-latest
162
  timeoutInMinutes: 180
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  strategy:
    matrix:
      bdist:
        TASK: bdist
        ARCH: aarch64
  steps:
  - script: |
      sudo apt-get update
      sudo apt-get install --no-install-recommends -y \
        binfmt-support \
        qemu \
        qemu-user \
        qemu-user-static
    displayName: 'Install QEMU'
  - script: |
      docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    displayName: 'Enable Docker multi-architecture support'
  - script: |
      export ROOT_DOCKER_FOLDER=/LightGBM
      cat > docker.env <<EOF
      AZURE=$AZURE
      OS_NAME=$OS_NAME
      COMPILER=$COMPILER
      TASK=$TASK
      METHOD=$METHOD
      CONDA_ENV=$CONDA_ENV
      PYTHON_VERSION=$PYTHON_VERSION
      BUILD_DIRECTORY=$ROOT_DOCKER_FOLDER
      LGB_VER=$(head -n 1 VERSION.txt)
      PRODUCES_ARTIFACTS=$PRODUCES_ARTIFACTS
      BUILD_ARTIFACTSTAGINGDIRECTORY=$BUILD_ARTIFACTSTAGINGDIRECTORY
      EOF
      cat > docker-script.sh <<EOF
196
      export CONDA=\$HOME/miniforge
197
198
199
200
      export PATH=\$CONDA/bin:\$PATH
      $ROOT_DOCKER_FOLDER/.ci/setup.sh || exit -1
      $ROOT_DOCKER_FOLDER/.ci/test.sh || exit -1
      EOF
201
202
      IMAGE_URI="quay.io/pypa/manylinux2014_${ARCH}"
      docker pull "${IMAGE_URI}" || exit -1
203
      PLATFORM=$(docker inspect --format='{{.Os}}/{{.Architecture}}' "${IMAGE_URI}") || exit -1
204
      echo "detected image platform: ${PLATFORM}"
205
      docker run \
206
        --platform "${PLATFORM}" \
207
208
209
210
        --rm \
        --env-file docker.env \
        -v "$(Build.SourcesDirectory)":"$ROOT_DOCKER_FOLDER" \
        -v "$(Build.ArtifactStagingDirectory)":"$(Build.ArtifactStagingDirectory)" \
211
        "${IMAGE_URI}" \
212
213
214
215
216
217
218
219
220
        /bin/bash $ROOT_DOCKER_FOLDER/docker-script.sh
    displayName: 'Setup and run tests'
  - task: PublishBuildArtifacts@1
    condition: and(succeeded(), in(variables['TASK'], 'bdist'), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
    inputs:
      pathtoPublish: '$(Build.ArtifactStagingDirectory)'
      artifactName: PackageAssets
      artifactType: container
###########################################
221
- job: macOS
Guolin Ke's avatar
Guolin Ke committed
222
###########################################
223
  variables:
224
    COMPILER: clang
225
226
    OS_NAME: 'macos'
    PRODUCES_ARTIFACTS: 'true'
227
  pool:
228
    vmImage: 'macOS-10.15'
229
  strategy:
Guolin Ke's avatar
Guolin Ke committed
230
231
232
    matrix:
      regular:
        TASK: regular
233
        PYTHON_VERSION: '3.7'
Guolin Ke's avatar
Guolin Ke committed
234
235
      sdist:
        TASK: sdist
236
        PYTHON_VERSION: '3.8'
Guolin Ke's avatar
Guolin Ke committed
237
238
      bdist:
        TASK: bdist
239
240
      swig:
        TASK: swig
241
242
      cpp_tests:
        TASK: cpp-tests
243
244
        METHOD: with-sanitizers
        SANITIZERS: "address;undefined"
Guolin Ke's avatar
Guolin Ke committed
245
  steps:
246
  - script: |
247
      echo "##vso[task.setvariable variable=BUILD_DIRECTORY]$BUILD_SOURCESDIRECTORY"
248
      echo "##vso[task.setvariable variable=LGB_VER]$(head -n 1 VERSION.txt)"
249
      CONDA=$AGENT_HOMEDIRECTORY/miniforge
Nikita Titov's avatar
Nikita Titov committed
250
251
      echo "##vso[task.setvariable variable=CONDA]$CONDA"
      echo "##vso[task.prependpath]$CONDA/bin"
252
      echo "##vso[task.setvariable variable=JAVA_HOME]$JAVA_HOME_8_X64"
253
    displayName: 'Set variables'
254
  - bash: $(Build.SourcesDirectory)/.ci/setup.sh
255
    displayName: Setup
256
  - bash: $(Build.SourcesDirectory)/.ci/test.sh
257
    displayName: Test
Guolin Ke's avatar
Guolin Ke committed
258
  - task: PublishBuildArtifacts@1
259
    condition: and(succeeded(), in(variables['TASK'], 'regular', 'bdist', 'swig'), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
Guolin Ke's avatar
Guolin Ke committed
260
    inputs:
261
      pathtoPublish: '$(Build.ArtifactStagingDirectory)'
Guolin Ke's avatar
Guolin Ke committed
262
263
264
      artifactName: PackageAssets
      artifactType: container
###########################################
265
- job: Windows
Guolin Ke's avatar
Guolin Ke committed
266
###########################################
267
  pool:
268
    vmImage: 'windows-2019'
269
  strategy:
Guolin Ke's avatar
Guolin Ke committed
270
271
272
    matrix:
      regular:
        TASK: regular
273
        PYTHON_VERSION: '3.9'
Guolin Ke's avatar
Guolin Ke committed
274
275
      sdist:
        TASK: sdist
276
        PYTHON_VERSION: '3.8'
Guolin Ke's avatar
Guolin Ke committed
277
278
      bdist:
        TASK: bdist
279
280
      swig:
        TASK: swig
281
282
      cpp_tests:
        TASK: cpp-tests
Guolin Ke's avatar
Guolin Ke committed
283
  steps:
284
285
286
  - powershell: |
      Write-Host "##vso[task.prependpath]$env:CONDA\Scripts"
    displayName: 'Set Variables'
287
288
  - script: |
      cmd /c "powershell -ExecutionPolicy Bypass -File %BUILD_SOURCESDIRECTORY%/.ci/install_opencl.ps1"
289
    condition: eq(variables['TASK'], 'bdist')
290
    displayName: 'Install OpenCL'
Nikita Titov's avatar
Nikita Titov committed
291
  - script: |
292
293
      cmd /c "conda config --add channels conda-forge"
      cmd /c "conda config --set channel_priority strict"
294
295
      cmd /c "conda init powershell"
      cmd /c "powershell -ExecutionPolicy Bypass -File %BUILD_SOURCESDIRECTORY%/.ci/test_windows.ps1"
296
    displayName: Test
Guolin Ke's avatar
Guolin Ke committed
297
  - task: PublishBuildArtifacts@1
298
    condition: and(succeeded(), in(variables['TASK'], 'regular', 'bdist', 'swig'), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
Guolin Ke's avatar
Guolin Ke committed
299
    inputs:
300
      pathtoPublish: '$(Build.ArtifactStagingDirectory)'
Guolin Ke's avatar
Guolin Ke committed
301
302
      artifactName: PackageAssets
      artifactType: container
303
304
305
306
307
308
309
310
311
312
###########################################
- job: R_artifact
###########################################
  condition: not(startsWith(variables['Build.SourceBranch'], 'refs/pull/'))
  pool:
    vmImage: 'ubuntu-latest'
  container: rbase
  steps:
  - script: |
      LGB_VER=$(head -n 1 VERSION.txt | sed "s/rc/-/g")
313
314
315
316
317
      R_LIB_PATH=~/Rlib
      export R_LIBS=${R_LIB_PATH}
      mkdir -p ${R_LIB_PATH}
      RDscript -e "install.packages(c('R6', 'data.table', 'jsonlite', 'knitr', 'Matrix', 'rmarkdown'),  lib = '${R_LIB_PATH}', dependencies = c('Depends', 'Imports', 'LinkingTo'), repos = 'https://cran.r-project.org', Ncpus = parallel::detectCores())" || exit -1
      sh build-cran-package.sh --r-executable=RD || exit -1
318
319
320
321
322
323
324
325
      mv lightgbm_${LGB_VER}.tar.gz $(Build.ArtifactStagingDirectory)/lightgbm-${LGB_VER}-r-cran.tar.gz
    displayName: 'Build CRAN R-package'
  - task: PublishBuildArtifacts@1
    condition: succeeded()
    inputs:
      pathtoPublish: $(Build.ArtifactStagingDirectory)
      artifactName: R-package
      artifactType: container
Guolin Ke's avatar
Guolin Ke committed
326

327
###########################################
328
- job: Package
329
###########################################
Guolin Ke's avatar
Guolin Ke committed
330
331
  dependsOn:
  - Linux
332
  - Linux_latest
333
  - QEMU_multiarch
334
  - macOS
Guolin Ke's avatar
Guolin Ke committed
335
  - Windows
336
  - R_artifact
337
  condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
338
  pool:
339
    vmImage: 'ubuntu-latest'
Guolin Ke's avatar
Guolin Ke committed
340
  steps:
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
  # Create archives with complete source code included (with git submodules)
  - task: ArchiveFiles@2
    displayName: Create zip archive
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
    inputs:
      rootFolderOrFile: $(Build.SourcesDirectory)
      includeRootFolder: false
      archiveType: zip
      archiveFile: '$(Build.ArtifactStagingDirectory)/archives/LightGBM-complete_source_code_zip.zip'
      replaceExistingArchive: true
  - task: ArchiveFiles@2
    displayName: Create tar.gz archive
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
    inputs:
      rootFolderOrFile: $(Build.SourcesDirectory)
      includeRootFolder: false
      archiveType: tar
      tarCompression: gz
      archiveFile: '$(Build.ArtifactStagingDirectory)/archives/LightGBM-complete_source_code_tar_gz.tar.gz'
      replaceExistingArchive: true
Guolin Ke's avatar
Guolin Ke committed
361
362
363
364
365
366
  # Download all agent packages from all previous phases
  - task: DownloadBuildArtifacts@0
    displayName: Download package assets
    inputs:
      artifactName: PackageAssets
      downloadPath: $(Build.SourcesDirectory)/binaries
367
368
369
370
371
372
  - task: DownloadBuildArtifacts@0
    displayName: Download R-package
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
    inputs:
      artifactName: R-package
      downloadPath: $(Build.SourcesDirectory)/R
Guolin Ke's avatar
Guolin Ke committed
373
  - script: |
374
      python "$(Build.SourcesDirectory)/.nuget/create_nuget.py" "$(Build.SourcesDirectory)/binaries/PackageAssets"
375
376
377
378
379
    displayName: 'Create NuGet configuration files'
  - task: NuGetCommand@2
    inputs:
      command: pack
      packagesToPack: '$(Build.SourcesDirectory)/.nuget/*.nuspec'
380
      packDestination: '$(Build.ArtifactStagingDirectory)/nuget'
Guolin Ke's avatar
Guolin Ke committed
381
382
  - task: PublishBuildArtifacts@1
    inputs:
383
      pathtoPublish: '$(Build.ArtifactStagingDirectory)/nuget'
384
      artifactName: NuGet
Guolin Ke's avatar
Guolin Ke committed
385
      artifactType: container
386
387
388
389
390
391
392
393
394
395
396
397
  - task: GitHubRelease@0
    displayName: 'Create GitHub Release'
    condition: and(succeeded(), startsWith(variables['Build.SourceBranch'], 'refs/tags/v'))
    inputs:
      gitHubConnection: guolinke
      repositoryName: '$(Build.Repository.Name)'
      action: 'create'
      target: '$(Build.SourceVersion)'
      tagSource: 'auto'
      title: '$(Build.SourceBranchName)'
      assets: |
        $(Build.SourcesDirectory)/binaries/PackageAssets/*
398
        $(Build.SourcesDirectory)/R/R-package/*
399
400
        $(Build.ArtifactStagingDirectory)/nuget/*.nupkg
        $(Build.ArtifactStagingDirectory)/archives/*
401
402
403
      assetUploadMode: 'delete'
      isDraft: true
      isPreRelease: false
Guolin Ke's avatar
Guolin Ke committed
404
      addChangeLog: false