Pipelines: Move PR testing stacks (currently only E4S) into spack (#21714)
This commit is contained in:
		| @@ -22,7 +22,7 @@ | |||||||
| 
 | 
 | ||||||
| import spack | import spack | ||||||
| import spack.binary_distribution as bindist | import spack.binary_distribution as bindist | ||||||
| import spack.cmd.buildcache as buildcache | import spack.cmd | ||||||
| import spack.compilers as compilers | import spack.compilers as compilers | ||||||
| import spack.config as cfg | import spack.config as cfg | ||||||
| import spack.environment as ev | import spack.environment as ev | ||||||
| @@ -41,7 +41,7 @@ | |||||||
|     'always', |     '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' | TEMP_STORAGE_MIRROR_NAME = 'ci_temporary_mirror' | ||||||
| 
 | 
 | ||||||
| spack_gpg = spack.main.SpackCommand('gpg') | 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['stage'] = 'cleanup-temp-storage' | ||||||
|             cleanup_job['script'] = [ |             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) |                     temp_storage_url_prefix) | ||||||
|             ] |             ] | ||||||
|             cleanup_job['when'] = 'always' |             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, | def push_mirror_contents(env, spec, yaml_path, mirror_url, build_id, | ||||||
|                          sign_binaries): |                          sign_binaries): | ||||||
|     if mirror_url: |     if mirror_url: | ||||||
|  |         try: | ||||||
|             unsigned = not sign_binaries |             unsigned = not sign_binaries | ||||||
|             tty.debug('Creating buildcache ({0})'.format( |             tty.debug('Creating buildcache ({0})'.format( | ||||||
|                 'unsigned' if unsigned else 'signed')) |                 'unsigned' if unsigned else 'signed')) | ||||||
|         buildcache._createtarball(env, spec_yaml=yaml_path, add_deps=False, |             spack.cmd.buildcache._createtarball( | ||||||
|                                   output_location=mirror_url, force=True, |                 env, spec_yaml=yaml_path, add_deps=False, | ||||||
|                                   allow_root=True, unsigned=unsigned) |                 output_location=mirror_url, force=True, allow_root=True, | ||||||
|  |                 unsigned=unsigned) | ||||||
|             if build_id: |             if build_id: | ||||||
|                 tty.debug('Writing cdashid ({0}) to remote mirror: {1}'.format( |                 tty.debug('Writing cdashid ({0}) to remote mirror: {1}'.format( | ||||||
|                     build_id, mirror_url)) |                     build_id, mirror_url)) | ||||||
|                 write_cdashid_to_mirror(build_id, spec, 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): | def copy_stage_logs_to_artifacts(job_spec, job_log_dir): | ||||||
|   | |||||||
| @@ -413,33 +413,18 @@ def add_mirror(mirror_name, mirror_url): | |||||||
|             else: |             else: | ||||||
|                 buildcache_mirror_url = remote_mirror_url |                 buildcache_mirror_url = remote_mirror_url | ||||||
| 
 | 
 | ||||||
|             try: |             # 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( |             spack_ci.push_mirror_contents( | ||||||
|                 env, job_spec, job_spec_yaml_path, buildcache_mirror_url, |                 env, job_spec, job_spec_yaml_path, buildcache_mirror_url, | ||||||
|                 cdash_build_id, sign_binaries) |                 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 another copy of that buildcache in the per-pipeline |             # Create another copy of that buildcache in the per-pipeline | ||||||
|             # temporary storage mirror (this is only done if either artifacts |             # temporary storage mirror (this is only done if either artifacts | ||||||
|             # buildcache is enabled or a temporary storage url prefix is set) |             # buildcache is enabled or a temporary storage url prefix is set) | ||||||
|             spack_ci.push_mirror_contents(env, job_spec, job_spec_yaml_path, |             spack_ci.push_mirror_contents( | ||||||
|                                           pipeline_mirror_url, cdash_build_id, |                 env, job_spec, job_spec_yaml_path, pipeline_mirror_url, | ||||||
|                                           sign_binaries) |                 cdash_build_id, sign_binaries) | ||||||
| 
 | 
 | ||||||
|             # Relate this build to its dependencies on CDash (if enabled) |             # Relate this build to its dependencies on CDash (if enabled) | ||||||
|             if enable_cdash: |             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) |             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, | def test_ci_generate_override_runner_attrs(tmpdir, mutable_mock_env_path, | ||||||
|                                            env_deactivate, install_mockery, |                                            env_deactivate, install_mockery, | ||||||
|                                            mock_packages, monkeypatch): |                                            mock_packages, monkeypatch): | ||||||
| @@ -1373,7 +1393,7 @@ def test_ci_generate_temp_storage_url(tmpdir, mutable_mock_env_path, | |||||||
|                 assert('script' in cleanup_job) |                 assert('script' in cleanup_job) | ||||||
|                 cleanup_task = cleanup_job['script'][0] |                 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) |                 assert('stages' in pipeline_doc) | ||||||
|                 stages = pipeline_doc['stages'] |                 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 | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user
	 Scott Wittenburg
					Scott Wittenburg