#yaml #gitlab-ci #slack
#yaml #gitlab-ci #slack
Вопрос:
Я использую GitLab для процесса CI / CD. Я хочу отправлять сообщения на свой канал в Slack. Следование API работает с терминала:
curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/xxx/yyyy/zzzz
Однако, когда я помещаю эту строку в свой файл .yml, он выдает мне «недопустимую ошибку yaml». Полный блок здесь:
slack_jar:
stage: slack
before_script:
- echo "hi there"
script:
- curl -F file=@target/springApp-0.0.1.jar -F channels=#application_dev_backend -F token='xoxb-1111-2222-yyyyyy' https://slack.com/api/files.upload
only:
- dev
slack_message:
stage: slack
script:
- echo "Send Slack Messages"
- curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/xxxx/yyyy/zzzz
only:
- dev
Первый этап (отправка файла) выполнен правильно, но второй не работает. Это сообщение об ошибке, которое я получаю:
Состояние: ошибка неправильного синтаксиса: задания:slack_message: конфигурация скрипта должна быть строкой или массивом строк
Комментарии:
1. Насколько я помню, несколько
script
ключей в задании недопустимы, и для каждого задания должен быть одинscript
. Пожалуйста, удалите первое.2. Вам разрешено использовать
before_script
,script
иafter_script
, так что у вас все в порядке. Можете ли вы опубликовать полное сообщение об ошибке? Вы используете gitlab CE или EE?
Ответ №1:
Судя по вашему сообщению об ошибке, команда curl в slack_message
неверна. Попробуйте заключить всю команду в кавычки и избежать внутренних кавычек. В том виде, в каком оно у вас есть, анализатор YAML считает, что Content-type: application/json
это пара ключ: значение словаря.
Попробуйте это вместо:
slack_message:
stage: slack
script:
- echo "Send Slack Messages"
- "curl -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' https://hooks.slack.com/services/xxxx/yyyy/zzzz"
only:
- dev
Профессиональный совет
Вы можете использовать CI Lint
инструмент для проверки содержимого gitlab-ci.yaml
. Вы можете получить доступ к этому на CI/CD > Pipelines
экране. Смотрите CI Lint.
Также есть полезный веб-сайт http://www.yamllint.com / где вы можете ввести YAML, и он (а) подтвердит его и (б) вернет версию UTF-8. Если у вас проблемы со строками, версия UTF-8 будет выглядеть искаженной (что и происходит с вашим YAML).
Комментарии:
1. Спасибо за ваш ответ. это сообщение об ошибке, которое я получаю. «Статус: ошибка неправильного синтаксиса: задания: slack_message: конфигурация скрипта должна быть строкой или массивом строк» вы знаете, что у меня есть 2 этапа. один этап предназначен для отправки файла, а другой этап — для отправки текстового сообщения на канал. первый этап (отправка файла) выполнен правильно, но другой не работает
2. Я отредактировал основную часть вопроса и поместил два основных блока для slack, первый правильный, а второй неверный, и я получаю сообщение об ошибке.
Ответ №2:
Пожалуйста, предоставьте пользователю бота необходимые привилегии для публикации в канале. следуйте приведенному ниже ci.yaml
#пожалуйста, выберите изображение, в котором есть команда curl
slack_notification:
image: ubuntu:latest
script:
- echo "Get user id with curl from Slack"
- curl -X GET -H 'Authorization:Bearer <bot token>' https://slack.com/api/users.lookupByEmail?email=$GITLAB_USER_EMAIL | jq -r '.user.id'
# From the above if you change the | jq -r '.user.name' then you will get the name of the user from slack.
- echo "Slack post request"
- >
curl -X POST -H 'Authorization:Bearer <bot token>' -H 'Content-type: application/json' --data '{"channel":"<channel id which start CXXXX>","text":"Your job has been finished please validate Job Url '"$CI_PIPELINE_URL"'"}' https://slack.com/api/chat.postMessage
CI_PIPELINE_URL: это выдаст URL задания.
Ссылка на Slack: https://api.slack.com/web