Не ASCII в URL в CMake ExternalProject_Add - PullRequest
1 голос
/ 18 октября 2019

У меня был этот ExternalProject_Add вызов в моем CMake:

set(SIM_URL https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip)
set(SIM_FILENAME vhnHilsimPlantModel-{build.number}.zip)

# Download and install
include(ExternalProject)
ExternalProject_Add(get_sim
  DOWNLOAD_NAME ${SIM_FILENAME}
  URL ${SIM_URL}
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
             -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
  BUILD_BYPRODUCTS <INSTALL_DIR>/lib/sim_lib.a
  STEP_TARGETS update)

Он отлично работал с версией TeamCity 2017 года. Однако после того, как наши DevOps обновили TeamCity до версии 2019, этот код начал давать сбой:

  file='/home/user/sim/sim-prefix/src/vhnHilsimPlantModel-{build.number}.zip'
Old file will be removed and new file downloaded from URL.
-- Downloading...
   dst='/home/user/build/apps/sim/sim-prefix/src/vhnHilsimPlantModel-{build.number}.zip'
   timeout='none'
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
-- Retrying...
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
-- Retry after 5 seconds (attempt #2) ...
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
-- Retry after 5 seconds (attempt #3) ...
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
-- Retry after 15 seconds (attempt #4) ...
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
-- Retry after 60 seconds (attempt #5) ...
-- Using src='https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip'
CMake Error at vahana_sim-stamp/download-vahana_sim.cmake:157 (message):
  Each download failed!

    error: downloading 'https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/vhnHilsimPlantModel-{build.number}.zip' failed
         status_code: 22
         status_string: "HTTP response code said error"
         log:
         --- LOG BEGIN ---
           Trying 172.31.21.90...

Единственный способ исправить это - изменить { и } на %7B и %7Dсоответственно. Технически это должно было быть сделано в первую очередь, но это работало. Кто-нибудь знает, почему это изменение должно быть сделано и / или почему символы не-ASCII должны кодироваться при указании URL-адреса?

Я использую CMake 3.10.2.

1 Ответ

0 голосов
/ 18 октября 2019

Документация TeamCity 9.X для Получение артефактов подтверждает, что фигурные скобки {build.number} могут использоваться в URL:

ARTIFACT_PATH - это путь к артефакту на сервере TeamCity. Этот путь может содержать шаблон {build.number} , который будет заменен номером сборки сборки, артефакт которой получен.

Однако это вызвало несколько проблем (один пример здесь ), поскольку в RFC есть несколько зарезервированных символов, относящихся к стандартам URI / URL (в данном случае RFC 1738 ). Стандарт RFC 1738 считает группу символов «небезопасной» (включая фигурные скобки) в дополнение к зарезервированным символам для URI:

Другие символы небезопасны, поскольку шлюзы и другиеИзвестно, что транспортные агенты иногда изменяют такие символы. Это символы "{", "}", "|", "\", "^", "~", "[", "]" и "` ". [...] Все небезопасные символы всегда должны быть закодированы в URL.

Таким образом, программное обеспечение TeamCity было впоследствии обновлено для поддержки фигурной скобки кодировки . Документация TeamCity 10.X для Получение артефактов была обновлена ​​в соответствии со стандартами кодирования URL:

ARTIFACT_PATH являетсяпуть к артефакту на сервере TeamCity. Этот путь может содержать шаблон {build.number} (%7Bbuild.number%7D), который будет заменен на TeamCity номером сборки сборки, артефакт которой получен.

ItПохоже, что в версиях TeamCity 2019 поддержка использования необработанных фигурных скобок в URL была полностью отменена в соответствии со стандартом, и разрешена только версия в кодировке . Таким образом, вы можете обновить свой код CMake примерно так:

set(SIM_FILENAME vhnHilsimPlantModel-%7Bbuild.number%7D.zip)
set(SIM_URL https://teamcity.vh.com/guestAuth/rep/download/Sim_Feat/.lastSuccessful/${SIM_FILENAME})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...