Skip to content

Commit e74d7c9

Browse files
authored
pants ci: add integration tests jobs (#6273)
2 parents 18241a8 + 432a6ca commit e74d7c9

File tree

3 files changed

+256
-27
lines changed

3 files changed

+256
-27
lines changed

.github/workflows/test.yaml

Lines changed: 252 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,19 @@ on:
2222
# # run every night at midnight
2323
# - cron: '0 0 * * *'
2424

25+
env:
26+
COLUMNS: '120'
27+
28+
# Tell StackStorm that we are indeed in CI mode, using our CI-provider agnostic var.
29+
ST2_CI: 'true'
30+
31+
# GitHub Actions uses the 'runner' user, so use that instead of stanley.
32+
ST2TESTS_SYSTEM_USER: 'runner'
33+
34+
# This is the host:port provided by services.redis
35+
ST2TESTS_REDIS_HOST: '127.0.0.1'
36+
ST2TESTS_REDIS_PORT: '6379'
37+
2538
jobs:
2639
pants-plugins-tests:
2740
name: 'Pants Plugins Tests (pants runs: pytest) - Python ${{ matrix.python.version-short }}'
@@ -63,9 +76,6 @@ jobs:
6376
ports:
6477
- 6379:6379/tcp
6578

66-
env:
67-
COLUMNS: '120'
68-
6979
steps:
7080
- name: Checkout repository
7181
uses: actions/checkout@v4
@@ -99,11 +109,6 @@ jobs:
99109
gha-cache-key: cache0-py${{ matrix.python.version }}
100110

101111
- name: Test pants-plugins
102-
env:
103-
# Github Actions uses the 'runner' user, so use that instead of stanley.
104-
ST2TESTS_SYSTEM_USER: 'runner'
105-
ST2TESTS_REDIS_HOST: '127.0.0.1'
106-
ST2TESTS_REDIS_PORT: '6379'
107112
run: |
108113
pants test pants-plugins/::
109114
@@ -161,9 +166,6 @@ jobs:
161166
ports:
162167
- 6379:6379/tcp
163168

164-
env:
165-
COLUMNS: '120'
166-
167169
steps:
168170
- name: Checkout repository
169171
uses: actions/checkout@v4
@@ -197,11 +199,6 @@ jobs:
197199
gha-cache-key: cache0-py${{ matrix.python.version }}
198200

199201
- name: Unit Tests
200-
env:
201-
# Github Actions uses the 'runner' user, so use that instead of stanley.
202-
ST2TESTS_SYSTEM_USER: 'runner'
203-
ST2TESTS_REDIS_HOST: '127.0.0.1'
204-
ST2TESTS_REDIS_PORT: '6379'
205202
run: >
206203
pants
207204
--python-bootstrap-search-path=[]
@@ -257,9 +254,6 @@ jobs:
257254
ports:
258255
- 6379:6379/tcp
259256

260-
env:
261-
COLUMNS: '120'
262-
263257
steps:
264258
- name: Checkout repository
265259
uses: actions/checkout@v4
@@ -293,11 +287,6 @@ jobs:
293287
gha-cache-key: cache0-py${{ matrix.python.version }}
294288

295289
- name: Pack Tests
296-
env:
297-
# Github Actions uses the 'runner' user, so use that instead of stanley.
298-
ST2TESTS_SYSTEM_USER: 'runner'
299-
ST2TESTS_REDIS_HOST: '127.0.0.1'
300-
ST2TESTS_REDIS_PORT: '6379'
301290
run: >
302291
pants
303292
--python-bootstrap-search-path=[]
@@ -312,7 +301,243 @@ jobs:
312301
path: .pants.d/pants.log
313302
if: always() # We want the log even on failures.
314303

315-
#integration-tests: TODO: run integration tests
304+
integration-tests:
305+
name: 'Integration Tests (pants runs: pytest) - Python ${{ matrix.python.version-short }}'
306+
runs-on: ubuntu-20.04
307+
strategy:
308+
fail-fast: false
309+
matrix:
310+
# NOTE: We need to use full Python version as part of Python deps cache key otherwise
311+
# setup virtualenv step will fail.
312+
python:
313+
- {version-short: '3.8', version: '3.8.10'}
314+
- {version-short: '3.9', version: '3.9.14'}
315+
316+
services:
317+
mongo:
318+
image: mongo:7.0
319+
ports:
320+
- 27017:27017
321+
322+
# In GHA, these services are started first before the code is checked out.
323+
# We use bitnami images to facilitate reconfiguring RabbitMQ during integration tests.
324+
# We rely on custom config and SSL certs that are in the repo.
325+
# Many images require config in env vars (which we can't change during the test job)
326+
# or they require config in entrypoint args (which we can't override for GHA services)
327+
# bitnami builds ways to get config files from mounted volumes.
328+
rabbitmq:
329+
image: bitnami/rabbitmq:3.8
330+
volumes:
331+
- /home/runner/rabbitmq_conf:/bitnami/conf # RABBITMQ_MOUNTED_CONF_DIR
332+
env:
333+
# tell bitnami/rabbitmq to enable this by default
334+
RABBITMQ_PLUGINS: rabbitmq_management
335+
RABBITMQ_USERNAME: guest
336+
RABBITMQ_PASSWORD: guest
337+
RABBITMQ_LOGS: '-'
338+
# bitnami's default relative limit was too high
339+
RABBITMQ_DISK_FREE_ABSOLUTE_LIMIT: 50MB
340+
341+
# These are strictly docker options, not entrypoint args (GHA restriction)
342+
options: >-
343+
--name rabbitmq
344+
ports:
345+
# These 6 ports are exposed by bitnami/rabbitmq (see https://www.rabbitmq.com/networking.html#ports)
346+
# host_port:container_port/protocol
347+
- 5671:5671/tcp # AMQP SSL port
348+
- 5672:5672/tcp # AMQP standard port
349+
- 15672:15672/tcp # Management: HTTP, CLI
350+
#- 15671:15671/tcp # Management: SSL port
351+
#- 25672:25672/tcp # inter-node or CLI
352+
#- 4369:4369/tcp # epmd
353+
354+
redis:
355+
# Docker Hub image
356+
image: redis
357+
# Set health checks to wait until redis has started
358+
options: >-
359+
--name "redis"
360+
--health-cmd "redis-cli ping"
361+
--health-interval 10s
362+
--health-timeout 5s
363+
--health-retries 5
364+
ports:
365+
- 6379:6379/tcp
366+
367+
steps:
368+
- name: Checkout repository
369+
uses: actions/checkout@v4
370+
with:
371+
# a test uses a submodule, and pants needs access to it to calculate deps.
372+
submodules: 'recursive'
373+
# sadly, the submodule will only have fetch-depth=1, which is what we want
374+
# for st2.git, but not for the submodules. We still want actions/checkout
375+
# to do the initial checkout, however, so that it adds auth for fetching
376+
# in the submodule.
377+
378+
- name: Fetch repository submodules
379+
run: |
380+
git submodule status
381+
git submodule foreach 'git fetch --all --tags'
382+
git submodule foreach 'git tag'
383+
384+
- name: 'Set up Python (${{ matrix.python.version }})'
385+
id: python
386+
uses: actions/setup-python@v5
387+
with:
388+
python-version: '${{ matrix.python.version }}'
389+
390+
- name: Cache and Install APT Dependencies
391+
uses: ./.github/actions/apt-packages
392+
393+
- name: Initialize Pants and its GHA caches
394+
uses: ./.github/actions/init-pants
395+
with:
396+
# To ignore a bad cache, bump the cache* integer.
397+
gha-cache-key: cache0-py${{ matrix.python.version }}
398+
399+
# This is only required for st2common/tests/integration/test_rabbitmq_ssl_listener.py
400+
- name: Reconfigure RabbitMQ
401+
# bitnami image allows (see bitnami/rabbitmq readme):
402+
# Here we're copying a rabbitmq.config file which won't do anything.
403+
# We need to switch to custom.conf or advanced.config.
404+
timeout-minutes: 2 # may die if rabbitmq fails to start
405+
run: |
406+
./scripts/github/configure-rabbitmq.sh
407+
408+
- name: Integration Tests
409+
run: >
410+
pants
411+
--python-bootstrap-search-path=[]
412+
--python-bootstrap-search-path=${{ steps.python.outputs.python-path }}
413+
--tag=integration
414+
--tag=-st2cluster
415+
test '::'
416+
417+
- name: Upload pants log
418+
uses: actions/upload-artifact@v4
419+
with:
420+
name: pants-log-py${{ matrix.python.version }}-integration-tests
421+
path: .pants.d/pants.log
422+
if: always() # We want the log even on failures.
423+
424+
integration-st2cluster-tests:
425+
name: 'Integration Tests (Full Cluster)- Python ${{ matrix.python.version-short }}'
426+
runs-on: ubuntu-20.04
427+
strategy:
428+
fail-fast: false
429+
matrix:
430+
# NOTE: We need to use full Python version as part of Python deps cache key otherwise
431+
# setup virtualenv step will fail.
432+
python:
433+
- {version-short: '3.8', version: '3.8.10'}
434+
- {version-short: '3.9', version: '3.9.14'}
435+
436+
services:
437+
mongo:
438+
image: mongo:7.0
439+
ports:
440+
- 27017:27017
441+
442+
rabbitmq:
443+
image: rabbitmq:3.8-management
444+
options: >-
445+
--name rabbitmq
446+
ports:
447+
- 5671:5671/tcp # AMQP SSL port
448+
- 5672:5672/tcp # AMQP standard port
449+
- 15672:15672/tcp # Management: HTTP, CLI
450+
451+
redis:
452+
# Docker Hub image
453+
image: redis
454+
# Set health checks to wait until redis has started
455+
options: >-
456+
--name "redis"
457+
--health-cmd "redis-cli ping"
458+
--health-interval 10s
459+
--health-timeout 5s
460+
--health-retries 5
461+
ports:
462+
- 6379:6379/tcp
463+
464+
steps:
465+
- name: Checkout repository
466+
uses: actions/checkout@v4
467+
with:
468+
# a test uses a submodule, and pants needs access to it to calculate deps.
469+
submodules: 'recursive'
470+
# sadly, the submodule will only have fetch-depth=1, which is what we want
471+
# for st2.git, but not for the submodules. We still want actions/checkout
472+
# to do the initial checkout, however, so that it adds auth for fetching
473+
# in the submodule.
474+
475+
- name: Fetch repository submodules
476+
run: |
477+
git submodule status
478+
git submodule foreach 'git fetch --all --tags'
479+
git submodule foreach 'git tag'
480+
481+
- name: 'Set up Python (${{ matrix.python.version }})'
482+
id: python
483+
uses: actions/setup-python@v5
484+
with:
485+
python-version: '${{ matrix.python.version }}'
486+
487+
- name: Cache and Install APT Dependencies
488+
uses: ./.github/actions/apt-packages
489+
490+
- name: Initialize Pants and its GHA caches
491+
uses: ./.github/actions/init-pants
492+
with:
493+
# To ignore a bad cache, bump the cache* integer.
494+
gha-cache-key: cache0-py${{ matrix.python.version }}
495+
496+
- name: Export virtualenv to run Dev ST2 Cluster
497+
run: >
498+
pants
499+
--python-bootstrap-search-path=[]
500+
--python-bootstrap-search-path=${{ steps.python.outputs.python-path }}
501+
export
502+
--resolve=st2
503+
504+
- name: Launch Dev ST2 Cluster
505+
env:
506+
VIRTUALENV_DIR: ./dist/export/python/virtualenvs/st2/${{ steps.python.outputs.python-version }}
507+
run: |
508+
sudo -E ./scripts/github/prepare-integration.sh
509+
510+
- name: Integration Tests
511+
env:
512+
ST2_CI_RUN_ORQUESTA_PAUSE_RESUME_TESTS: 'true'
513+
run: >
514+
pants
515+
--python-bootstrap-search-path=[]
516+
--python-bootstrap-search-path=${{ steps.python.outputs.python-path }}
517+
--tag=integration
518+
--tag=st2cluster
519+
test '::'
520+
521+
- name: Compress Service Logs Before upload
522+
if: ${{ failure() }}
523+
run: |
524+
./tools/launchdev.sh stop # stop st2 before collecting logs
525+
tar cvzpf logs.tar.gz logs/*
526+
527+
- name: Upload StackStorm services Logs
528+
if: ${{ failure() }}
529+
uses: actions/upload-artifact@v4
530+
with:
531+
name: logs-py${{ matrix.python-version }}-st2cluster-integration-tests
532+
path: logs.tar.gz
533+
retention-days: 7
534+
535+
- name: Upload pants log
536+
uses: actions/upload-artifact@v4
537+
with:
538+
name: pants-log-py${{ matrix.python.version }}-st2cluster-integration-tests
539+
path: .pants.d/pants.log
540+
if: always() # We want the log even on failures.
316541

317542
set_merge_ok:
318543
name: Set Merge OK (Tests)
@@ -321,7 +546,8 @@ jobs:
321546
- pants-plugins-tests
322547
- unit-tests
323548
- pack-tests
324-
#- integration-tests
549+
- integration-tests
550+
- integration-st2cluster-tests
325551
outputs:
326552
merge_ok: ${{ steps.set_merge_ok.outputs.merge_ok }}
327553
runs-on: ubuntu-latest

CHANGELOG.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ Added
6969
working on StackStorm, improve our security posture, and improve CI reliability thanks in part
7070
to pants' use of PEX lockfiles. This is not a user-facing addition.
7171
#6118 #6141 #6133 #6120 #6181 #6183 #6200 #6237 #6229 #6240 #6241 #6244 #6251 #6253
72-
#6254 #6258 #6259 #6260 #6269 #6275 #6279 #6278 #6282 #6283
72+
#6254 #6258 #6259 #6260 #6269 #6275 #6279 #6278 #6282 #6283 #6273
7373
Contributed by @cognifloyd
7474
* Build of ST2 EL9 packages #6153
7575
Contributed by @amanda11

pants.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,9 @@ extra_env_vars = [
257257
# "ST2_COORDINATION__URL", # Tests will override this with one of:
258258
# "redis://{ST2TESTS_REDIS_HOST}:{ST2TESTS_REDIS_PORT}?namespace=_st2_test{ST2TESTS_PARALLEL_SLOT}
259259
# "zake://"
260+
# CI-specific vars
261+
"ST2_CI",
262+
"ST2_CI_RUN_ORQUESTA_PAUSE_RESUME_TESTS",
260263
]
261264
# 10 min should be more than enough even for integration tests.
262265
timeout_default = 600 # seconds

0 commit comments

Comments
 (0)