From 1f081dd1daed864840e695b892bc640dac573bcf Mon Sep 17 00:00:00 2001 From: George McCabe <23407799+georgemccabe@users.noreply.github.com> Date: Fri, 8 Sep 2023 17:00:12 -0600 Subject: [PATCH] add GitHub Actions workflow that is used to create Docker images that hold the conda environment used for the automated tests -- adding this to the default main_v5.1 branch so that it will become available to run for other branches as a workflow_dispatch workflow --- .github/jobs/build_conda_image.sh | 9 + .github/jobs/push_conda_image.sh | 4 + .github/workflows/create_conda_envs.yml | 298 ++++++++++++++++++++++++ 3 files changed, 311 insertions(+) create mode 100755 .github/jobs/build_conda_image.sh create mode 100755 .github/jobs/push_conda_image.sh create mode 100644 .github/workflows/create_conda_envs.yml diff --git a/.github/jobs/build_conda_image.sh b/.github/jobs/build_conda_image.sh new file mode 100755 index 0000000000..cf29b1bec7 --- /dev/null +++ b/.github/jobs/build_conda_image.sh @@ -0,0 +1,9 @@ +DOCKER_ENV_DIR=${GITHUB_WORKSPACE}/internal/scripts/docker_env +cmd="docker build \ + -t dtcenter/metplus-envs:${ENV_NAME}.${METPLUS_ENV_VERSION} \ + --build-arg METPLUS_ENV_VERSION \ + --build-arg BASE_ENV \ + --build-arg ENV_NAME \ + -f ${DOCKER_ENV_DIR}/${DOCKERFILE} ${DOCKER_ENV_DIR}" +echo $cmd +$cmd diff --git a/.github/jobs/push_conda_image.sh b/.github/jobs/push_conda_image.sh new file mode 100755 index 0000000000..ffc5a8d0c4 --- /dev/null +++ b/.github/jobs/push_conda_image.sh @@ -0,0 +1,4 @@ +echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin +cmd="docker push dtcenter/metplus-envs:${ENV_NAME}.${METPLUS_ENV_VERSION}" +echo $cmd +$cmd diff --git a/.github/workflows/create_conda_envs.yml b/.github/workflows/create_conda_envs.yml new file mode 100644 index 0000000000..2d527c0aaa --- /dev/null +++ b/.github/workflows/create_conda_envs.yml @@ -0,0 +1,298 @@ +name: Create Conda Environments in Docker + +on: + workflow_dispatch: + inputs: + subset: + description: 'Comma-separated list of environments to skip. Leave blank to build all.' + required: false + default: '' + +env: + METPLUS_ENV_VERSION: v5.1 + DOCKERFILE: Dockerfile + BASE_ENV: metplus_base + DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} + DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + +jobs: + check: + name: Check inputs to determine what to run + runs-on: ubuntu-latest + steps: + - id: parse_list + run: | + run_str="${{ github.event.inputs.subset }}" + if [ "$run_str" == "" ]; then echo "no_skip=true" >> $GITHUB_OUTPUT; exit 0; fi + echo "no_skip=false" >> $GITHUB_OUTPUT + IFS=', ' read -r -a arr <<< "$run_str" + JSON="[" + for item in ${arr[@]}; do JSON="$JSON\"$item\","; done + if [[ $JSON == *, ]]; then JSON="${JSON%?}"; fi + JSON="$JSON]" + echo "run_list=$( echo "$JSON" )" >> $GITHUB_OUTPUT + echo $JSON + outputs: + no_skip: ${{ steps.parse_list.outputs.no_skip }} + run_list: ${{ steps.parse_list.outputs.run_list }} + + conda: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'conda')) + runs-on: ubuntu-latest + needs: [check] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.conda + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + metplus_base: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'metplus_base')) + runs-on: ubuntu-latest + needs: [check,conda] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.metplus_base + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + py_embed_base: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'py_embed_base')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.py_embed_base + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + h5py: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'h5py')) + runs-on: ubuntu-latest + needs: [check,py_embed_base] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: py_embed_base + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + metdataio: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'metdataio')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + pygrib: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'pygrib')) + runs-on: ubuntu-latest + needs: [check,py_embed_base] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: py_embed_base + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + cfgrib: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'cfgrib')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + netcdf4: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'netcdf4')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + xesmf: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'xesmf')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + spacetime: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'spacetime')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + metplotpy: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'metplotpy')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.cartopy + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + weatherregime: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'weatherregime')) + runs-on: ubuntu-latest + needs: [check,metplotpy] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: metplotpy + DOCKERFILE: Dockerfile.cartopy + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + cycloneplotter: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'cycloneplotter')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.cartopy + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + icecover: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'icecover')) + runs-on: ubuntu-latest + needs: [check,py_embed_base] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: py_embed_base + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + gempak: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'gempak')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.gempak_env + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + gfdl-tracker: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'gfdl-tracker')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + DOCKERFILE: Dockerfile.gfdl-tracker + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + geovista: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'geovista')) + runs-on: ubuntu-latest + needs: [check,metplus_base] + env: + ENV_NAME: ${{ github.job }} + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + pandac: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'pandac')) + runs-on: ubuntu-latest + needs: [check,metplotpy] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: metplotpy + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh + + diff: + if: | + always() && (needs.check.outputs.no_skip == 'true' || + contains(fromJSON(needs.check.outputs.run_list), 'diff')) + runs-on: ubuntu-latest + needs: [check,netcdf4] + env: + ENV_NAME: ${{ github.job }} + BASE_ENV: netcdf4 + steps: + - uses: actions/checkout@v4 + - run: .github/jobs/build_conda_image.sh + - run: .github/jobs/push_conda_image.sh