Skip To Content

ArcGIS for Server в среде разработки, промежуточной и производственной средах

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

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

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

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

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

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

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

Развертывание сервисов

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

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

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

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

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

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

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

Создайте SD-файлы без подключения (выберите опцию Нет доступного подключения (No available connection) в мастере Сохранить определение сервиса (Save a Service Definition), чтобы они подходили для публикации на любом сервере. При публикации SD-файла ArcGIS Server автоматически скорректирует пути, которые записываются в SD, чтобы использовались ваши пути к серверу. Тщательная регистрация данных позволит развертывать одинаковый файл SD в различных средах.

Публикация сервисов – подходящая задача для скриптов. Пример: публикация определений сервиса, содержащихся в текстовом файле считывает текстовый файл и публикует все SD. Скрипт использует функцию ArcPy Выгрузка определения сервиса (Upload Service Definition) для публикации каждого SD.

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

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

Применение разрешений – другая подходящая для написания скриптов задача. Пример: применение скриптов из текстового файла использует ArcGIS REST API для применения прав доступа к различным сервисам, указанным в текстовом файле.

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

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

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

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

Вы также можете использовать скрипт для изменения свойств сервиса (но не карты или исходного документа) с помощью операции Редактировать сервис (Edit Service) в 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