1- name : Upload CI-tested images to Arcus S3 and sync clouds
1+ name : Build fat image
22on :
33 workflow_dispatch :
4- push :
5- branches :
6- - main
7- paths :
8- - ' environments/.stackhpc/terraform/cluster_image.auto.tfvars.json'
9- env :
10- S3_BUCKET : openhpc-images-prerelease
11- IMAGE_PATH : environments/.stackhpc/terraform/cluster_image.auto.tfvars.json
4+ inputs :
5+ ci_cloud :
6+ description : ' Select the CI_CLOUD'
7+ required : true
8+ type : choice
9+ options :
10+ - LEAFCLOUD
11+ - SMS
12+ - ARCUS
1213
1314jobs :
14- s3_cleanup :
15+ openstack :
16+ name : openstack-imagebuild
17+ concurrency :
18+ group : ${{ github.workflow }}-${{ github.ref }}-${{ matrix.os_version }}-${{ matrix.build }} # to branch/PR + OS + build
19+ cancel-in-progress : true
1520 runs-on : ubuntu-22.04
16- concurrency : ${{ github.workflow }}-${{ github.ref }}
1721 strategy :
18- fail-fast : false
19- steps :
20- - uses : actions/checkout@v2
21-
22- - name : Write s3cmd configuration
23- run : |
24- echo "${{ secrets['ARCUS_S3_CFG'] }}" > ~/.s3cfg
25- shell : bash
26-
27- - name : Install s3cmd
28- run : |
29- sudo apt-get --yes install s3cmd
30-
31- - name : Cleanup S3 bucket
32- run : |
33- s3cmd rm s3://${{ env.S3_BUCKET }} --recursive --force
34-
35- image_upload :
36- runs-on : ubuntu-22.04
37- needs : s3_cleanup
38- concurrency : ${{ github.workflow }}-${{ github.ref }}-${{ matrix.build }}
39- strategy :
40- fail-fast : false
41- matrix :
42- build :
22+ fail-fast : false # allow other matrix jobs to continue even if one fails
23+ matrix : # build RL8+OFED, RL9+OFED, RL9+OFED+CUDA versions
24+ os_version :
4325 - RL8
4426 - RL9
45- - RL9-cuda
27+ build :
28+ - openstack.openhpc
29+ - openstack.openhpc-cuda
30+ exclude :
31+ - os_version : RL8
32+ build : openstack.openhpc-cuda
4633 env :
4734 ANSIBLE_FORCE_COLOR : True
4835 OS_CLOUD : openstack
49- CI_CLOUD : ${{ vars.CI_CLOUD }}
36+ CI_CLOUD : ${{ github.event.inputs.ci_cloud }}
37+ SOURCE_IMAGES_MAP : |
38+ {
39+ "RL8": {
40+ "openstack.openhpc": "rocky-latest-RL8",
41+ "openstack.openhpc-cuda": "rocky-latest-cuda-RL8"
42+ },
43+ "RL9": {
44+ "openstack.openhpc": "rocky-latest-RL9",
45+ "openstack.openhpc-cuda": "rocky-latest-cuda-RL9"
46+ }
47+ }
48+
5049 steps :
5150 - uses : actions/checkout@v2
5251
53- - name : Record which cloud CI is running on
52+ - name : Record settings for CI cloud
5453 run : |
5554 echo CI_CLOUD: ${{ env.CI_CLOUD }}
5655
57- - name : setup environment
56+ - name : Setup ssh
5857 run : |
59- python3 -m venv venv
60- . venv/bin/activate
61- pip install -U pip
62- pip install $(grep -o 'python-openstackclient[><=0-9\.]*' requirements.txt)
63- shell : bash
64-
65- - name : Write clouds.yaml
66- run : |
67- mkdir -p ~/.config/openstack/
68- echo "${{ secrets[format('{0}_CLOUDS_YAML', env.CI_CLOUD)] }}" > ~/.config/openstack/clouds.yaml
58+ set -x
59+ mkdir ~/.ssh
60+ echo "${{ secrets[format('{0}_SSH_KEY', env.CI_CLOUD)] }}" > ~/.ssh/id_rsa
61+ chmod 0600 ~/.ssh/id_rsa
6962 shell : bash
7063
71- - name : Write s3cmd configuration
72- run : |
73- echo "${{ secrets['ARCUS_S3_CFG'] }}" > ~/.s3cfg
64+ - name : Add bastion's ssh key to known_hosts
65+ run : cat environments/.stackhpc/bastion_fingerprints >> ~/.ssh/known_hosts
7466 shell : bash
7567
76- - name : Install s3cmd
77- run : |
78- sudo apt-get --yes install s3cmd
79-
80- - name : Retrieve image name
81- run : |
82- TARGET_IMAGE=$(jq --arg version "${{ matrix.build }}" -r '.cluster_image[$version]' "${{ env.IMAGE_PATH }}")
83- echo "TARGET_IMAGE=${TARGET_IMAGE}" >> "$GITHUB_ENV"
84- shell : bash
85-
86- - name : Download image to runner
87- run : |
88- . venv/bin/activate
89- openstack image save --file ${{ env.TARGET_IMAGE }} ${{ env.TARGET_IMAGE }}
90- shell : bash
91-
92- - name : Upload Image to S3
93- run : |
94- echo "Uploading Image: ${{ env.TARGET_IMAGE }} to S3..."
95- s3cmd --multipart-chunk-size-mb=150 put ${{ env.TARGET_IMAGE }} s3://${{ env.S3_BUCKET }}
96- shell : bash
97-
98- image_sync :
99- needs : image_upload
100- runs-on : ubuntu-22.04
101- concurrency : ${{ github.workflow }}-${{ github.ref }}-${{ matrix.cloud }}-${{ matrix.build }}
102- strategy :
103- fail-fast : false
104- matrix :
105- cloud :
106- - LEAFCLOUD
107- - SMS
108- - ARCUS
109- build :
110- - RL8
111- - RL9
112- - RL9-cuda
113- exclude :
114- - cloud : LEAFCLOUD
115-
116- env :
117- ANSIBLE_FORCE_COLOR : True
118- OS_CLOUD : openstack
119- CI_CLOUD : ${{ matrix.cloud }}
120- steps :
121- - uses : actions/checkout@v2
122-
123- - name : Record which cloud CI is running on
124- run : |
125- echo CI_CLOUD: ${{ env.CI_CLOUD }}
126-
127- - name : setup environment
128- run : |
129- python3 -m venv venv
130- . venv/bin/activate
131- pip install -U pip
132- pip install $(grep -o 'python-openstackclient[><=0-9\.]*' requirements.txt)
133- shell : bash
68+ - name : Install ansible etc
69+ run : dev/setup-env.sh
13470
13571 - name : Write clouds.yaml
13672 run : |
13773 mkdir -p ~/.config/openstack/
13874 echo "${{ secrets[format('{0}_CLOUDS_YAML', env.CI_CLOUD)] }}" > ~/.config/openstack/clouds.yaml
13975 shell : bash
14076
141- - name : Retrieve image name
77+ - name : Setup environment
14278 run : |
143- TARGET_IMAGE=$(jq --arg version "${{ matrix.build }}" -r '.cluster_image[$version]' "${{ env.IMAGE_PATH }}")
144- echo "TARGET_IMAGE=${TARGET_IMAGE}" >> "$GITHUB_ENV"
79+ . venv/bin/activate
80+ . environments/.stackhpc/activate
14581
146- - name : Download latest image if missing
82+ - name : Build fat image with packer
83+ id : packer_build
14784 run : |
85+ set -x
14886 . venv/bin/activate
149- bash .github/bin/get-s3-image.sh ${{ env.TARGET_IMAGE }} ${{ env.S3_BUCKET }}
150-
151- - name : Cleanup OpenStack Image (on error or cancellation)
152- if : cancelled()
87+ . environments/.stackhpc/activate
88+ cd packer/
89+ packer init .
90+
91+ PACKER_LOG=1 packer build \
92+ -on-error=${{ vars.PACKER_ON_ERROR }} \
93+ -only=${{ matrix.build }} \
94+ -var-file=$PKR_VAR_environment_root/${{ env.CI_CLOUD }}.pkrvars.hcl \
95+ -var "source_image_name=${{ env.SOURCE_IMAGE }}" \
96+ openstack.pkr.hcl
97+ env :
98+ PKR_VAR_os_version : ${{ matrix.os_version }}
99+ SOURCE_IMAGE : ${{ fromJSON(env.SOURCE_IMAGES_MAP)[matrix.os_version][matrix.build] }}
100+
101+ - name : Get created image names from manifest
102+ id : manifest
153103 run : |
154104 . venv/bin/activate
155- image_hanging=$(openstack image list --name ${{ env.TARGET_IMAGE }} -f value -c ID -c Status | grep -v ' active$' | awk '{print $1}')
156- if [ -n "$image_hanging" ]; then
157- echo "Cleaning up OpenStack image with ID: $image_hanging"
158- openstack image delete $image_hanging
159- else
160- echo "No image ID found, skipping cleanup."
161- fi
162- shell : bash
105+ IMAGE_ID=$(jq --raw-output '.builds[-1].artifact_id' packer/packer-manifest.json)
106+ while ! openstack image show -f value -c name $IMAGE_ID; do
107+ sleep 5
108+ done
109+ IMAGE_NAME=$(openstack image show -f value -c name $IMAGE_ID)
110+ echo $IMAGE_ID > image-id.txt
111+ echo $IMAGE_NAME > image-name.txt
112+
113+ - name : Upload manifest artifact
114+ uses : actions/upload-artifact@v4
115+ with :
116+ name : image-details-${{ matrix.build }}-${{ matrix.os_version }}
117+ path : |
118+ ./image-id.txt
119+ ./image-name.txt
120+ overwrite : true
0 commit comments