Как отправить сообщение Slack с помощью curl из gitlab-ci.yml?

#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