##// END OF EJS Templates
ci: for branches, use a single trigger...
marmoute -
r53151:b65f11f4 stable
parent child Browse files
Show More
@@ -1,560 +1,597 b''
1 1 # Don't run pipelines on branch "merge", since we're fast-forward only.
2 2 # Gitlab sees a new branch (since e.g. `topic/stable/my-topic` becomes
3 3 # `branch/stable`), but the hash hasn't changed. There is no reason to
4 4 # re-run the CI in our case, since we haven't built up any specific automation.
5 5 # Right now it's just wasted CI and developer time.
6 6 # One can still run the pipeline manually via the web interface,
7 7 # like in the case of releases, to make *extra* sure that the actual branch
8 8 # has succeeded.
9 9 workflow:
10 10 rules:
11 11 - if: $CI_COMMIT_BRANCH =~ /^branch\/.*/ && $CI_PIPELINE_SOURCE != "web"
12 12 when: never
13 13 - if: $CI_PIPELINE_SOURCE == "merge_request_event"
14 14 when: never
15 15 - if: $CI_PIPELINE_SOURCE == "push"
16 16 when: always
17 17 - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS
18 18 when: never
19 19 - if: $CI_COMMIT_BRANCH
20 20 when: always
21 21
22 22 stages:
23 - nightly-trigger
23 24 - build
24 25 - checks
25 26 - tests
26 27 - platform-compat
27 28 - py-version-compat
28 29 - upload
29 30
30 31
31 32 image: registry.heptapod.net/mercurial/ci-images/mercurial-core:$HG_CI_IMAGE_TAG
32 33
33 34 variables:
34 35 # to debug use:
35 36 #
36 37 # RE_BRANCH: '/^topic/.+/.+$/'
37 38 # RE_TOPIC: '/^xxx/'
38 39 #
39 40 # Instead of the two following lines:
40 41 RE_BRANCH: '/^branch/.+$/'
41 42 RE_TOPIC: '/^topic/.+/.+$/'
42 43 PYTHON: python
43 44 HG_CI_IMAGE_TAG: "v2.1"
44 45 # a directory dedicated to creating files and temporary clone
45 46 # with shell runner, its content is not cleaned from one call to the next,
46 47 # so plan for it.
47 48 TMP_WORK_DIR: "${CI_PROJECT_DIR}/../.."
48 49 # we use CIBW_SKIP="pp*" to prevent the building of pypy wheel that are neither
49 50 # needed nor working.
50 51 CIBW_SKIP: "pp*"
51 52
52 53 .all:
53 54 # help changing all job at once when debugging
54 55 when: on_success
55 56 # make sure jobs from later steps does not wait for anything implicit before
56 57 # starting.
57 58 needs: []
58 59
59 60 # dummy job that serve dependencies purpose
60 61 .dummy:
61 62 # smallest I know of
62 63 image: busybox
63 64 variables:
64 65 GIT_STRATEGY: none
65 66 CI_CLEVER_CLOUD_FLAVOR: "XS"
66 67 script:
67 68 - echo 'nothing to see here'
68 69
69 70
70 71 # a dummy job that only serve to trigger others
71 72 #
72 73 # This is useful for two reasons:
73 74 # - the UX around parallel jobs is awful so manually starting them is unpractical
74 75 # - manual starting job cannot make the pipeline "fails" and block a merge,
75 76 # while "on_success" job depending on manual trigger works fine in that regard.
76 77 .trigger:
77 78 extends:
78 79 - .all
79 80 - .dummy
80 81 when: manual
81 82
83
84 trigger-nightly-build:
85 extends: .trigger
86 stage: nightly-trigger
87 rules:
88 - if: $CI_COMMIT_BRANCH =~ $RE_BRANCH
89 when: manual
90 allow_failure: true
91 - if: $CI_COMMIT_BRANCH =~ $RE_TOPIC
92 when: never
93
82 94 .build-wheel:
83 95 extends: .all
84 96 image: "registry.heptapod.net/mercurial/ci-images/core-wheel-x86_64-c:v3.0"
85 97 stage: build
86 98 variables:
87 99 WHEEL_TYPE: ""
88 100 FLAVOR: ""
89 101 MERCURIAL_SETUP_FORCE_TRANSLATIONS: "1"
90 102 CI_CLEVER_CLOUD_FLAVOR: "XS"
91 103 script:
92 104 - PLATFORM=`/opt/python/cp313-cp313/bin/python -c 'import sys; print(sys.platform)'`
93 105 - echo $WHEEL_TYPE
94 106 - test -n "$WHEEL_TYPE"
95 107 - echo $FLAVOR
96 108 - mkdir -p wheels/$PLATFORM/$WHEEL_TYPE/$BUILD_PY_ID
97 109 - contrib/build-one-linux-wheel.sh $BUILD_PY_ID wheels/$PLATFORM/$WHEEL_TYPE/$BUILD_PY_ID
98 110 artifacts:
99 111 paths:
100 112 - wheels/
101 113 expire_in: 1 week
102 114
115
103 116 build-c-wheel:
104 117 extends: .build-wheel
105 118 variables:
106 119 WHEEL_TYPE: "c"
107 120 parallel:
108 121 matrix:
109 122 - BUILD_PY_ID:
110 123 - cp38-cp38
111 124 - cp39-cp39
112 125 - cp310-cp310
113 126 - cp311-cp311
114 127 - cp312-cp312
115 128 - cp313-cp313
116 129
117 130 .runtests:
118 131 extends: .all
119 132 stage: tests
120 133 variables:
121 134 SHOW_VERSION_OF: "$PYTHON"
122 135 TEST_HGTESTS_ALLOW_NETIO: "0"
123 136 FILTER: ""
124 137 FLAVOR: ""
125 138 RUNTEST_ARGS: ""
126 139 # The runner made a clone as root.
127 140 # We make a new clone owned by user used to run the step.
128 141 before_script:
129 142 - echo "python used, $PYTHON"
130 143 - for tool in $SHOW_VERSION_OF ; do echo '#' version of $tool; $tool --version; done
131 144 - rm -rf "${TMP_WORK_DIR}"/mercurial-ci/ # Clean slate if not using containers
132 145 - hg clone . "${TMP_WORK_DIR}"/mercurial-ci/ --noupdate --config phases.publish=no
133 146 - hg -R "${TMP_WORK_DIR}"/mercurial-ci/ update `hg log --rev '.' --template '{node}'`
134 147 - cd "${TMP_WORK_DIR}"/mercurial-ci/
135 148 - ls -1 tests/test-check-*.* > "${TMP_WORK_DIR}"/check-tests.txt
136 149 script:
137 150 - echo "$TEST_HGTESTS_ALLOW_NETIO"
138 151 - echo "$RUNTEST_ARGS"
139 152 - echo "$FILTER"
140 153 - echo "$FLAVOR"
141 154 - echo "$WHEEL_TYPE"
142 155 - PORT_START=`expr 19051 + 1009 '*' $CI_CONCURRENT_ID`
143 156 - PORT_ARG="--port $PORT_START"
144 157 - echo $PORT_ARG
145 158 - PLATFORM=`$PYTHON -c 'import sys; print(sys.platform)'`
146 159 - echo $PLATFORM
147 160 - WHEEL_ARG=""
148 161 - SHARDING_ARGS=""
149 162 - if test -n "$WHEEL_TYPE"; then
150 163 PY_TAG=`$PYTHON -c 'import sys; v=sys.version_info; t=f"cp{v.major}{v.minor}"; print(f"{t}-{t}")'`;
151 164 echo "$PY_TAG";
152 165 test -n "PY_TAG";
153 166 WHEEL="`ls -1 $CI_PROJECT_DIR/wheels/$PLATFORM/$WHEEL_TYPE/$PY_TAG/*.whl`";
154 167 test -n "$WHEEL";
155 168 echo installing from $WHEEL;
156 169 WHEEL_ARG="--hg-wheel $WHEEL";
157 170 echo disabling flavor as this is currently incompatible with '"--hg-wheel"';
158 171 FLAVOR="";
159 172 else
160 173 echo installing from source;
161 174 fi;
162 175 - if [ -n "$CI_NODE_INDEX" ]; then
163 176 echo "Running the test in multiple shard - [$CI_NODE_INDEX/$CI_NODE_TOTAL]";
164 177 SHARDING_ARGS="--shard-index $CI_NODE_INDEX --shard-total $CI_NODE_TOTAL";
165 178 echo "sharding... $SHARDING_ARGS";
166 179 fi
167 180 - HGTESTS_ALLOW_NETIO="$TEST_HGTESTS_ALLOW_NETIO"
168 181 "$PYTHON" tests/run-tests.py
169 182 --color=always
170 183 $PORT_ARG
171 184 $WHEEL_ARG
172 185 $FLAVOR
173 186 $SHARDING_ARGS
174 187 $FILTER
175 188 $RUNTEST_ARGS;
176 189
177 190 checks:
178 191 extends: .runtests
179 192 stage: checks
180 193 variables:
181 194 SHOW_VERSION_OF: "$PYTHON black clang-format"
182 195 RUNTEST_ARGS: "--time"
183 196 FILTER: "--test-list ${TMP_WORK_DIR}/check-tests.txt"
184 197 CI_CLEVER_CLOUD_FLAVOR: S
185 198
186 199 rust-cargo-test:
187 200 extends: .all
188 201 stage: checks
189 202 script:
190 203 - make rust-tests
191 204 - make cargo-clippy
192 205 variables:
193 206 CI_CLEVER_CLOUD_FLAVOR: S
194 207
195 208 .runtests-no-check:
196 209 extends: .runtests
197 210 variables:
198 211 FILTER: "--blacklist ${TMP_WORK_DIR}/check-tests.txt"
199 212 TEST_HGTESTS_ALLOW_NETIO: "1"
200 213
201 214 .test-c:
202 215 extends: .runtests-no-check
203 216 variables:
204 217 FLAVOR: "--no-rust"
205 218
206 219 test-c:
207 220 extends: .test-c
208 221 needs:
209 222 - job: build-c-wheel
210 223 parallel:
211 224 matrix:
212 225 - BUILD_PY_ID: "cp311-cp311"
213 226 variables:
214 227 WHEEL_TYPE: "c"
215 228
216 229 test-pure:
217 230 extends: .runtests-no-check
218 231 variables:
219 232 FLAVOR: "--pure"
220 233
221 234 test-rust:
222 235 extends: .runtests-no-check
223 236 variables:
224 237 HGWITHRUSTEXT: "cpython"
225 238 FLAVOR: "--rust"
226 239
227 240 test-rhg:
228 241 extends: .runtests-no-check
229 242 variables:
230 243 HGWITHRUSTEXT: "cpython"
231 244 FLAVOR: "--rust --rhg"
232 245
233 246 test-chg:
234 247 extends: .runtests-no-check
235 248 variables:
236 249 FLAVOR: "--chg"
237 250
238 251
239 252 trigger-pycompat:
240 253 extends: .trigger
241 254 stage: py-version-compat
255 rules:
256 - if: $CI_COMMIT_BRANCH =~ $RE_BRANCH
257 when: on_success
258 needs:
259 - trigger-nightly-build
260 - if: $CI_COMMIT_BRANCH =~ $RE_TOPIC
261 when: manual
262 allow_failure: true
242 263
243 264 .test-c-pycompat:
244 265 extends: .test-c
245 266 stage: py-version-compat
246 needs:
247 - trigger-pycompat
248 267 variables:
249 268 WHEEL_TYPE: "c"
250 269
251 270 # note: we should probably get a full matrix for flavor Γ— py-version, but this
252 271 # is a simple start to be able to check if we break the lowest supported
253 272 # version (and 3.12 have been giving us various troubles)
254 273 test-3.8-c:
255 274 extends: .test-c-pycompat
256 275 variables:
257 276 PYTHON: python3.8
258 277 needs:
278 - job: trigger-pycompat
259 279 - job: build-c-wheel
260 280 parallel:
261 281 matrix:
262 282 - BUILD_PY_ID: "cp38-cp38"
263 283
264 284 test-3.12-c:
265 285 extends: .test-c-pycompat
266 286 variables:
267 287 PYTHON: python3.12
268 288 needs:
289 - job: trigger-pycompat
269 290 - job: build-c-wheel
270 291 parallel:
271 292 matrix:
272 293 - BUILD_PY_ID: "cp312-cp312"
273 294
274 295 test-3.12-rust:
275 296 extends: test-rust
276 297 stage: py-version-compat
277 298 needs:
278 299 - trigger-pycompat
279 300 variables:
280 301 PYTHON: python3.12
281 302
282 303 test-3.13-c:
283 304 extends: .test-c-pycompat
284 305 variables:
285 306 PYTHON: python3.13
286 307 needs:
308 - job: trigger-pycompat
287 309 - job: build-c-wheel
288 310 parallel:
289 311 matrix:
290 312 - BUILD_PY_ID: "cp313-cp313"
291 313
292 314 test-3.13-rust:
293 315 extends: test-rust
294 316 stage: py-version-compat
295 317 needs:
296 318 - trigger-pycompat
297 319 variables:
298 320 PYTHON: python3.13
299 321
300 322 check-pytype:
301 323 extends: test-rust
302 324 stage: checks
303 325 before_script:
304 326 - export PATH="/home/ci-runner/vendor/pyenv/pyenv-2.4.7-adf3c2bccf09cdb81febcfd15b186711a33ac7a8/shims:/home/ci-runner/vendor/pyenv/pyenv-2.4.7-adf3c2bccf09cdb81febcfd15b186711a33ac7a8/bin:$PATH"
305 327 - echo "PATH, $PATH"
306 328 - hg clone . "${TMP_WORK_DIR}"/mercurial-ci/ --noupdate --config phases.publish=no
307 329 - hg -R "${TMP_WORK_DIR}"/mercurial-ci/ update `hg log --rev '.' --template '{node}'`
308 330 - cd "${TMP_WORK_DIR}"/mercurial-ci/
309 331 - make local PYTHON=$PYTHON
310 332 - ./contrib/setup-pytype.sh
311 333 script:
312 334 - echo "Entering script section"
313 335 - sh contrib/check-pytype.sh
314 336
315 337 # `sh.exe --login` sets a couple of extra environment variables that are defined
316 338 # in the MinGW shell, but switches CWD to /home/$username. The previous value
317 339 # is stored in OLDPWD. Of the added variables, MSYSTEM is crucial to running
318 340 # run-tests.py- it is needed to make run-tests.py generate a `python3` script
319 341 # that satisfies the various shebang lines and delegates to `py -3`.
320 342
321 343 .windows:
322 344 extends: .all
323 345 when: manual # we don't have any Windows runners anymore at the moment
324 346 tags:
325 347 - windows
326 348 before_script:
327 349 - C:/hgdev/MinGW/msys/1.0/bin/sh.exe --login -c 'cd "$OLDPWD" && ls -1 tests/test-check-*.* > "${TMP_WORK_DIR}"/check-tests.txt'
328 350 # TODO: find/install cvs, bzr, perforce, gpg, sqlite3
329 351 variables:
330 352 PYTHON: C:/hgdev/venvs/python39-x64/Scripts/python.exe
331 353
332 354 # a dummy job that only serve to trigger the wider windows build
333 355 trigger-wheel-windows:
334 356 extends: .trigger
335 357 stage: build
358 rules:
359 - if: $CI_COMMIT_BRANCH =~ $RE_BRANCH
360 when: never
361 - if: $CI_COMMIT_BRANCH =~ $RE_TOPIC
362 when: manual
363 allow_failure: true
336 364
337 365 build-c-wheel-windows:
338 366 extends: .windows
339 367 stage: build
340 368 # wait for someone to click on "trigger-wheel-windows"
341 369 when: on_success
342 370 needs:
343 - "trigger-wheel-windows"
371 rules:
372 - if: $CI_COMMIT_BRANCH =~ $RE_BRANCH
373 needs:
374 - trigger-nightly-build
375 - if: $CI_COMMIT_BRANCH =~ $RE_TOPIC
376 needs:
377 - "trigger-wheel-windows"
344 378 variables:
345 379 MERCURIAL_SETUP_FORCE_TRANSLATIONS: "1"
346 380 script:
347 381 - echo "Entering script section"
348 382 - echo "python used, $Env:PYTHON"
349 383 - Invoke-Expression "$Env:PYTHON -V"
350 384 - echo "$Env:RUNTEST_ARGS"
351 385 - echo "$Env:TMP"
352 386 - echo "$Env:TEMP"
353 387 - "C:/hgdev/venvs/python39-x64/Scripts/python.exe -m cibuildwheel --output-dir wheels/win32"
354 388 artifacts:
355 389 paths:
356 390 - wheels
357 391 expire_in: 1 week
358 392 parallel:
359 393 matrix:
360 394 # "cp39" is first as it unlock the tests
361 395 - CIBW_BUILD:
362 396 - "cp39-*"
363 397 - "cp38-*"
364 398 - "cp310-*"
365 399 - "cp311-*"
366 400 - "cp312-*"
367 401 - "cp313-*"
368 402 CIBW_ARCHS:
369 403 - "AMD64"
370 404 - "x86"
371 405 - CIBW_BUILD:
372 406 - "cp311-*"
373 407 - "cp312-*"
374 408 - "cp313-*"
375 409 CIBW_ARCHS:
376 410 - "ARM64"
377 411
378 412
379 413 .windows-runtests:
380 414 extends: .windows
381 415 stage: platform-compat
382 416 # the UX for manual parallel jobs is quite awful, and the job que depends
383 417 # upon are manual anyway, so we can make this start automatically once the
384 418 # associated wheel is ready.
385 419 when: on_success
386 420 parallel: 20
387 421 script:
388 422 - echo "Entering script section"
389 423 - echo "python used, $Env:PYTHON"
390 424 - Invoke-Expression "$Env:PYTHON -V"
391 425 - echo "$Env:HGTESTS_ALLOW_NETIO"
392 426 - echo "$Env:WHEEL_ARG"
393 427 - echo "$Env:FLAVOR"
394 428 - echo "$Env:FILTER"
395 429 - echo "$Env:RUNTEST_ARGS"
396 430 - echo "$Env:TMP"
397 431 - echo "$Env:TEMP"
398 432 # This test is hanging the worker and not that important, so lets skip
399 433 # it for now
400 434 - C:/hgdev/MinGW/msys/1.0/bin/sh.exe -c 'cd "$OLDPWD" && echo tests/test-clonebundles-autogen.t > $TMP_WORK_DIR/windows-skip.txt'
401 435
402 436 - C:/hgdev/MinGW/msys/1.0/bin/sh.exe
403 437 --login -c 'cd "$OLDPWD"
404 438 && HGTESTS_ALLOW_NETIO="$TEST_HGTESTS_ALLOW_NETIO"
405 439 $PYTHON tests/run-tests.py
406 440 --color=always
407 441 $WHEEL_ARG
408 442 $FLAVOR
409 443 --port `expr 19051 + 1009 "*" $CI_CONCURRENT_ID`
410 444 --shard-index $CI_NODE_INDEX --shard-total $CI_NODE_TOTAL
411 445 $FILTER
412 446 $RUNTEST_ARGS;
413 447 '
414 448 variables:
415 449 WHEEL_ARG: ""
416 450 RUNTEST_ARGS: ""
417 451 FLAVOR: ""
418 452 FILTER: "--blacklist ${TMP_WORK_DIR}/check-tests.txt --blacklist ${TMP_WORK_DIR}/windows-skip.txt"
419 453
420 454 windows:
421 455 extends: .windows-runtests
422 456 variables:
423 457 RUNTEST_ARGS: ""
424 458 WHEEL_ARG: "--hg-wheel wheels/win32/mercurial-*-cp39-cp39-win_amd64.whl"
425 459 needs:
426 460 - job: build-c-wheel-windows
427 461 parallel:
428 462 matrix:
429 463 - CIBW_BUILD: "cp39-*"
430 464 CIBW_ARCHS: "AMD64"
431 465
432 466 windows-pyox:
433 467 extends: .windows-runtests
434 468 when: manual # pyoxidizer builds seem broken with --no-use-pep517
435 469 variables:
436 470 FLAVOR: "--pyoxidized"
437 471
438 472 macos:
439 473 extends: .test-c
440 474 stage: platform-compat
441 475 # run the test in multiple shard to help spread the load between concurrent
442 476 # MR as the macos runner is a shell runner there is not startup overhead
443 477 # for tests.
444 478 parallel: 10
445 479 tags:
446 480 - macos
447 481 variables:
448 482 WHEEL_TYPE: "c"
449 483 needs:
450 484 - build-c-wheel-macos
451 485
452 486 # We could use CIBW_BUILD="cp310-*" to only build the Python 3.10 wheel for now as
453 487 # this is the only one we need to test. However testing that build work on all
454 488 # version is useful and match what we do with Linux.
455 489 #
456 490 # CIBW_SKIP is set globally at the start of the file. See comment there.
457 491 #
458 492 # The weird directory structure match the one we use for Linux to deal with the
459 493 # multiple jobs. (all this might be unnecessary)
460 494 build-c-wheel-macos:
461 when: manual # avoid overloading the CI by default
495 rules:
496 - if: $CI_COMMIT_BRANCH =~ $RE_BRANCH
497 needs:
498 - trigger-nightly-build
499 - if: $CI_COMMIT_BRANCH =~ $RE_TOPIC
500 when: manual # avoid overloading the CI by default
501 allow_failure: true
462 502 stage: build
463 503 tags:
464 504 - macos
465 505 variables:
466 506 MERCURIAL_SETUP_FORCE_TRANSLATIONS: "1"
467 507 script:
468 508 - PLATFORM=`$PYTHON -c 'import sys; print(sys.platform)'`
469 509 - rm -rf tmp-wheels
470 510 - cibuildwheel --output-dir tmp-wheels/
471 511 - for py_version in cp38-cp38 cp39-cp39 cp310-cp310 cp311-cp311 cp312-cp312 cp313-cp313; do
472 512 mkdir -p wheels/$PLATFORM/c/$py_version/;
473 513 mv tmp-wheels/*$py_version*.whl wheels/$PLATFORM/c/$py_version/;
474 514 done
475 515 - rm -rf tmp-wheels
476 516 artifacts:
477 517 paths:
478 518 - wheels
479 519 expire_in: 1 week
480 520
481 521
482 522 .nightly_build_step:
483 523 extends: .all
484 524 stage: upload
485 525 rules:
486 526 - if: '$CI_COMMIT_BRANCH =~ $RE_BRANCH'
487 527 # note that at the time of writing this, this job depends on multiple
488 528 # manual one. So it will not run by default, but will automatically run
489 529 # if the manual jobs are triggered.
490 530 #
491 531 # Also beware that "on_success" will ignore failure of manual test we
492 532 # directly depends on. This currently relevant for the "test-3.x-c"
493 533 # tests.
494 534 when: on_success
495 535 - if: '$CI_COMMIT_BRANCH =~ $RE_TOPIC'
496 536 when: never
497 # if you need to test this, make it
498 # when: manual
499 # allow_failure: true
500 537
501 538 # a dummy job that gather greatly parallel object into one.
502 539 #
503 540 # It exists because gitlab-ci has a "50 jobs" limit on "needs" entries.
504 541 # (yes, this is sad)
505 542 #
506 543 .sink:
507 544 extends:
508 - .nightly_build_sink
545 - .nightly_build_step
509 546 - .dummy
510 547
511 linux-test-result:
548 test-result-linux:
512 549 extends: .sink
513 550 needs:
514 551 - test-c
515 552 - test-3.8-c
516 553 - test-3.12-c
517 554 - test-3.13-c
518 555
519 macos-test-result:
556 test-result-macos:
520 557 extends: .sink
521 558 needs:
522 559 - macos
523 560
524 windows-test-result:
561 test-result-windows:
525 562 extends: .sink
526 563 needs:
527 564 - windows
528 565
529 566 # Upload nightly build wheel on the heptapod registry on test success
530 567 #
531 568 # At the time this task is added, since the mac wheels are built on shell
532 569 # runner, those nightly are not be considered fully secured.
533 570 #
534 571 # In addition, since any job can upload package, pretty much anyone with CI
535 572 # access can upload anything pretending to be any version. To fix it we would
536 573 # have to prevent the CI token to upload to the registry and have dedicated
537 574 # credential accessible only from protected branches.
538 575 upload-wheel-nightly:
539 576 extends: .nightly_build_step
540 577 image: "registry.heptapod.net/mercurial/ci-images/twine:v3.0"
541 578 # because we don't want to upload only half of a wheel
542 579 interruptible: false
543 580 needs:
544 581 - build-c-wheel
545 582 - build-c-wheel-macos
546 583 - build-c-wheel-windows
547 - linux-test-result
548 - macos-test-result
549 - windows-test-result
584 - test-result-linux
585 - test-result-macos
586 - test-result-windows
550 587 # It would be nice to be able to restrict that a bit to protected branch only
551 588 variables:
552 589 TWINE_USERNAME: gitlab-ci-token
553 590 TWINE_PASSWORD: $CI_JOB_TOKEN
554 591 script:
555 592 - twine
556 593 upload
557 594 --verbose
558 595 --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi
559 596 wheels/*/*/*/*.whl
560 597 wheels/*/*.whl
General Comments 0
You need to be logged in to leave comments. Login now