@@ -112,8 +112,8 @@ jobs:
112112
113113 strategy :
114114 matrix :
115- python_version : ['3.10', '3.11', '3.12']
116- arch : ['x64', ' arm64']
115+ python_version : ['3.10'] # fixme: revert before merging
116+ arch : ['arm64'] # fixme: revert before merging
117117
118118 steps :
119119 - name : Checkout code
@@ -190,6 +190,11 @@ jobs:
190190 exit 1
191191 fi
192192
193+ if [[ "${ARTIFACTORY_URL}" != https://* ]]; then
194+ echo "ARTIFACTORY_URL must use https://"
195+ exit 1
196+ fi
197+
193198 shopt -s nullglob
194199 wheels=(wheels/*.whl)
195200 if (( ${#wheels[@]} == 0 )); then
@@ -210,3 +215,98 @@ jobs:
210215 -u "${ARTIFACTORY_USERNAME}" \
211216 -p "${ARTIFACTORY_API_KEY}" \
212217 "${wheels[@]}"
218+
219+ kitmaker :
220+ runs-on : [self-hosted, linux]
221+ needs :
222+ - publish-wheel
223+ environment : release
224+ if : ${{ needs.publish-wheel.result == 'success' }}
225+
226+ steps :
227+ - name : Download wheel artifacts
228+ uses : actions/download-artifact@v7
229+ with :
230+ pattern : isaacteleop-wheels-*
231+ merge-multiple : true
232+ path : wheels
233+
234+ - name : Submit wheel release to Kitmaker
235+ env :
236+ KITMAKER_PROJECT_ID : ${{ secrets.KITMAKER_PROJECT_ID }}
237+ KITMAKER_TOKEN : ${{ secrets.KITMAKER_TOKEN }}
238+ KITMAKER_PIC_EMAIL : ${{ secrets.KITMAKER_PIC_EMAIL }}
239+ ARTIFACTORY_DOMAIN : ${{ secrets.ARTIFACTORY_DOMAIN }}
240+ ARTIFACTORY_REPO : ${{ secrets.ARTIFACTORY_REPO }}
241+ ARTIFACTORY_TOKEN : ${{ secrets.ARTIFACTORY_TOKEN }}
242+ ARTIFACTORY_USER : ${{ secrets.ARTIFACTORY_USER }}
243+ run : |
244+ set -euo pipefail
245+
246+ if [[ -z "${KITMAKER_TOKEN}" || -z "${KITMAKER_PIC_EMAIL}" ]]; then
247+ echo "Missing one or more required secrets: KITMAKER_TOKEN, KITMAKER_PIC_EMAIL"
248+ exit 1
249+ fi
250+
251+ if [[ -z "${ARTIFACTORY_DOMAIN}" || -z "${ARTIFACTORY_REPO}" || -z "${ARTIFACTORY_TOKEN}" ]]; then
252+ echo "Missing one or more required secrets: ARTIFACTORY_DOMAIN, ARTIFACTORY_REPO, ARTIFACTORY_TOKEN"
253+ exit 1
254+ fi
255+
256+ if [[ "${ARTIFACTORY_DOMAIN}" == http://* || "${ARTIFACTORY_DOMAIN}" == https://* ]]; then
257+ echo "ARTIFACTORY_DOMAIN must be hostname only (no scheme), e.g. artifactory.example.com"
258+ exit 1
259+ fi
260+
261+ if [[ "${ARTIFACTORY_DOMAIN}" == */* ]]; then
262+ echo "ARTIFACTORY_DOMAIN must not contain '/'"
263+ exit 1
264+ fi
265+
266+ shopt -s nullglob
267+ wheels=(wheels/*.whl)
268+ if (( ${#wheels[@]} == 0 )); then
269+ echo "No wheels found under wheels/*.whl"
270+ ls -la wheels || true
271+ exit 1
272+ fi
273+
274+ api_url="https://kitmaker-portal.nvidia.com/api/v0/projects/${KITMAKER_PROJECT_ID}/releases"
275+ wheel_url_base="https://${ARTIFACTORY_USER}:${ARTIFACTORY_TOKEN}@${ARTIFACTORY_DOMAIN}/artifactory/${ARTIFACTORY_REPO}/isaacteleop"
276+
277+ for wheel_path in "${wheels[@]}"; do
278+ wheel_name="$(basename "${wheel_path}")"
279+ if [[ "${wheel_name}" =~ ^isaacteleop-([^-]+)- ]]; then
280+ wheel_version="${BASH_REMATCH[1]}"
281+ else
282+ echo "Unable to parse version from wheel filename: ${wheel_name}"
283+ exit 1
284+ fi
285+
286+ wheel_url="${wheel_url_base}/${wheel_version}/${wheel_name}"
287+
288+ payload=$(cat <<EOF
289+ {
290+ "project_name": "isaacteleop",
291+ "payload": [
292+ {
293+ "pic": "${KITMAKER_PIC_EMAIL}",
294+ "job_type": "wheel-release-job",
295+ "publish_to": "both_devzone_pypi",
296+ "url": "${wheel_url}",
297+ "size": "small",
298+ "upload": false
299+ }
300+ ]
301+ }
302+ EOF
303+ )
304+
305+ echo "Posting wheel to Kitmaker: ${wheel_name}"
306+ curl --fail-with-body --show-error --silent --location --include \
307+ -X POST "${api_url}" \
308+ -H "Authorization: Bearer ${KITMAKER_TOKEN}" \
309+ -H "Content-Type: application/json" \
310+ -d "${payload}"
311+ echo
312+ done
0 commit comments