Pipelines: Move PR testing stacks (currently only E4S) into spack (#21714)
This commit is contained in:
parent
0da2b82df2
commit
6b509a95da
6 changed files with 273 additions and 61 deletions
|
@ -22,7 +22,7 @@
|
|||
|
||||
import spack
|
||||
import spack.binary_distribution as bindist
|
||||
import spack.cmd.buildcache as buildcache
|
||||
import spack.cmd
|
||||
import spack.compilers as compilers
|
||||
import spack.config as cfg
|
||||
import spack.environment as ev
|
||||
|
@ -41,7 +41,7 @@
|
|||
'always',
|
||||
]
|
||||
|
||||
SPACK_PR_MIRRORS_ROOT_URL = 's3://spack-pr-mirrors'
|
||||
SPACK_PR_MIRRORS_ROOT_URL = 's3://spack-binaries-prs'
|
||||
TEMP_STORAGE_MIRROR_NAME = 'ci_temporary_mirror'
|
||||
|
||||
spack_gpg = spack.main.SpackCommand('gpg')
|
||||
|
@ -943,7 +943,7 @@ def generate_gitlab_ci_yaml(env, print_summary, output_file, prune_dag=False,
|
|||
|
||||
cleanup_job['stage'] = 'cleanup-temp-storage'
|
||||
cleanup_job['script'] = [
|
||||
'spack mirror destroy --mirror-url {0}/$CI_PIPELINE_ID'.format(
|
||||
'spack -d mirror destroy --mirror-url {0}/$CI_PIPELINE_ID'.format(
|
||||
temp_storage_url_prefix)
|
||||
]
|
||||
cleanup_job['when'] = 'always'
|
||||
|
@ -1262,16 +1262,35 @@ def read_cdashid_from_mirror(spec, mirror_url):
|
|||
def push_mirror_contents(env, spec, yaml_path, mirror_url, build_id,
|
||||
sign_binaries):
|
||||
if mirror_url:
|
||||
unsigned = not sign_binaries
|
||||
tty.debug('Creating buildcache ({0})'.format(
|
||||
'unsigned' if unsigned else 'signed'))
|
||||
buildcache._createtarball(env, spec_yaml=yaml_path, add_deps=False,
|
||||
output_location=mirror_url, force=True,
|
||||
allow_root=True, unsigned=unsigned)
|
||||
if build_id:
|
||||
tty.debug('Writing cdashid ({0}) to remote mirror: {1}'.format(
|
||||
build_id, mirror_url))
|
||||
write_cdashid_to_mirror(build_id, spec, mirror_url)
|
||||
try:
|
||||
unsigned = not sign_binaries
|
||||
tty.debug('Creating buildcache ({0})'.format(
|
||||
'unsigned' if unsigned else 'signed'))
|
||||
spack.cmd.buildcache._createtarball(
|
||||
env, spec_yaml=yaml_path, add_deps=False,
|
||||
output_location=mirror_url, force=True, allow_root=True,
|
||||
unsigned=unsigned)
|
||||
if build_id:
|
||||
tty.debug('Writing cdashid ({0}) to remote mirror: {1}'.format(
|
||||
build_id, mirror_url))
|
||||
write_cdashid_to_mirror(build_id, spec, mirror_url)
|
||||
except Exception as inst:
|
||||
# If the mirror we're pushing to is on S3 and there's some
|
||||
# permissions problem, for example, we can't just target
|
||||
# that exception type here, since users of the
|
||||
# `spack ci rebuild' may not need or want any dependency
|
||||
# on boto3. So we use the first non-boto exception type
|
||||
# in the heirarchy:
|
||||
# boto3.exceptions.S3UploadFailedError
|
||||
# boto3.exceptions.Boto3Error
|
||||
# Exception
|
||||
# BaseException
|
||||
# object
|
||||
err_msg = 'Error msg: {0}'.format(inst)
|
||||
if 'Access Denied' in err_msg:
|
||||
tty.msg('Permission problem writing to {0}'.format(
|
||||
mirror_url))
|
||||
tty.msg(err_msg)
|
||||
|
||||
|
||||
def copy_stage_logs_to_artifacts(job_spec, job_log_dir):
|
||||
|
|
|
@ -413,33 +413,18 @@ def add_mirror(mirror_name, mirror_url):
|
|||
else:
|
||||
buildcache_mirror_url = remote_mirror_url
|
||||
|
||||
try:
|
||||
spack_ci.push_mirror_contents(
|
||||
env, job_spec, job_spec_yaml_path, buildcache_mirror_url,
|
||||
cdash_build_id, sign_binaries)
|
||||
except Exception as inst:
|
||||
# If the mirror we're pushing to is on S3 and there's some
|
||||
# permissions problem, for example, we can't just target
|
||||
# that exception type here, since users of the
|
||||
# `spack ci rebuild' may not need or want any dependency
|
||||
# on boto3. So we use the first non-boto exception type
|
||||
# in the heirarchy:
|
||||
# boto3.exceptions.S3UploadFailedError
|
||||
# boto3.exceptions.Boto3Error
|
||||
# Exception
|
||||
# BaseException
|
||||
# object
|
||||
err_msg = 'Error msg: {0}'.format(inst)
|
||||
if 'Access Denied' in err_msg:
|
||||
tty.msg('Permission problem writing to mirror')
|
||||
tty.msg(err_msg)
|
||||
# Create buildcache in either the main remote mirror, or in the
|
||||
# per-PR mirror, if this is a PR pipeline
|
||||
spack_ci.push_mirror_contents(
|
||||
env, job_spec, job_spec_yaml_path, buildcache_mirror_url,
|
||||
cdash_build_id, sign_binaries)
|
||||
|
||||
# Create another copy of that buildcache in the per-pipeline
|
||||
# temporary storage mirror (this is only done if either artifacts
|
||||
# buildcache is enabled or a temporary storage url prefix is set)
|
||||
spack_ci.push_mirror_contents(env, job_spec, job_spec_yaml_path,
|
||||
pipeline_mirror_url, cdash_build_id,
|
||||
sign_binaries)
|
||||
spack_ci.push_mirror_contents(
|
||||
env, job_spec, job_spec_yaml_path, pipeline_mirror_url,
|
||||
cdash_build_id, sign_binaries)
|
||||
|
||||
# Relate this build to its dependencies on CDash (if enabled)
|
||||
if enable_cdash:
|
||||
|
|
|
@ -878,6 +878,26 @@ def test_push_mirror_contents(tmpdir, mutable_mock_env_path, env_deactivate,
|
|||
assert(len(dl_dir_list) == 3)
|
||||
|
||||
|
||||
def test_push_mirror_contents_exceptions(monkeypatch, capsys):
|
||||
def faked(env, spec_yaml=None, packages=None, add_spec=True,
|
||||
add_deps=True, output_location=os.getcwd(),
|
||||
signing_key=None, force=False, make_relative=False,
|
||||
unsigned=False, allow_root=False, rebuild_index=False):
|
||||
raise Exception('Error: Access Denied')
|
||||
|
||||
import spack.cmd.buildcache as buildcache
|
||||
monkeypatch.setattr(buildcache, '_createtarball', faked)
|
||||
|
||||
url = 'fakejunk'
|
||||
ci.push_mirror_contents(None, None, None, url, None, None)
|
||||
|
||||
captured = capsys.readouterr()
|
||||
std_out = captured[0]
|
||||
expect_msg = 'Permission problem writing to {0}'.format(url)
|
||||
|
||||
assert(expect_msg in std_out)
|
||||
|
||||
|
||||
def test_ci_generate_override_runner_attrs(tmpdir, mutable_mock_env_path,
|
||||
env_deactivate, install_mockery,
|
||||
mock_packages, monkeypatch):
|
||||
|
@ -1373,7 +1393,7 @@ def test_ci_generate_temp_storage_url(tmpdir, mutable_mock_env_path,
|
|||
assert('script' in cleanup_job)
|
||||
cleanup_task = cleanup_job['script'][0]
|
||||
|
||||
assert(cleanup_task.startswith('spack mirror destroy'))
|
||||
assert(cleanup_task.startswith('spack -d mirror destroy'))
|
||||
|
||||
assert('stages' in pipeline_doc)
|
||||
stages = pipeline_doc['stages']
|
||||
|
|
|
@ -1,24 +0,0 @@
|
|||
pr_pipeline:
|
||||
only:
|
||||
- /^github\/pr[\d]+_.*$/
|
||||
variables:
|
||||
SPACK_REF: ${CI_COMMIT_SHA}
|
||||
SPACK_PR_BRANCH: ${CI_COMMIT_REF_NAME}
|
||||
SPACK_IS_PR_PIPELINE: "True"
|
||||
AWS_ACCESS_KEY_ID: ${PR_MIRRORS_AWS_ACCESS_KEY_ID}
|
||||
AWS_SECRET_ACCESS_KEY: ${PR_MIRRORS_AWS_SECRET_ACCESS_KEY}
|
||||
trigger:
|
||||
project: spack/e4s
|
||||
strategy: depend
|
||||
|
||||
develop_pipeline:
|
||||
only:
|
||||
- /^github\/develop$/
|
||||
variables:
|
||||
SPACK_REF: ${CI_COMMIT_SHA}
|
||||
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
|
||||
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
|
||||
SPACK_SIGNING_KEY: ${SPACK_SIGNING_KEY}
|
||||
trigger:
|
||||
project: spack/e4s
|
||||
strategy: depend
|
61
share/spack/gitlab/cloud_e4s_pipelines/.gitlab-ci.yml
Normal file
61
share/spack/gitlab/cloud_e4s_pipelines/.gitlab-ci.yml
Normal file
|
@ -0,0 +1,61 @@
|
|||
stages: [generate, build]
|
||||
|
||||
.generate:
|
||||
stage: generate
|
||||
script:
|
||||
- . "./share/spack/setup-env.sh"
|
||||
- spack --version
|
||||
- cd share/spack/gitlab/cloud_e4s_pipelines/stacks/e4s
|
||||
- spack env activate --without-view .
|
||||
- spack -d ci generate --check-index-only
|
||||
--output-file "${CI_PROJECT_DIR}/jobs_scratch_dir/e4s_pipeline.yml"
|
||||
artifacts:
|
||||
paths:
|
||||
- "${CI_PROJECT_DIR}/jobs_scratch_dir/e4s_pipeline.yml"
|
||||
tags: ["spack", "public", "medium"]
|
||||
|
||||
e4s-pr-generate:
|
||||
only:
|
||||
- /^github\/pr[\d]+_.*$/
|
||||
- move-pr-stack-into-spack
|
||||
extends: .generate
|
||||
before_script:
|
||||
- export SPACK_PR_BRANCH=${CI_COMMIT_REF_NAME}
|
||||
- export SPACK_IS_PR_PIPELINE="True"
|
||||
image: { "name": "ghcr.io/scottwittenburg/ecpe4s-ubuntu18.04-runner-x86_64:2020-09-01", "entrypoint": [""] }
|
||||
|
||||
e4s-develop-generate:
|
||||
only:
|
||||
- /^github\/develop$/
|
||||
extends: .generate
|
||||
image: { "name": "ghcr.io/scottwittenburg/ecpe4s-ubuntu18.04-runner-x86_64:2020-09-01", "entrypoint": [""] }
|
||||
|
||||
e4s-pr-build:
|
||||
only:
|
||||
- /^github\/pr[\d]+_.*$/
|
||||
- move-pr-stack-into-spack
|
||||
stage: build
|
||||
trigger:
|
||||
include:
|
||||
- artifact: "jobs_scratch_dir/e4s_pipeline.yml"
|
||||
job: e4s-pr-generate
|
||||
strategy: depend
|
||||
variables:
|
||||
AWS_ACCESS_KEY_ID: ${PR_MIRRORS_AWS_ACCESS_KEY_ID}
|
||||
AWS_SECRET_ACCESS_KEY: ${PR_MIRRORS_AWS_SECRET_ACCESS_KEY}
|
||||
SPACK_PR_BRANCH: ${CI_COMMIT_REF_NAME}
|
||||
SPACK_IS_PR_PIPELINE: "True"
|
||||
|
||||
e4s-develop-build:
|
||||
only:
|
||||
- /^github\/develop$/
|
||||
stage: build
|
||||
trigger:
|
||||
include:
|
||||
- artifact: "jobs_scratch_dir/e4s_pipeline.yml"
|
||||
job: e4s-develop-generate
|
||||
strategy: depend
|
||||
variables:
|
||||
AWS_ACCESS_KEY_ID: ${MIRRORS_AWS_ACCESS_KEY_ID}
|
||||
AWS_SECRET_ACCESS_KEY: ${MIRRORS_AWS_SECRET_ACCESS_KEY}
|
||||
SPACK_SIGNING_KEY: ${PACKAGE_SIGNING_KEY}
|
151
share/spack/gitlab/cloud_e4s_pipelines/stacks/e4s/spack.yaml
Normal file
151
share/spack/gitlab/cloud_e4s_pipelines/stacks/e4s/spack.yaml
Normal file
|
@ -0,0 +1,151 @@
|
|||
spack:
|
||||
view: false
|
||||
concretization: separately
|
||||
|
||||
config:
|
||||
install_tree:
|
||||
root: /home/software/spack
|
||||
padded_length: 512
|
||||
projections:
|
||||
all: '{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}'
|
||||
|
||||
packages:
|
||||
all:
|
||||
target: [x86_64]
|
||||
providers:
|
||||
blas:
|
||||
- openblas
|
||||
mpi:
|
||||
- mpich
|
||||
variants: +mpi
|
||||
binutils:
|
||||
variants: +gold+headers+libiberty~nls
|
||||
version:
|
||||
- 2.33.1
|
||||
cmake:
|
||||
version: [3.18.4]
|
||||
hdf5:
|
||||
variants: +fortran
|
||||
mpich:
|
||||
variants: ~wrapperrpath
|
||||
openblas:
|
||||
version: [0.3.10]
|
||||
slepc:
|
||||
version: [3.14.0]
|
||||
|
||||
definitions:
|
||||
- e4s:
|
||||
- adios
|
||||
- adios2
|
||||
- aml
|
||||
- amrex
|
||||
- arborx
|
||||
- argobots
|
||||
- ascent
|
||||
- axom
|
||||
- bolt
|
||||
- caliper
|
||||
- darshan-runtime
|
||||
- darshan-util
|
||||
- dyninst
|
||||
- faodel
|
||||
- flecsi+cinch
|
||||
- flit
|
||||
- gasnet
|
||||
- ginkgo
|
||||
- globalarrays
|
||||
- gotcha
|
||||
- hdf5
|
||||
- hpctoolkit
|
||||
- hpx
|
||||
- hypre
|
||||
- kokkos-kernels+openmp
|
||||
- kokkos+openmp
|
||||
- legion
|
||||
- libnrm
|
||||
- libquo
|
||||
- magma cuda_arch=70 ^cuda@10.2.89
|
||||
- mercury
|
||||
- mfem
|
||||
- mpifileutils@develop~xattr
|
||||
- ninja
|
||||
- omega-h
|
||||
- openmpi
|
||||
- openpmd-api
|
||||
- papi
|
||||
- papyrus@1.0.1
|
||||
- parallel-netcdf
|
||||
- pdt
|
||||
- petsc
|
||||
- phist
|
||||
- plasma
|
||||
- precice
|
||||
- pumi
|
||||
- py-jupyterhub
|
||||
- py-libensemble
|
||||
- py-petsc4py
|
||||
- qthreads scheduler=distrib
|
||||
- raja
|
||||
- rempi
|
||||
- scr
|
||||
- slate ^openblas@0.3.5 threads=openmp ^cuda@10.2.89
|
||||
- slepc
|
||||
- stc
|
||||
- strumpack ~slate
|
||||
- sundials
|
||||
- superlu
|
||||
- superlu-dist
|
||||
- swig
|
||||
- sz
|
||||
- tasmanian
|
||||
- tau
|
||||
- trilinos
|
||||
- turbine
|
||||
- umap
|
||||
- umpire
|
||||
- unifyfs
|
||||
- upcxx
|
||||
- veloc
|
||||
- zfp
|
||||
- arch:
|
||||
- '%gcc@7.5.0 arch=linux-ubuntu18.04-x86_64'
|
||||
|
||||
specs:
|
||||
- matrix:
|
||||
- - $e4s
|
||||
- - $arch
|
||||
|
||||
mirrors: { "mirror": "s3://spack-binaries-develop/e4s-new-cluster" }
|
||||
|
||||
gitlab-ci:
|
||||
script:
|
||||
- . "./share/spack/setup-env.sh"
|
||||
- spack --version
|
||||
- cd share/spack/gitlab/cloud_e4s_pipelines/stacks/e4s
|
||||
- spack env activate --without-view .
|
||||
- spack -d ci rebuild
|
||||
mappings:
|
||||
- match: [cuda, dyninst, hpx, precice, strumpack, sundials, trilinos, vtk-h, vtk-m]
|
||||
runner-attributes:
|
||||
image: { "name": "ghcr.io/scottwittenburg/ecpe4s-ubuntu18.04-runner-x86_64:2020-09-01", "entrypoint": [""] }
|
||||
tags: ["spack", "public", "xlarge"]
|
||||
- match: ['os=ubuntu18.04']
|
||||
runner-attributes:
|
||||
image: { "name": "ghcr.io/scottwittenburg/ecpe4s-ubuntu18.04-runner-x86_64:2020-09-01", "entrypoint": [""] }
|
||||
tags: ["spack", "public", "large"]
|
||||
temporary-storage-url-prefix: "s3://spack-binaries-prs/pipeline-storage"
|
||||
service-job-attributes:
|
||||
before_script:
|
||||
- . "./share/spack/setup-env.sh"
|
||||
- spack --version
|
||||
- cd share/spack/gitlab/cloud_e4s_pipelines/stacks/e4s
|
||||
- spack env activate --without-view .
|
||||
image: { "name": "ghcr.io/scottwittenburg/ecpe4s-ubuntu18.04-runner-x86_64:2020-09-01", "entrypoint": [""] }
|
||||
tags: ["spack", "public", "medium"]
|
||||
|
||||
cdash:
|
||||
build-group: New PR testing workflow
|
||||
url: https://cdash.spack.io
|
||||
project: Spack Testing
|
||||
site: Cloud Gitlab Infrastructure
|
||||
|
Loading…
Reference in a new issue