Skip to content

Merge branch 'tickets/DM-43603' into tickets/DM-43715 #3128

Merge branch 'tickets/DM-43603' into tickets/DM-43715

Merge branch 'tickets/DM-43603' into tickets/DM-43715 #3128

Workflow file for this run

# Qserv CI workflow
---
name: "CI"
on:
push:
pull_request:
branches:
- main
workflow_dispatch:
jobs:
image-names:
# This job works around an issue with actions/checkout @v2 and @v3 where if
# a workflow is triggered by an annotated tag push, the tag may not be
# visible to git in the cloned repository. The issue for that problem is at
# https://github.com/actions/checkout/issues/290
# The workaround implemented here does two things:
# 1. After checking out the repo, there is a step in this job that force
# fetches tags. This ensures that all tags are available locally.
# 2. Image names are determined and saved. These image names are derived
# from the certain files and tags in the repo. Dependant jobs use the
# images names stored in this job.
# Image names must be cached after force fetching tags in a single job
# instead of force fetching tags in each job because if a new release tag is
# pushed while a workflow is running it's possible the derived image names
# could change from job to job, breaking the running workflow in a difficult
# to understand way.
name: Save image names
runs-on: ubuntu-20.04
outputs:
build-image: ${{ steps.image-names.outputs.build-image }}
user-build-image: ${{ steps.image-names.outputs.user-build-image }}
run-base-image: ${{ steps.image-names.outputs.run-base-image }}
mariadb-image: ${{ steps.image-names.outputs.mariadb-image }}
qserv-image: ${{ steps.image-names.outputs.qserv-image }}
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 0 is "all history and branch tags"
- name: force update tags
run: git fetch --force --tags
- name: Save image names
id: image-names
run: |
echo "build-image=$(./admin/local/cli/qserv env --build-image)" >> "$GITHUB_OUTPUT"
echo "user-build-image=$(./admin/local/cli/qserv env --user-build-image)" >> "$GITHUB_OUTPUT"
echo "run-base-image=$(./admin/local/cli/qserv env --run-base-image)" >> "$GITHUB_OUTPUT"
echo "mariadb-image=$(./admin/local/cli/qserv env --mariadb-image)" >> "$GITHUB_OUTPUT"
echo "qserv-image=$(./admin/local/cli/qserv env --qserv-image)" >> "$GITHUB_OUTPUT"
update-base-images:
name: Update base images
runs-on: ubuntu-20.04
needs: image-names
outputs:
build-rebuilt: ${{ steps.rebuild.outputs.build-rebuilt }}
run-base-rebuilt: ${{ steps.rebuild.outputs.run-base-rebuilt }}
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 0 is "all history and branch tags"
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
password: ${{ secrets.FM_DOCKERHUB_TOKEN }}
- name: Rebuild and push build image if needed
id: rebuild
run: |
if [[ $(./admin/local/cli/qserv --log-level DEBUG dh-image-exists ${{ needs.image-names.outputs.build-image }}) == "True" ]]; then
echo "Build image already on docker hub; skipping..."
echo "build-rebuilt=False" >> "$GITHUB_OUTPUT"
else
./admin/local/cli/qserv --log-level DEBUG build-build-image --push-image \
--build-image ${{ needs.image-names.outputs.build-image }}
echo "build-rebuilt=True" >> "$GITHUB_OUTPUT"
fi
env:
QSERV_DH_USER: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
QSERV_DH_TOKEN: ${{ secrets.FM_DOCKERHUB_TOKEN }}
- name: Rebuild and push run base image if needed
run: |
if [[ $(./admin/local/cli/qserv --log-level DEBUG dh-image-exists ${{ needs.image-names.outputs.run-base-image }}) == "True" ]]; then
echo "Run base image already on docker hub; skipping..."
echo "run-base-rebuilt=False" >> "$GITHUB_OUTPUT"
else
./admin/local/cli/qserv --log-level DEBUG build-run-base-image --push-image \
--run-base-image ${{ needs.image-names.outputs.run-base-image }}
echo "run-base-rebuilt=True" >> "$GITHUB_OUTPUT"
fi
env:
QSERV_DH_USER: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
QSERV_DH_TOKEN: ${{ secrets.FM_DOCKERHUB_TOKEN }}
update-mariadb-image:
name: Update MariaDB image
runs-on: ubuntu-20.04
needs: image-names
outputs:
rebuilt: ${{ steps.rebuild.outputs.rebuilt }}
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 0 is "all history and branch tags"
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
password: ${{ secrets.FM_DOCKERHUB_TOKEN }}
- name: Rebuild and push if needed
id: rebuild
run: |
if [[ $(./admin/local/cli/qserv --log-level DEBUG dh-image-exists ${{ needs.image-names.outputs.mariadb-image }}) == "True" ]]; then
echo "MariaDB image already on docker hub; skipping..."
echo "rebuilt=False" >> "$GITHUB_OUTPUT"
else
./admin/local/cli/qserv --log-level DEBUG build-mariadb-image --push-image --mariadb-image ${{ needs.image-names.outputs.mariadb-image }}
echo "rebuilt=True" >> "$GITHUB_OUTPUT"
fi
env:
QSERV_DH_USER: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
QSERV_DH_TOKEN: ${{ secrets.FM_DOCKERHUB_TOKEN }}
documentation:
name: Documentation
runs-on: ubuntu-20.04
needs: [image-names, update-base-images]
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
submodules: true
fetch-depth: 0 # 0 is "all history and branch tags"
- name: Check for changes
uses: dorny/paths-filter@v3
id: filter
with:
filters: |
docs:
- 'doc/**'
- name: Prepare user build image
if: needs.update-base-images.outputs.build-rebuilt == 'True' || steps.filter.outputs.docs == 'true'
run: |
./admin/local/cli/qserv --log-level DEBUG build-user-build-image \
--group docker_outer \
--build-image ${{ needs.image-names.outputs.build-image }} \
--user-build-image ${{ needs.image-names.outputs.user-build-image }}
- name: Build docs
if: needs.update-base-images.outputs.build-rebuilt == 'True' || steps.filter.outputs.docs == 'true'
run: |
./admin/local/cli/qserv build-docs --cmake --linkcheck \
--user-build-image ${{ needs.image-names.outputs.user-build-image }}
env:
QSERV_GH_EVENT_NAME: ${{ github.event_name }}
QSERV_GH_HEAD_REF: ${{ github.head_ref }}
QSERV_GH_REF: ${{ github.ref }}
- name: Upload to LSST the Docs
if: needs.update-base-images.outputs.build-rebuilt == 'True' || steps.filter.outputs.docs == 'true'
uses: lsst-sqre/ltd-upload@v1
with:
project: "Qserv"
dir: "build/doc/html"
username: ${{ secrets.LTD_USERNAME }}
password: ${{ secrets.LTD_PASSWORD }}
update-run-image:
name: Update Qserv image
runs-on: ubuntu-20.04
needs: [image-names, update-base-images]
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 0 is "all history and branch tags"
- name : Update submodules
run: |
git submodule update --init
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
password: ${{ secrets.FM_DOCKERHUB_TOKEN }}
- name: Prepare user build image
run: |
./admin/local/cli/qserv --log-level DEBUG build-user-build-image \
--group docker_outer \
--build-image ${{ needs.image-names.outputs.build-image }} \
--user-build-image ${{ needs.image-names.outputs.user-build-image }}
- name: Build lite-qserv image
run: |
./admin/local/cli/qserv --log-level DEBUG build \
--qserv-image ${{ needs.image-names.outputs.qserv-image }} \
--run-base-image ${{ needs.image-names.outputs.run-base-image }} \
--user-build-image ${{ needs.image-names.outputs.user-build-image }} \
--pull-image \
--push-image \
--clang-format CHECK \
-j2
env:
QSERV_DH_USER: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
QSERV_DH_TOKEN: ${{ secrets.FM_DOCKERHUB_TOKEN }}
compose-integration-tests:
name: Integration tests (compose)
runs-on: ubuntu-20.04
needs: [image-names, update-mariadb-image, update-run-image]
steps:
- name: Install python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install click
run: |
python -m pip install --upgrade pip
pip install click pyyaml requests
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0 # 0 is "all history and branch tags"
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.FM_DOCKERHUB_TOKEN_USER }}
password: ${{ secrets.FM_DOCKERHUB_TOKEN }}
- name: Launch qserv
run: |
./admin/local/cli/qserv --log-level DEBUG up \
--qserv-image ${{ needs.image-names.outputs.qserv-image }} \
--mariadb-image ${{ needs.image-names.outputs.mariadb-image }}
- name: Check Qserv containers
run: sleep 180 && docker ps -a
- name: Run integration tests
run: |
./admin/local/cli/qserv --log-level DEBUG itest \
--qserv-image ${{ needs.image-names.outputs.qserv-image }} \
--mariadb-image ${{ needs.image-names.outputs.mariadb-image }}
- name: Check Qserv containers
if: always()
run: docker ps -a
- name: Replication Controller Log
if: always()
run: docker logs ${USER}_repl-mgr-controller_1
- name: Replication Registry Log
if: always()
run: docker logs ${USER}_repl-mgr-registry_1
- name: Replication Database Log
if: always()
run: docker logs ${USER}_repl-mgr-db_1
- name: Replication Worker 0 Log
if: always()
run: docker logs ${USER}_worker-repl-0_1
- name: Replication Worker 1 Log
if: always()
run: docker logs ${USER}_worker-repl-1_1
- name: Czar MySQL Proxy Log
if: always()
run: docker logs ${USER}_czar-proxy_1
- name: Czar CMSD Log
if: always()
run: docker logs ${USER}_manager-cmsd_1
- name: Czar XROOTD Log
if: always()
run: docker logs ${USER}_manager-xrootd-0.manager-xrootd_1
- name: Czar MariaDB Log
if: always()
run: docker logs ${USER}_czar-db_1
- name: Qzerv Worker 0 CMSD Log
if: always()
run: docker logs ${USER}_worker-cmsd-0_1
- name: Qzerv Worker 0 XROOTD Log
if: always()
run: docker logs ${USER}_worker-xrootd-0_1
- name: Qzerv Worker 0 MariaDB Log
if: always()
run: docker logs ${USER}_worker-db-0_1
- name: Qzerv Worker 1 CMSD Log
if: always()
run: docker logs ${USER}_worker-cmsd-1_1
- name: Qzerv Worker 1 XROOTD Log
if: always()
run: docker logs ${USER}_worker-xrootd-1_1
- name: Qzerv Worker 1 MariaDB Log
if: always()
run: docker logs ${USER}_worker-db-1_1
- name: Remove integration test volumes
run: |
./admin/local/cli/qserv --log-level DEBUG itest-rm
- name: Shut down qserv
run: |
./admin/local/cli/qserv --log-level DEBUG down \
-v
notify-on-fail:
name: Notify Slack if fail on main
runs-on: ubuntu-20.04
needs: [documentation, compose-integration-tests]
if: github.ref == 'refs/heads/main' && failure()
steps:
- name: Notify
uses: voxmedia/github-action-slack-notify-build@v1
with:
channel_id: G2JPZ3GC8 # this is the channel id of the dm_db_team room
status: FAILED
color: danger
env:
SLACK_BOT_TOKEN: ${{ secrets.QSERV_GHA_BUILD_NOTIFICATIONS }}