Skip to content

Fix name clashes in concurrent tests (#4397) #5978

Fix name clashes in concurrent tests (#4397)

Fix name clashes in concurrent tests (#4397) #5978

Workflow file for this run

#######################################
# Ideally this would be done in seperate workflows but placing them all
# in one is currently necessary to enforce job dependencies
#######################################
#######################################
# Note the use of multiple checkout actions in most jobs. This has been
# implemented to allow the use of CI scripts at a different ref or sha than
# the source code they're evaluating. For push events (when a pull_request is
# merged) there is no difference. However, for pull_request events this allows
# us test code at the head of a pull_request using the CI scripts from the
# prospectively merged pull_request, which will include any CI updates that
# may have made it to the target branch after the pull_request was started.
#######################################
#######################################
# Note regarding restore/save of cache for use by ccache:
#
# We only save cache on main branch runs. PR workflows only consume the
# cache to avoid exceeding the 10 GB limit, which can cause cache thrashing.
# Also, we only save the cache if there was *not* an exact match when cache
# was restored. This avoids attempting to write to an existing cache key,
# which results in failure to save the cache. While failure to save doesn't
# cause job failures, it seems a waste and is easily avoidable.
#######################################
name: GitHub Actions
on:
push:
branches:
- master
- release*
pull_request:
branches:
- master
- release*
concurrency:
group: ${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
#######################################
# Git checks
#######################################
git_checks:
runs-on: ubuntu-latest
outputs:
num_code_changes: ${{ steps.get_code_changes.outputs.num_code_changes }}
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Check for appropriately named topic branch
run: |
scripts/ci/gh-actions/check-branch-name.sh
- name: Check for code changes
id: get_code_changes
run: |
scripts/ci/gh-actions/get-changed-files.sh
echo "::group::Test script output files"
ls -la *-changed-files.txt
NUM_CHANGES=$(wc -l < filtered-changed-files.txt)
echo "Number of files changed (filtered): ${NUM_CHANGES}"
echo "num_code_changes=${NUM_CHANGES}" >> $GITHUB_OUTPUT
#######################################
# Formatting jobs
#######################################
format:
needs: git_checks
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ubuntu-latest
container:
image: ghcr.io/ornladios/adios2:ci-formatting
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: CXX
working-directory: source
run: ../gha/scripts/ci/scripts/run-clang-format.sh
- name: Python flake8
working-directory: source
run: ../gha/scripts/ci/scripts/run-flake8.sh
- name: Python pylint
working-directory: source
run: ../gha/scripts/ci/scripts/run-pylint.sh
- name: Python black
working-directory: source
run: ../gha/scripts/ci/scripts/run-black.sh
- name: Shell
working-directory: source
run: ../gha/scripts/ci/scripts/run-shellcheck.sh
#######################################
# Build and test jobs
#######################################
ubuntu:
needs: [format, git_checks]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ubuntu-20.04
container:
image: ghcr.io/ornladios/adios2:ci-spack-${{ matrix.os }}-${{ matrix.compiler }}
options: --shm-size=1g
env:
GH_YML_JOBNAME: ${{ matrix.os }}-${{ matrix.compiler }}${{ matrix.shared == 'static' && '-static' || ''}}-${{ matrix.parallel }}
GH_YML_BASE_OS: Linux
GH_YML_MATRIX_OS: ${{ matrix.os }}
GH_YML_MATRIX_COMPILER: ${{ matrix.compiler }}
GH_YML_MATRIX_PARALLEL: ${{ matrix.parallel }}
CCACHE_BASEDIR: "${GITHUB_WORKSPACE}"
CCACHE_DIR: "${GITHUB_WORKSPACE}/.ccache"
CCACHE_COMPRESS: true
CCACHE_COMPRESSLEVEL: 6
strategy:
fail-fast: false
matrix:
os: [ubuntu20.04]
compiler: [gcc8, gcc9, gcc10, clang6, clang10]
parallel: [mpich]
include:
- os: ubuntu20.04
compiler: gcc8
parallel: ompi
- os: ubuntu20.04
compiler: gcc8
parallel: serial
- os: ubuntu20.04
compiler: clang6
parallel: ompi
- os: ubuntu20.04
compiler: clang6
parallel: serial
- os: ubuntu20.04
compiler: gcc8
parallel: serial
shared: static
- os: ubuntu20.04
compiler: gcc8
shared: static
parallel: mpich
constrains: build_only
- os: ubuntu20.04
compiler: clang6
shared: static
parallel: mpich
constrains: build_only
- os: ubuntu22.04
compiler: rocm
parallel: serial
constrains: build_only
- os: ubuntu22.04
compiler: gcc11
parallel: mpich
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Restore cache
uses: actions/cache/restore@v4
id: restore-cache
with:
path: .ccache
key: ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
restore-keys: |
ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}
- name: Configure cache
run: ccache -z
- name: Setup
run: gha/scripts/ci/gh-actions/linux-setup.sh
- name: Update
run: gha/scripts/ci/gh-actions/run.sh update
- name: Configure
run: gha/scripts/ci/gh-actions/run.sh configure
- name: Build
run: gha/scripts/ci/gh-actions/run.sh build
- name: Print ccache statistics
run: ccache -s | tee $GITHUB_STEP_SUMMARY
- name: Save cache
uses: actions/cache/save@v4
if: ${{ github.ref_name == 'master' && steps.restore-cache.outputs.cache-hit != 'true' }}
id: save-cache
with:
path: .ccache
key: ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
- name: Test
if: ${{ matrix.constrains != 'build_only' }}
run: gha/scripts/ci/gh-actions/run.sh test
el8:
needs: [format, git_checks]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ubuntu-latest
container:
image: ghcr.io/ornladios/adios2:ci-el8-${{ matrix.compiler }}
options: --shm-size=1g
env:
GH_YML_JOBNAME: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}
GH_YML_BASE_OS: Linux
GH_YML_MATRIX_OS: ${{ matrix.os }}
GH_YML_MATRIX_COMPILER: ${{ matrix.compiler }}
GH_YML_MATRIX_PARALLEL: ${{ matrix.parallel }}
CCACHE_BASEDIR: "${GITHUB_WORKSPACE}"
CCACHE_DIR: "${GITHUB_WORKSPACE}/.ccache"
CCACHE_COMPRESS: true
CCACHE_COMPRESSLEVEL: 6
strategy:
fail-fast: false
matrix:
os: [el8]
compiler: [icc, oneapi]
parallel: [mpich]
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Restore cache
uses: actions/cache/restore@v4
id: restore-cache
with:
path: .ccache
key: ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
restore-keys: |
ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}
- name: Configure cache
run: ccache -z
- name: Setup
run: gha/scripts/ci/gh-actions/linux-setup.sh
- name: Update
run: gha/scripts/ci/gh-actions/run.sh update
- name: Configure
run: gha/scripts/ci/gh-actions/run.sh configure
- name: Build
run: gha/scripts/ci/gh-actions/run.sh build
- name: Print ccache statistics
run: ccache -s
- name: Save cache
uses: actions/cache/save@v4
if: ${{ github.ref_name == 'master' && steps.restore-cache.outputs.cache-hit != 'true' }}
id: save-cache
with:
path: .ccache
key: ccache-${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
- name: Test
run: gha/scripts/ci/gh-actions/run.sh test
macos:
needs: [format, git_checks]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ${{ matrix.image }}
env:
# Only way to source a file in a non interactive/non login shell.
BASH_ENV: "/Users/runner/.bash_profile"
CCACHE_BASEDIR: "${GITHUB_WORKSPACE}"
CCACHE_COMPRESSLEVEL: 6
CCACHE_COMPRESS: true
CCACHE_DIR: "${GITHUB_WORKSPACE}/.ccache"
GH_YML_BASE_OS: macOS
GH_YML_JOBNAME: ${{ matrix.image }}-${{ matrix.compiler }}-${{ matrix.shared }}-${{ matrix.parallel }}
GH_YML_MATRIX_ARCH : ${{ matrix.arch }}
GH_YML_MATRIX_COMPILER: ${{ matrix.compiler }}
GH_YML_MATRIX_OS: ${{ matrix.image }}
GH_YML_MATRIX_PARALLEL: ${{ matrix.parallel }}
strategy:
fail-fast: false
matrix:
image: [macos-13, macos-14]
shared: [shared, static]
include:
- image: macos-13
arch: x64
compiler: xcode14_2
- image: macos-14
arch: arm64
compiler: xcode15_4
- parallel: serial
exclude:
- image: macos-13
shared: static
name: macos (${{ matrix.image }}, ${{ matrix.compiler}}, ${{ matrix.arch }}, ${{ matrix.shared }}, ${{ matrix.parallel }})
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Setup
run: gha/scripts/ci/gh-actions/macos-setup.sh
- name: Restore cache
uses: actions/cache/restore@v4
id: restore-cache
with:
path: .ccache
key: ccache-${{ matrix.image}}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
restore-keys: |
ccache-${{ matrix.image }}-${{ matrix.compiler }}-${{ matrix.parallel }}
- name: Configure cache
run: ccache -z
- name: Update
run: gha/scripts/ci/gh-actions/run.sh update
- name: Configure
run: gha/scripts/ci/gh-actions/run.sh configure
- name: Build
run: gha/scripts/ci/gh-actions/run.sh build
- name: Print ccache statistics
run: ccache -s
- name: Save cache
uses: actions/cache/save@v4
if: ${{ github.ref_name == 'master' && steps.restore-cache.outputs.cache-hit != 'true' }}
id: save-cache
with:
path: .ccache
key: ccache-${{ matrix.image }}-${{ matrix.compiler }}-${{ matrix.parallel }}-${{ github.sha }}
- name: Test
run: gha/scripts/ci/gh-actions/run.sh test
windows:
needs: [format, git_checks]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ${{ matrix.image }}
env:
GH_YML_JOBNAME: ${{ matrix.os }}-${{ matrix.compiler }}${{ matrix.shared == 'static' && '-static' || ''}}-${{ matrix.parallel }}
GH_YML_BASE_OS: Windows
GH_YML_MATRIX_OS: ${{ matrix.os }}
GH_YML_MATRIX_COMPILER: ${{ matrix.compiler }}
GH_YML_MATRIX_PARALLEL: ${{ matrix.parallel }}
strategy:
fail-fast: false
matrix:
os: [win2019, win2022]
shared: [shared]
parallel: [msmpi]
include:
- os: win2019
image: windows-2019
compiler: vs2019
- os: win2022
image: windows-2022
compiler: vs2022
- os: win2022
image: windows-2022
compiler: vs2022
parallel: serial
- os: win2022
image: windows-2022
shared: static
compiler: vs2022
parallel: serial
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Setup
shell: pwsh
run: gha/scripts/ci/gh-actions/windows-setup.ps1
- name: Update
run: gha/scripts/ci/gh-actions/run.sh update
- name: Configure
run: gha/scripts/ci/gh-actions/run.sh configure
- name: Build
run: gha/scripts/ci/gh-actions/run.sh build
- name: Test
run: gha/scripts/ci/gh-actions/run.sh test
#######################################
# Docker container jobs
#######################################
docker:
needs: [format, git_checks]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
baseos: [ubuntu-bionic]
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: ci-source
- name: Re-configure docker daemon
run: |
sudo systemctl stop docker
echo $'{\n "experimental": true\n}' | \
sudo tee /etc/docker/daemon.json
sudo systemctl start docker
- name: Build image
run: |
docker build \
--rm --squash \
-t ornladios/adios2:ci-tmp \
--build-arg baseos=${{ matrix.baseos }} \
--build-arg ci_source_dir=ci-source \
-f ci-source/scripts/ci/images/spack/Dockerfile \
.
- name: Save image as a tar file
run: |
docker save -o ci-docker.tar ornladios/adios2:ci-tmp
ls -lah ci-docker.tar
- name: Upload
uses: actions/upload-artifact@v4
with:
retention-days: 1
name: ci-docker ${{ matrix.baseos }} ${{ github.sha }}
path: ci-docker.tar
- name: Push image to Docker Hub
if: github.event_name == 'push'
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
run: |
target_tag="${GITHUB_REF##refs/heads/}-${{ matrix.baseos }}"
docker tag \
ornladios/adios2:ci-tmp \
ornladios/adios2:${target_tag}
docker login \
--username="${DOCKERHUB_USERNAME}" \
--password="${DOCKERHUB_PASSWORD}"
docker push \
ornladios/adios2:${target_tag}
#######################################
# Contract testing jobs
#######################################
# These contract testing jobs use the container built in the previous
# docker job and runs it in a way similar to how a typical GitHub
# Actions container job does. Using the "messy" default shell for
# run steps lets the steps be written as though they too were using a
# standard container job.
contract:
needs: [format, git_checks, docker]
if: needs.git_checks.outputs.num_code_changes > 0
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
code: [examples, lammps, tau]
include:
- code: examples
- code: lammps
repo: pnorbert/lammps
ref: fix-deprecated-adios-init
- code: tau
defaults:
run:
shell: bash -c "docker exec adios2-ci bash --login -e $(echo {0} | sed 's|/home/runner/work|/__w|g')"
steps:
- uses: actions/checkout@v4
if: ${{ matrix.repo != '' }}
with:
repository: ${{ matrix.repo }}
ref: ${{ matrix.ref }}
path: source
- name: Download CI docker image
uses: actions/download-artifact@v4
with:
name: ci-docker ubuntu-bionic ${{ github.sha }}
- name: Initialize containers
shell: bash -e {0}
run: |
sudo chown 1000:1000 .
docker load -i ci-docker.tar
docker create \
--name adios2-ci --workdir /__w/ADIOS2/ADIOS2 \
-v "/home/runner/work":"/__w" \
--entrypoint "tail" ornladios/adios2:ci-tmp \
"-f" "/dev/null"
docker start adios2-ci
- name: Dependencies
run: /opt/adios2/source/testing/contract/${{ matrix.code }}/depends.sh
- name: Configure
run: /opt/adios2/source/testing/contract/${{ matrix.code }}/config.sh
- name: Build
run: /opt/adios2/source/testing/contract/${{ matrix.code }}/build.sh
- name: Install
run: /opt/adios2/source/testing/contract/${{ matrix.code }}/install.sh
- name: Test
run: /opt/adios2/source/testing/contract/${{ matrix.code }}/test.sh
#######################################
# Code analysis builds
#######################################
analyze:
needs: [format, git_checks]
name: CodeQL
runs-on: ubuntu-latest
container:
image: 'ghcr.io/ornladios/adios2:ci-spack-ubuntu20.04-gcc8'
env:
GH_YML_JOBNAME: ubuntu20.04-gcc8-serial-codeql
GH_YML_BASE_OS: Linux
GH_YML_MATRIX_OS: ubuntu20.04
GH_YML_MATRIX_COMPILER: gcc8
GH_YML_MATRIX_PARALLEL: serial
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'cpp' ]
steps:
- uses: actions/checkout@v4
with:
path: gha
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
config: |
paths:
- source
paths-ignore:
- source/thirdparty
- name: Setup
run: gha/scripts/ci/gh-actions/linux-setup.sh
- name: Update
run: gha/scripts/ci/gh-actions/run.sh update
- name: Configure
run: gha/scripts/ci/gh-actions/run.sh configure
- name: Build
run: gha/scripts/ci/gh-actions/run.sh build
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"
#######################################
# Workaround for skipping matrix jobs
#######################################
build_and_test:
needs: [el8, ubuntu, macos, docker, contract]
runs-on: ubuntu-latest
steps:
- run: echo "All required jobs complete"