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. Путь издателя будет всегда одинаковым при регистрации элемента на серверах разработки, подготовки и тестирования.
  • Серверный путь – это путь к данным на сервере. Этот путь может отличаться при регистрации элемента на серверах разработки, подготовки и тестирования.

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

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

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

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

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

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

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

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

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

Иногда вам может потребоваться обновить сервис, чтобы использовать новые параметры, или для того, чтобы отразить изменения в исходном документе, например, набор постоянных изменений символов в проекте ArcGIS Pro. Рекомендуемый способ обновления сервиса в нескольких средах - сохранить новый файл 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