66 branch :
77 required : true
88 type : string
9+ app_ref :
10+ required : false
11+ type : string
12+ default : " "
13+ secrets :
14+ GITLAB_TRIGGER_TOKEN :
15+ required : true
916
1017jobs :
1118 distribution :
@@ -16,16 +23,187 @@ jobs:
1623 with :
1724 ref : ${{ inputs.branch }}
1825 submodules : recursive
26+ fetch-depth : 3
1927
2028 - name : Get last 3 commit messages
29+ shell : bash
2130 run : |
22- commits=$(git log -3 --pretty=format:"%s")
23- echo "commits=$commits" >> $GITHUB_ENV
31+ set -euo pipefail
32+ commits="$(git log -3 --pretty=format:"%s")"
33+ echo "commits<<EOF" >> "$GITHUB_ENV"
34+ echo "$commits" >> "$GITHUB_ENV"
35+ echo "EOF" >> "$GITHUB_ENV"
2436
25- - name : Trigger build & send to FAD
37+ - name : Debug payload that will be sent to GitLab
38+ shell : bash
39+ env :
40+ SOURCE_BRANCH : ${{ inputs.branch }}
41+ APP_REF_OVERRIDE : ${{ inputs.app_ref }}
42+ DEFAULT_APP_REF : develop
43+ INPUT_COMMITS : ${{ env.commits }}
2644 run : |
27- curl --location 'https://mindbox.gitlab.yandexcloud.net/api/v4/projects/900/trigger/pipeline' \
28- --form 'token="${{ secrets.GITLAB_TRIGGER_TOKEN }}"' \
29- --form 'ref="develop"' \
30- --form "variables[INPUT_BRANCH]=\"${{ inputs.branch }}\"" \
31- --form "variables[INPUT_COMMITS]=\"${{ env.commits }}\""
45+ set -euo pipefail
46+
47+ # Trim override so " " becomes empty
48+ APP_REF_OVERRIDE="$(printf '%s' "${APP_REF_OVERRIDE:-}" | xargs)"
49+
50+ echo "---- DEBUG (GitHub -> GitLab trigger payload) ----"
51+ echo "SDK branch (INPUT_BRANCH): $SOURCE_BRANCH"
52+ echo "Manual App ref override: ${APP_REF_OVERRIDE:-<empty>}"
53+ echo "Default App ref: $DEFAULT_APP_REF"
54+ echo ""
55+ echo "RAW INPUT_COMMITS (cat -A):"
56+ printf '%s' "${INPUT_COMMITS:-}" | cat -A
57+ echo ""
58+ echo "RAW INPUT_COMMITS (printf %q):"
59+ printf '%q\n' "${INPUT_COMMITS:-}"
60+ echo "--------------------------------------------------"
61+
62+ - name : Trigger build & send to FAD (override strict; else same->develop)
63+ env :
64+ GITLAB_HOST : mindbox.gitlab.yandexcloud.net
65+ APP_PROJECT_ID : " 900"
66+ DEFAULT_APP_REF : develop
67+
68+ SOURCE_BRANCH : ${{ inputs.branch }}
69+ APP_REF_OVERRIDE : ${{ inputs.app_ref }}
70+
71+ GITLAB_TRIGGER_TOKEN : ${{ secrets.GITLAB_TRIGGER_TOKEN }}
72+ INPUT_COMMITS : ${{ env.commits }}
73+ shell : bash
74+ run : |
75+ set -euo pipefail
76+
77+ # Trim override so " " becomes empty
78+ APP_REF_OVERRIDE="$(printf '%s' "${APP_REF_OVERRIDE:-}" | xargs)"
79+
80+ # Normalize commits:
81+ # - convert CRLF -> LF
82+ # - if commits accidentally contain literal "\n", expand them to real newlines
83+ normalize_commits() {
84+ local raw="${1:-}"
85+ # CRLF -> LF
86+ raw="$(printf '%s' "$raw" | tr -d '\r')"
87+
88+ # If it contains literal "\n" (backslash+n), expand escapes
89+ if [[ "$raw" == *"\\n"* ]]; then
90+ raw="$(printf '%b' "$raw")"
91+ fi
92+
93+ printf '%s' "$raw"
94+ }
95+
96+ COMMITS_TO_SEND="$(normalize_commits "${INPUT_COMMITS:-}")"
97+
98+ echo "SDK branch (INPUT_BRANCH): $SOURCE_BRANCH"
99+ echo "Manual App ref override: ${APP_REF_OVERRIDE:-<empty>}"
100+ echo "Default App ref: $DEFAULT_APP_REF"
101+ echo ""
102+ echo "COMMITS_TO_SEND preview (cat -A):"
103+ printf '%s' "$COMMITS_TO_SEND" | cat -A
104+ echo ""
105+
106+ trigger_pipeline() {
107+ local ref="$1"
108+ local tmp_body
109+ tmp_body="$(mktemp)"
110+
111+ local code
112+ code="$(curl -sS -o "$tmp_body" -w '%{http_code}' --location \
113+ --retry 3 --retry-all-errors --retry-delay 2 \
114+ "https://${GITLAB_HOST}/api/v4/projects/${APP_PROJECT_ID}/trigger/pipeline" \
115+ --form "token=${GITLAB_TRIGGER_TOKEN}" \
116+ --form "ref=${ref}" \
117+ --form "variables[INPUT_BRANCH]=${SOURCE_BRANCH}" \
118+ --form "variables[INPUT_COMMITS]=${COMMITS_TO_SEND}")"
119+
120+ local body
121+ body="$(cat "$tmp_body" 2>/dev/null || true)"
122+ rm -f "$tmp_body"
123+
124+ echo "Trigger HTTP: $code (ref=$ref)"
125+ echo "Response body:"
126+ echo "$body"
127+
128+ if [[ "$code" == "200" || "$code" == "201" ]]; then
129+ local web_url
130+ web_url="$(
131+ printf '%s\n' "$body" |
132+ grep -o '"web_url":"[^"]*"' |
133+ head -n 1 |
134+ cut -d'"' -f4
135+ )"
136+ if [[ -n "${web_url:-}" ]]; then
137+ echo "Pipeline URL: $web_url"
138+ fi
139+ return 0
140+ fi
141+
142+ if [[ "$code" == "401" || "$code" == "403" ]]; then
143+ echo "Auth error (HTTP $code). Check that GITLAB_TRIGGER_TOKEN is valid and has access to project ${APP_PROJECT_ID}."
144+ return 1
145+ fi
146+
147+ # Missing ref: GitLab returns 400 + "Reference not found"
148+ if [[ "$code" == "400" || "$code" == "404" ]]; then
149+ if [[ "$body" == *"Reference not found"* ]]; then
150+ return 2
151+ fi
152+
153+ echo "Got HTTP $code but it's NOT 'Reference not found'."
154+ echo "This can happen if pipelines are blocked for triggers by workflow:rules or job rules when CI_PIPELINE_SOURCE == 'trigger'."
155+ echo "Check the target repo .gitlab-ci.yml rules/workflow:rules."
156+ return 1
157+ fi
158+
159+ if [[ "$code" =~ ^5[0-9][0-9]$ ]]; then
160+ echo "Server error (HTTP $code). GitLab/proxy might be temporarily unavailable."
161+ return 1
162+ fi
163+
164+ echo "Unexpected HTTP status: $code"
165+ return 1
166+ }
167+
168+ # If override is provided: try ONLY override; if missing ref -> fail
169+ if [[ -n "$APP_REF_OVERRIDE" ]]; then
170+ echo "Override provided -> trying ONLY App ref: $APP_REF_OVERRIDE"
171+ trigger_pipeline "$APP_REF_OVERRIDE" || rc=$?
172+ rc="${rc:-0}"
173+
174+ if [[ "$rc" == "0" ]]; then
175+ echo "Triggered on override ref."
176+ exit 0
177+ fi
178+
179+ if [[ "$rc" == "2" ]]; then
180+ echo "ERROR: App ref not found: $APP_REF_OVERRIDE (GitLab returned 'Reference not found')"
181+ exit 1
182+ fi
183+
184+ echo "Trigger failed for reasons other than missing ref."
185+ exit 1
186+ fi
187+
188+ # No override: same branch -> fallback develop
189+ desired_ref="$SOURCE_BRANCH"
190+ fallback_ref="$DEFAULT_APP_REF"
191+
192+ echo "No override -> trying App ref: $desired_ref"
193+ trigger_pipeline "$desired_ref" || rc=$?
194+ rc="${rc:-0}"
195+
196+ if [[ "$rc" == "0" ]]; then
197+ echo "Triggered on same branch."
198+ exit 0
199+ fi
200+
201+ if [[ "$rc" == "2" ]]; then
202+ echo "Same branch not found. Falling back to: $fallback_ref"
203+ trigger_pipeline "$fallback_ref"
204+ echo "Triggered on fallback ref."
205+ exit 0
206+ fi
207+
208+ echo "Trigger failed for reasons other than missing ref."
209+ exit 1
0 commit comments