Skip to content

Commit e6dce9a

Browse files
committed
Add composite action to upload Debian artifacts to Artifactory
This action parses a .changes file and uploads associated Debian source and binary artifacts to a specified Artifactory repository. It supports provenance tagging, architecture detection, and metadata validation. Includes setup for JFrog CLI and dynamic property assignment for APT-compatible publishing. Signed-off-by: VISHAL KUMAR <viskuma@qti.qualcomm.com>
1 parent edd7673 commit e6dce9a

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed

upload/action.yml

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
name: "Upload Debian to Artifactory"
2+
description: "Uploads Debian artifacts from a .changes file to Artifactory"
3+
inputs:
4+
target_repo:
5+
description: "Full Artifactory repository URL (e.g. https://qartifactory.qualcomm.com/artifactory/debian-local)"
6+
required: true
7+
changes_path:
8+
description: "Path to Debian .changes file"
9+
required: true
10+
provenance_info:
11+
description: "JSON object with provenance metadata (commit, workflow, etc.)"
12+
required: true
13+
default: "{}"
14+
secret:
15+
description: "Artifactory token"
16+
required: true
17+
18+
runs:
19+
using: "composite"
20+
steps:
21+
- name: Install prerequisites
22+
shell: bash
23+
run: |
24+
sudo apt-get update
25+
sudo apt-get install -y devscripts dctrl-tools jq
26+
27+
- name: Setup JFrog CLI
28+
uses: jfrog/setup-jfrog-cli@v4
29+
with:
30+
version: latest
31+
32+
- name: Configure JFrog server
33+
shell: bash
34+
env:
35+
TARGET_REPO: ${{ inputs.target_repo }}
36+
TOKEN: ${{ inputs.secret }}
37+
run: |
38+
ARTIFACTORY_URL="$(echo "$TARGET_REPO" | sed -E 's|/artifactory.*||')"
39+
REPO_KEY="$(basename "$TARGET_REPO")"
40+
echo "ARTIFACTORY_URL=$ARTIFACTORY_URL" >> $GITHUB_ENV
41+
echo "REPO_KEY=$REPO_KEY" >> $GITHUB_ENV
42+
jf c add artifactory-server \
43+
--url "$ARTIFACTORY_URL" \
44+
--access-token "$TOKEN" \
45+
--interactive=false
46+
47+
- name: Parse .changes and provenance
48+
shell: bash
49+
env:
50+
CHANGES_PATH: ${{ inputs.changes_path }}
51+
PROVENANCE_INFO: ${{ inputs.provenance_info }}
52+
run: |
53+
set -euo pipefail
54+
CHANGES_DIR="$(dirname "$CHANGES_PATH")"
55+
CHANGES_FILE="$(basename "$CHANGES_PATH")"
56+
cd "$CHANGES_DIR"
57+
58+
SUITE="$(grep-dctrl -ns Distribution . "$CHANGES_FILE" | head -n1)"
59+
ARCHS="$(grep-dctrl -ns Architecture . "$CHANGES_FILE" | tr ' ' '\n' | sort -u | tr '\n' ' ' | sed 's/ $//')"
60+
SOURCE_PKG="$(grep-dctrl -ns Source . "$CHANGES_FILE" | head -n1)"
61+
VERSION="$(grep-dctrl -ns Version . "$CHANGES_FILE" | head -n1)"
62+
63+
ALL_FILES=$(grep-dctrl -nsFiles . "$CHANGES_FILE" | awk '{print $5}' | tr '\n' ' ')
64+
BIN_FILES=$(echo "$ALL_FILES" | tr ' ' '\n' | grep -E '\.(deb|ddeb)$' || true)
65+
DSC_FILE=$(echo "$ALL_FILES" | tr ' ' '\n' | grep -E '\.dsc$' || true)
66+
SRC_FILES=""
67+
if [ -n "$DSC_FILE" ]; then
68+
SRC_FILES=$(grep-dctrl -nsFiles . "$DSC_FILE" | awk '{print $3}' | tr '\n' ' ')
69+
fi
70+
71+
COMPONENT=$(echo "$PROVENANCE_INFO" | jq -r '.component // "main"')
72+
SRC_COMMIT=$(echo "$PROVENANCE_INFO" | jq -r '.commit // ""')
73+
74+
PROPS="deb.distribution=${SUITE};deb.component=${COMPONENT};deb.package=${SOURCE_PKG};deb.version=${VERSION}"
75+
for key in $(echo "$PROVENANCE_INFO" | jq -r 'keys[]'); do
76+
val=$(echo "$PROVENANCE_INFO" | jq -r --arg k "$key" '.[$k]')
77+
PROPS="${PROPS};${key}=${val}"
78+
done
79+
80+
echo "SUITE=$SUITE" >> $GITHUB_ENV
81+
echo "ARCHS=$ARCHS" >> $GITHUB_ENV
82+
echo "SOURCE_PKG=$SOURCE_PKG" >> $GITHUB_ENV
83+
echo "VERSION=$VERSION" >> $GITHUB_ENV
84+
echo "BIN_FILES=$BIN_FILES" >> $GITHUB_ENV
85+
echo "DSC_FILE=$DSC_FILE" >> $GITHUB_ENV
86+
echo "SRC_FILES=$SRC_FILES" >> $GITHUB_ENV
87+
echo "COMPONENT=$COMPONENT" >> $GITHUB_ENV
88+
echo "PROPS=$PROPS" >> $GITHUB_ENV
89+
90+
- name: Upload source artifacts
91+
if: env.DSC_FILE != ''
92+
shell: bash
93+
env:
94+
DSC_FILE: ${{ env.DSC_FILE }}
95+
SRC_FILES: ${{ env.SRC_FILES }}
96+
PROPS: ${{ env.PROPS }}
97+
REPO_KEY: ${{ env.REPO_KEY }}
98+
SOURCE_PKG: ${{ env.SOURCE_PKG }}
99+
run: |
100+
TARGET_PATH="${REPO_KEY}/pool/${SOURCE_PKG}/"
101+
jf rt upload --server-id=artifactory-server \
102+
--target-props "${PROPS};deb.architecture=source" \
103+
"$DSC_FILE" "$TARGET_PATH"
104+
for f in $SRC_FILES; do
105+
jf rt upload --server-id=artifactory-server \
106+
--target-props "${PROPS};deb.architecture=source" \
107+
"$f" "$TARGET_PATH"
108+
done
109+
110+
- name: Upload binary artifacts
111+
shell: bash
112+
env:
113+
BIN_FILES: ${{ env.BIN_FILES }}
114+
ARCHS: ${{ env.ARCHS }}
115+
PROPS: ${{ env.PROPS }}
116+
REPO_KEY: ${{ env.REPO_KEY }}
117+
SOURCE_PKG: ${{ env.SOURCE_PKG }}
118+
run: |
119+
TARGET_PATH="${REPO_KEY}/pool/${SOURCE_PKG}/"
120+
for bf in $BIN_FILES; do
121+
FARCH=$(echo "$bf" | sed -n 's/.*_\([A-Za-z0-9]\+\)\.d\?deb$/\1/p')
122+
[ -z "$FARCH" ] && FARCH="$ARCHS"
123+
jf rt upload --server-id=artifactory-server \
124+
--target-props "${PROPS};deb.architecture=${FARCH}" \
125+
"$bf" "$TARGET_PATH"
126+
done
127+

0 commit comments

Comments
 (0)