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

321
###########################################
322
- job: Package
323
###########################################
Guolin Ke's avatar
Guolin Ke committed
324
325
  dependsOn:
  - Linux
326
  - Linux_latest
327
  - QEMU_multiarch
328
  - macOS
Guolin Ke's avatar
Guolin Ke committed
329
  - Windows
330
  - R_artifact
331
  condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], 'refs/pull/')))
332
  pool:
333
    vmImage: 'ubuntu-latest'
Guolin Ke's avatar
Guolin Ke committed
334
  steps:
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  # 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
355
356
357
358
359
360
  # Download all agent packages from all previous phases
  - task: DownloadBuildArtifacts@0
    displayName: Download package assets
    inputs:
      artifactName: PackageAssets
      downloadPath: $(Build.SourcesDirectory)/binaries
361
362
363
364
365
366
  - 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
367
  - script: |
368
      python "$(Build.SourcesDirectory)/.nuget/create_nuget.py" "$(Build.SourcesDirectory)/binaries/PackageAssets"
369
370
371
372
373
    displayName: 'Create NuGet configuration files'
  - task: NuGetCommand@2
    inputs:
      command: pack
      packagesToPack: '$(Build.SourcesDirectory)/.nuget/*.nuspec'
374
      packDestination: '$(Build.ArtifactStagingDirectory)/nuget'
Guolin Ke's avatar
Guolin Ke committed
375
376
  - task: PublishBuildArtifacts@1
    inputs:
377
      pathtoPublish: '$(Build.ArtifactStagingDirectory)/nuget'
378
      artifactName: NuGet
Guolin Ke's avatar
Guolin Ke committed
379
      artifactType: container
380
381
382
383
384
385
386
387
388
389
390
391
  - 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/*
392
        $(Build.SourcesDirectory)/R/R-package/*
393
394
        $(Build.ArtifactStagingDirectory)/nuget/*.nupkg
        $(Build.ArtifactStagingDirectory)/archives/*
395
396
397
      assetUploadMode: 'delete'
      isDraft: true
      isPreRelease: false
Guolin Ke's avatar
Guolin Ke committed
398
      addChangeLog: false