HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: gitlab, merge request, gitlab api</p>
1 <p>Теги: gitlab, merge request, gitlab api</p>
2 <p>В продолжение прошлой<a>заметки</a>. Сохранение отчётов в пейджес и использование темплейта для merge request всё-таки не совсем удобно. Ибо нужно разработчику не забывать выбирать темплейт, и если несколько разных веток, то редактировать индексную страницу в пейджес. И тут неожиданно осенило - ведь у Gitlab есть<a>API</a>и там много всего интересного, например, есть редактирование merge request.</p>
2 <p>В продолжение прошлой<a>заметки</a>. Сохранение отчётов в пейджес и использование темплейта для merge request всё-таки не совсем удобно. Ибо нужно разработчику не забывать выбирать темплейт, и если несколько разных веток, то редактировать индексную страницу в пейджес. И тут неожиданно осенило - ведь у Gitlab есть<a>API</a>и там много всего интересного, например, есть редактирование merge request.</p>
3 <p>Таким образом, финальный пайплайн, который теперь будет запускаться на создание merge request, сформировался в следующую последовательность: - собираем докер образ - проверяем сныком, отчёт в артифакты - образ пушим в харбор - пушим из артифактов отчёт сныка в пэйджес - и редактируем merge request</p>
3 <p>Таким образом, финальный пайплайн, который теперь будет запускаться на создание merge request, сформировался в следующую последовательность: - собираем докер образ - проверяем сныком, отчёт в артифакты - образ пушим в харбор - пушим из артифактов отчёт сныка в пэйджес - и редактируем merge request</p>
4 <p><strong>Демонстрирую финальный стэйдж:</strong></p>
4 <p><strong>Демонстрирую финальный стэйдж:</strong></p>
5 pages: stage: pages script: - mkdir public - REPORTS="[Snyk](${CI_PAGES_URL}/snyk_${CI_COMMIT_REF_NAME}.html)&lt;br&gt;[CVE](${CVE_URI})" - cp artifacts/snyk.html public/snyk_${CI_COMMIT_REF_NAME}.html - curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}' tags: - harbor artifacts: paths: - public only: - merge_requests<p>вот обращение к API для редактирования поля desscription в merge request</p>
5 pages: stage: pages script: - mkdir public - REPORTS="[Snyk](${CI_PAGES_URL}/snyk_${CI_COMMIT_REF_NAME}.html)&lt;br&gt;[CVE](${CVE_URI})" - cp artifacts/snyk.html public/snyk_${CI_COMMIT_REF_NAME}.html - curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}' tags: - harbor artifacts: paths: - public only: - merge_requests<p>вот обращение к API для редактирования поля desscription в merge request</p>
6 curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}'<p>Поясняю, что в переменных:</p>
6 curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}'<p>Поясняю, что в переменных:</p>
7 JSON_CONTENT: 'Content-Type: application/json' GITOKEN: "PRIVATE-TOKEN:${gitlab_token}" MERGE_URI: "https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}"<p>встроенные переменные: - CI_SERVER_HOST - хост вашего гитлаба - CI_PROJECT_ID - ид вашего проекта - CI_MERGE_REQUEST_IID - ид вашего мерж реквеста</p>
7 JSON_CONTENT: 'Content-Type: application/json' GITOKEN: "PRIVATE-TOKEN:${gitlab_token}" MERGE_URI: "https://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/merge_requests/${CI_MERGE_REQUEST_IID}"<p>встроенные переменные: - CI_SERVER_HOST - хост вашего гитлаба - CI_PROJECT_ID - ид вашего проекта - CI_MERGE_REQUEST_IID - ид вашего мерж реквеста</p>
8 <p>переменные в секции settings/ci-cd/variables gitlab_token - предварительно заведённый в гитлабе токен для доступа к API</p>
8 <p>переменные в секции settings/ci-cd/variables gitlab_token - предварительно заведённый в гитлабе токен для доступа к API</p>
9 <p>Отдельная боль и печаль - передача JSON в курле:</p>
9 <p>Отдельная боль и печаль - передача JSON в курле:</p>
10 - REPORTS="[Snyk](${CI_PAGES_URL}/snyk_${CI_COMMIT_REF_NAME}.html)&lt;br&gt;[CVE](${CVE_URI})" - curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}'<p>Обратите внимание на кавычки для интеграции переменной $REPORTS в --data, т.к. то, что в --data должно быть в одинарных кавычках. И да, попытки внутри содержимого REPORTS добавить пробелы делало что-то страшное с парсингом, поэтому я заменил пробелы на \&lt;br\&gt;.</p>
10 - REPORTS="[Snyk](${CI_PAGES_URL}/snyk_${CI_COMMIT_REF_NAME}.html)&lt;br&gt;[CVE](${CVE_URI})" - curl -X PUT "$MERGE_URI" -H "$GITOKEN" -H "$JSON_CONTENT" --data '{"description":"'$REPORTS'"}'<p>Обратите внимание на кавычки для интеграции переменной $REPORTS в --data, т.к. то, что в --data должно быть в одинарных кавычках. И да, попытки внутри содержимого REPORTS добавить пробелы делало что-то страшное с парсингом, поэтому я заменил пробелы на \&lt;br\&gt;.</p>
11 <h2>Итог</h2>
11 <h2>Итог</h2>
12 <ul><li>разработчик отправляет merge request</li>
12 <ul><li>разработчик отправляет merge request</li>
13 <li>pipeline запускает проверки кода и образа на уязвимости</li>
13 <li>pipeline запускает проверки кода и образа на уязвимости</li>
14 <li>отчёты по проверкам прописываются ссылками в описании мерж реквеста</li>
14 <li>отчёты по проверкам прописываются ссылками в описании мерж реквеста</li>
15 <li>ревьювер одной кнопкой может их легко открыть и посмотреть содержимое</li>
15 <li>ревьювер одной кнопкой может их легко открыть и посмотреть содержимое</li>
16 </ul>
16 </ul>