Skip To Content

ArcGIS Server в средах разработки, подготовки и производства

Множество организаций используют отдельные среды для разработки, подготовки и производства; это позвоялет поддерживать им качественную работу веб-сайтов. При использовании в организации ArcGIS Enterprise эти среды чаще всего настраивают следующим образом:

  • Разработка – это изолированная тестовая среда, в которой вы можете тестировать свои приложения и сервисы, не затрагивая среду разработки. Обычно среда разработки запускается на маленькой машине, которая отключена от производственной среды ArcGIS Enterprise. Когда изменения проверены в среде разработки, их применяют в среде подготовки.
  • Подготовка – эта среда представляет собой клон или приближение производственной среды. Среда подготовки используется для создания и тестирования приложений с добавленной стоимостью и сопоставления кэшей; проведения пользовательского приемочного, производительного и нагрузочного тестирования другого стороннего программного обеспечения; обновления новых коммерческих данных; проведения обучающих мероприятий. Результатом тестирования на этом уровне является решение применить изменения в производственной среде или отклонить изменения и дождаться новой итерации из среды разработки. Сайт подготовки не используется для разработки, только для тестирования производительности и функциональности. Esri предоставляет лицензии среды подготовки для ArcGIS Enterprise по меньшей стоимости, чем производственные лицензии.
  • Производство – никакой разработки или тестирования в этой среде не происходит, доступ к ней есть у ГИС-пользователей (а в некоторых случаях и у широкой общественности). К производственному сайту применяются только те изменения, которые прошли тщательную проверку на сайте подготовки.

Среды разработки, подготовки и производства в идеальном случае должны использовать разные базы данных и инфраструктуры. У каждой организации есть собственные правила по тому, как тестировать и применять изменения при переходе между средами.

Перенос изменения из одной среды в другую может привести к логическим сложностям. В этой статье представлены сценарий и скрипты, описывающие процесс, независимо от того является ли ваш сайт ArcGIS Server интегрированным или автономным.

Примечание:

В этой статье рассматриваются особенности ArcGIS Server в средах разработки, подготовки и тестирования. Другие компоненты ArcGIS Enterprise здесь не рассматриваются.

Настройка каждой среды

В каждой среде установите ArcGIS Server, создайте сайт и настройте опции безопасности, расширения серверных объектов (SOE) и др. Большинство из этих задач работают быстрее, если выполяются вручную, но также можно автоматизировать их при помощи скрипта.

Сначала подготовьте сайт разработки, затем сайт подготовки, и уже потом производственный сайт.

Сервисы развертывания

Ключевой момент развертывания сервисов в нескольких средах – это корректная регистрация папок и баз данных на ArcGIS Server и использование определений сервера (SD) для публикации.

Регистрация папок и баз данных с ArcGIS Server

Когда вы регистрируете папку или базу данных с ArcGIS Server, вы указываете путь издателя к данным и путь к серверу.

  • Путь издателя – это путь к данным на машине, которые вы будете использовать для создания файлов SD. Путь издателя будет всегда одинаковым при регистрации элемента на серверах разработки, подготовки и тестирования.
  • Серверный путь – это путь к данным на сервере. Этот путь может отличаться при регистрации элемента на серверах разработки, подготовки и тестирования.

Если у вас множество папок с данными или базы данных, которые нужно зарегистрировать, возможно, удобнее будет воспользоваться скриптами.

Публикация сервисов

При развертывании ваших сервисов в нескольких средах используйте файлы SD. SD берет информацию, которая необходима для публикации сервиса, и упаковывает ее в единый файл. Хотя данные ГИС можно упаковать в SD, вам, вероятно, будет проще предварительно загрузить данные в каждую среду и использовать репликацию для их синхронизации.

Создавайте файлы SD без привязки к подключениям (выберите опцию Нет доступного подключения в мастере Сохранить определение файла), чтобы они были достаточно гибкими для публикации на любом сервере. При публикации SD файла ArcGIS Server автоматически исправляет пути, прописанные в SD, чтобы использовались пути сервера. Аккуратная регистрация данных позволит развернуть один и тот же файл SD в нескольких средах.

Публикация сервисов - эта задача, с которой отлично справляются скрипты. Вы можете использовать функцию ArcPy Загрузить определение сервиса, чтобы создать скрипт, который будет опубликовывать все SD.

Файлы SD развертываются в разных средах с помощью скрипта .

После развертывания сервисов на основе SD вы можете включать любые расширения, которые нужны в сервисах. Это также можно сделать вручную или с помощью скриптов.

Другая задача, которую можно решить с помощью скрипта, - это назначения прав разным сервисам, перечисленным в текстовом файле.

Обновление сервисов

Иногда вам может потребоваться обновить сервис, чтобы использовать новые параметры, или для того, чтобы отразить изменения в исходном документе. Рекомендуемый способ обновления сервиса в нескольких средах - сохранить новый файл SD, удалить сервис, а затем опубликовать обновленное SD.

При таком подходе тот же пример сценария, который использовался выше для публикации, также может использоваться для обновления сервиса. Просто измените входной файл, чтобы включить в него только те сервисы, которые нужно обновить. Если будет найден существующий сервис, скрипт удалит его перед загрузкой SD.

После обновления сервиса таким способом, заново включите все SOE, которые использует этот сервис.

В качестве альтернативы вы можете выполнить скрипт обновления свойств сервиса (но не карты или исходного документа), используя ArcGIS REST API.

Поддержка синхронизации данных

Будьте уверены, что ваши данные синхронизированны между несколькими средами. С этим может помочь репликация баз геоданных. Либо вы можете полностью заменить старый набор данных новым. Например, вы можете удалить файловую базу геоданных и заменить ее обновленной базой геоданных.

Если вы решите полностью заменить таблицы или файловые базы геоданных, помните, что сервисы ArcGIS Server по умолчанию блокируют схемы базовых наборов данных. Если схема заблокирована, остановите свой сервис перед тем, как заменить данные. С некоторой осторожностью вы можете отключить блокировку схемы для картографических сервисов, но для других типов сервисов вы этого сделать не сможете.

Обновление приложений

Чтобы переместить приложение между средами разработки, подготовки и производства, скопируйте файлы приложения с одного сайта на другой и обновите все URL-адреса веб-сервисов в своем коде, чтобы они указывали на новый сайт. Используйте файлы конфигурации, чтобы задать URL для своих сервисов.

Скрипт ниже поможет вам обновить URL в вашем коде. Код по рекурсии просматривает файлы в указанной папке, ищет нужную строку, такую как http://myDevServer/arcgis, и замещает ее расположением вашего сайта подготовки или производства, например, http://myProdServer/arcgis.

Перед запуском этого скрипта сделайте резервную копию исходных файлов приложений. Также обратите внимание, что скрипт позволяет указать расширения текстовых файлов, которые нужно обработать, например, .js и .html для файлов ArcGIS API for JavaScript.

После замены URL-адресов с помощью этого скрипта скопируйте файлы приложения на следующий сервер в рабочем процессе (подготовки или производства).

import os
import sys
import shutil
import traceback

def dirEntries(dir_name, subdir, *args):
    '''Return a list of file names found in directory 'dir_name'
    If 'subdir' is True, recursively access subdirectories under 'dir_name'.
    Additional arguments, if any, are file extensions to match filenames. Matched
        file names are added to the list.
    If there are no additional arguments, all files found in the directory are
        added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', False, 'txt', 'py')
        Only files with 'txt' and 'py' extensions will be added to the list.
    Example usage: fileList = dirEntries(r'H:\TEMP', True)
        All files and all the files in subdirectories under H:\TEMP will be added
        to the list.
    '''
    fileList = []
    for file in os.listdir(dir_name):
        dirfile = os.path.join(dir_name, file)
        if os.path.isfile(dirfile):
            if not args:
                fileList.append(dirfile)
            else:
                if os.path.splitext(dirfile)[1][1:] in args:
                    fileList.append(dirfile)
        # recursively access file names in subdirectories
        elif os.path.isdir(dirfile) and subdir:
            print "Accessing directory:", dirfile
            fileList.extend(dirEntries(dirfile, subdir, *args))
    return fileList

def updateString(infileName, srchString,rplString):
    bakFileName = os.path.splitext(infileName)[0] + ".bak"
    if not os.path.exists(bakFileName):
        # copy the original file
        shutil.copy(infileName, bakFileName)

    # Open the backup (= original) file to read
    inFileHndl = open(bakFileName,"r")
    outFileHndl = open(infileName,"w")  

    for line in inFileHndl:
        if line.find(searchString) > 0:
            line = line.replace(searchString, replaceString)
        outFileHndl.write(line)
        
    outFileHndl.close()
    inFileHndl.close()
    # remove the backup (=original content file)
    os.remove(bakFileName)

if __name__ == '__main__':

    try:
        inFolder = r"C:\inetpub\wwwroot\viewer"  # path to search
        searchString = "http://mydevserver"      # string to find
        replaceString = "http://mystgserver"     # string - replace searchString with replaceString
        
        fList = dirEntries(inFolder, True, 'xml')
        for f in fList:
            updateString(f, searchString, replaceString)
            
        print '\n\n\n' + 'Process Complete'

    except:
        # Return any python specific errors as well as any errors from the geoprocessor
        #
        tb = sys.exc_info()[2]
        tbinfo = traceback.format_tb(tb)[0]
        pymsg = "PYTHON ERRORS:\nTraceback Info:\n" + tbinfo + "\nError Info:\n    " + \
                str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"
        print '\n\n\n' + pymsg