|
| 1 | +workflow: |
| 2 | + name: '$GITHUB_PIPELINE_NAME' |
| 3 | + |
| 4 | +.dependency-n-fetch-pr: |
| 5 | + stage: test |
| 6 | + before_script: |
| 7 | + - apt-get update && apt-get install -y git cmake python3 libopenmpi-dev openmpi-bin |
| 8 | + - | |
| 9 | + if [ -n "$GITHUB_PR_NUMBER" ]; then |
| 10 | + echo "GITHUB_PR_NUMBER=$GITHUB_PR_NUMBER" |
| 11 | + echo "GITHUB_MERGE_REF=$GITHUB_MERGE_REF" |
| 12 | + echo "GITHUB_TRIGGER_ACTOR=$GITHUB_TRIGGER_ACTOR" |
| 13 | + echo "GITHUB_PR_TITLE=$GITHUB_PR_TITLE" |
| 14 | + git remote remove github || true |
| 15 | + git remote add github https://github.com/amrex-codes/amrex.git |
| 16 | + git fetch --depth=1 github "${GITHUB_MERGE_REF}" |
| 17 | + git checkout FETCH_HEAD |
| 18 | + fi |
| 19 | +
|
| 20 | +Nvidia-H100-single-precision: |
| 21 | + extends: .dependency-n-fetch-pr |
| 22 | + tags: [nvidia-h100] |
| 23 | + image: nvcr.io/nvidia/cuda:12.8.0-devel-ubuntu24.04 |
| 24 | + script: |
| 25 | + - | |
| 26 | + cmake -S . -B build \ |
| 27 | + -DCMAKE_VERBOSE_MAKEFILE=ON \ |
| 28 | + -DAMReX_PRECISION=SINGLE \ |
| 29 | + -DAMReX_PARTICLES_PRECISION=SINGLE \ |
| 30 | + -DAMReX_SPACEDIM="1;2;3" \ |
| 31 | + -DAMReX_FFT=ON \ |
| 32 | + -DAMReX_EB=ON \ |
| 33 | + -DAMReX_ENABLE_TESTS=ON \ |
| 34 | + -DAMReX_FORTRAN=OFF \ |
| 35 | + -DAMReX_GPU_BACKEND=CUDA \ |
| 36 | + -DCMAKE_C_COMPILER=$(which gcc) \ |
| 37 | + -DCMAKE_CXX_COMPILER=$(which g++) \ |
| 38 | + -DCMAKE_CUDA_HOST_COMPILER=$(which g++) \ |
| 39 | + -DAMReX_CUDA_ARCH="9.0" \ |
| 40 | + -DAMReX_CUDA_ERROR_CROSS_EXECUTION_SPACE_CALL=ON \ |
| 41 | + -DAMReX_CUDA_ERROR_CAPTURE_THIS=ON |
| 42 | + - cmake --build build -j 16 |
| 43 | + - export OMPI_ALLOW_RUN_AS_ROOT=1 |
| 44 | + - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 |
| 45 | + - export AMREX_THE_ARENA_INIT_SIZE=1e9 |
| 46 | + - ctest -j 2 --test-dir build --output-on-failure |
| 47 | + |
| 48 | +AMD-MI300A: |
| 49 | + extends: .dependency-n-fetch-pr |
| 50 | + tags: [amd-mi300] |
| 51 | + image: rocm/dev-ubuntu-24.04:6.4.3-complete |
| 52 | + script: |
| 53 | + - export ROCM_PATH=/opt/rocm-6.4.3 |
| 54 | + - export PATH=$ROCM_PATH/bin:$ROCM_PATH/llvm/bin:$PATH |
| 55 | + - export LD_LIBRARY_PATH=$ROCM_PATH/lib:$ROCM_PATH/lib64:$LD_LIBRARY_PATH |
| 56 | + - export HIP_PATH=$ROCM_PATH |
| 57 | + - export HIP_CLANG_PATH=$ROCM_PATH/llvm/bin |
| 58 | + - export CMAKE_PREFIX_PATH=$ROCM_PATH:$CMAKE_PREFIX_PATH |
| 59 | + - | |
| 60 | + cmake -S . -B build \ |
| 61 | + -DCMAKE_VERBOSE_MAKEFILE=ON \ |
| 62 | + -DAMReX_SPACEDIM="1;2;3" \ |
| 63 | + -DAMReX_FFT=ON \ |
| 64 | + -DAMReX_EB=ON \ |
| 65 | + -DAMReX_ENABLE_TESTS=ON \ |
| 66 | + -DAMReX_FORTRAN=OFF \ |
| 67 | + -DAMReX_GPU_BACKEND=HIP \ |
| 68 | + -DAMReX_AMD_ARCH=gfx942 \ |
| 69 | + -DCMAKE_C_COMPILER=$(which clang) \ |
| 70 | + -DCMAKE_CXX_COMPILER=$(which clang++) \ |
| 71 | + -DCMAKE_CXX_STANDARD=17 |
| 72 | + - cmake --build build -j 16 |
| 73 | + - export OMPI_ALLOW_RUN_AS_ROOT=1 |
| 74 | + - export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1 |
| 75 | + - export AMREX_THE_ARENA_INIT_SIZE=1e9 |
| 76 | + - ctest -j 2 --test-dir build --output-on-failure |
| 77 | + |
| 78 | +Intel-PVC: |
| 79 | + extends: .dependency-n-fetch-pr |
| 80 | + tags: [intel-data-center-max-1100] |
| 81 | + image: intel/oneapi-basekit:2025.3.0-0-devel-ubuntu24.04 |
| 82 | + script: |
| 83 | + - sycl-ls |
| 84 | + - export ONEAPI_DEVICE_SELECTOR=level_zero:gpu |
| 85 | + - | |
| 86 | + cmake -S . -B build \ |
| 87 | + -DCMAKE_VERBOSE_MAKEFILE=ON \ |
| 88 | + -DAMReX_MPI=OFF \ |
| 89 | + -DAMReX_SPACEDIM="1;2;3" \ |
| 90 | + -DAMReX_FFT=ON \ |
| 91 | + -DAMReX_EB=ON \ |
| 92 | + -DAMReX_ENABLE_TESTS=ON \ |
| 93 | + -DAMReX_FORTRAN=OFF \ |
| 94 | + -DAMReX_GPU_BACKEND=SYCL \ |
| 95 | + -DCMAKE_C_COMPILER=$(which icx) \ |
| 96 | + -DCMAKE_CXX_COMPILER=$(which icpx) \ |
| 97 | + -DCMAKE_CXX_FLAGS="-fp-model=precise" \ |
| 98 | + -DAMReX_PARALLEL_LINK_JOBS=8 |
| 99 | + - cmake --build build -j 16 |
| 100 | + - export AMREX_THE_ARENA_INIT_SIZE=1e9 |
| 101 | + - ctest -j 4 --test-dir build --output-on-failure |
| 102 | + |
| 103 | +post_github_comment: |
| 104 | + stage: .post |
| 105 | + image: python:3.11-slim |
| 106 | + script: |
| 107 | + - pip install PyJWT requests cryptography |
| 108 | + - | |
| 109 | + python3 << 'EOF' |
| 110 | + import jwt |
| 111 | + import time |
| 112 | + import requests |
| 113 | + import os |
| 114 | + import sys |
| 115 | + import base64 |
| 116 | +
|
| 117 | + # --- START: Get effective Pipeline Status from GitLab API --- |
| 118 | + gitlab_api_url = os.environ['CI_API_V4_URL'] |
| 119 | + project_id = os.environ['CI_PROJECT_ID'] |
| 120 | + pipeline_id = os.environ['CI_PIPELINE_ID'] |
| 121 | + job_token = os.environ['CI_JOB_TOKEN'] |
| 122 | + current_job_name = os.environ['CI_JOB_NAME'] |
| 123 | +
|
| 124 | + final_status = 'success' # Assume success until a failure is found |
| 125 | + try: |
| 126 | + # Get all jobs for the pipeline |
| 127 | + api_endpoint = f"{gitlab_api_url}/projects/{project_id}/pipelines/{pipeline_id}/jobs" |
| 128 | + headers = {'JOB-TOKEN': job_token} |
| 129 | + params = {'scope[]': ['success', 'failed', 'canceled'], 'per_page': 100} |
| 130 | + response = requests.get(api_endpoint, headers=headers, params=params) |
| 131 | + response.raise_for_status() |
| 132 | +
|
| 133 | + jobs = response.json() |
| 134 | + for job in jobs: |
| 135 | + # We only care about the result of test/build jobs, not this notification job itself |
| 136 | + if job['name'] == current_job_name: |
| 137 | + continue |
| 138 | +
|
| 139 | + if job['status'] in ['failed', 'canceled']: |
| 140 | + final_status = 'failed' |
| 141 | + break # Found a failure, no need to check further |
| 142 | +
|
| 143 | + except requests.exceptions.RequestException as e: |
| 144 | + print(f"Error fetching job statuses from GitLab API: {e}", file=sys.stderr) |
| 145 | + final_status = 'unknown' # If API fails, report unknown status |
| 146 | + # --- END: Get effective Pipeline Status --- |
| 147 | +
|
| 148 | + # Generate JWT for GitHub App authentication |
| 149 | + app_id = os.environ['GITHUB_APP_ID'] |
| 150 | + payload = { |
| 151 | + 'iat': int(time.time()), |
| 152 | + 'exp': int(time.time()) + 600, |
| 153 | + 'iss': app_id |
| 154 | + } |
| 155 | + token = jwt.encode( |
| 156 | + payload, |
| 157 | + base64.b64decode(os.environ['GITHUB_APP_PRIVATE_KEY']).decode('utf-8'), |
| 158 | + algorithm='RS256' |
| 159 | + ) |
| 160 | +
|
| 161 | + # Get installation access token |
| 162 | + installation_id = os.environ['GITHUB_APP_INSTALLATION_ID'] |
| 163 | + token_response = requests.post( |
| 164 | + f'https://api.github.com/app/installations/{installation_id}/access_tokens', |
| 165 | + headers = { |
| 166 | + 'Authorization': f'Bearer {token}', |
| 167 | + 'Accept': 'application/vnd.github+json' |
| 168 | + } |
| 169 | + ) |
| 170 | + if token_response.status_code != 201: |
| 171 | + print(f"Failed to get access token: HTTP {token_response.status_code}") |
| 172 | + sys.exit(1) |
| 173 | +
|
| 174 | + # Post comment to PR |
| 175 | + pr_number = os.environ.get('GITHUB_PR_NUMBER') |
| 176 | + pipeline_url = os.environ['CI_PIPELINE_URL'] |
| 177 | +
|
| 178 | + comment_body = f"GitLab CI {pipeline_id} finished with status: **{final_status}**. See details at {pipeline_url}." |
| 179 | +
|
| 180 | + comment_response = requests.post( |
| 181 | + f'https://api.github.com/repos/AMReX-Codes/amrex/issues/{pr_number}/comments', |
| 182 | + headers = { |
| 183 | + 'Authorization': f'Bearer {token_response.json()["token"]}', |
| 184 | + 'Accept': 'application/vnd.github+json' |
| 185 | + }, |
| 186 | + json={'body': comment_body} |
| 187 | + ) |
| 188 | + if comment_response.status_code != 201: |
| 189 | + print(f"Failed to post comment: HTTP {comment_response.status_code}") |
| 190 | + sys.exit(1) |
| 191 | + print("Successfully posted comment to GitHub PR") |
| 192 | + EOF |
| 193 | + when: always |
| 194 | + rules: |
| 195 | + - if: $GITHUB_PR_NUMBER |
0 commit comments