레이블이 powershell인 게시물을 표시합니다. 모든 게시물 표시
레이블이 powershell인 게시물을 표시합니다. 모든 게시물 표시

2018년 1월 23일 화요일

Sitecore Migration - Azure Toolkit Error

이전 포스트에 얘기한것 처럼, 회사에서 Sitecore On-Prem을 Azure로 Migration 진행중이다.

먼저, 기존 On-Prem에 사용하던 데이타 (Sitecore 8.0 U5)를 새로운 버전 (Sitecore 9.0.0) 으로 Migration을 해야하는데 서버 및 데이타베이스 환경이 틀리다보니, 기존의 데이타 Deployment Package를 생성하여야한다. Azure Deployment Package는 사이트코어의 Azure Deployment Toolkit를 이용하여 생성할수있는데, 그 이전에 로컬환경에 Sitecore 9.0 (XP0)을 설치하고 기존 데이터를 Sitecore Expression Migration Tool 3.1을 사용하여 로컬 Siteocre 9.0로 Migration 한다. 로컬에서 Migration이 성공적으로 끝나며, Deployment 패키지를 Azure ToolKit을 이용하여 생성하면 되는데, 여기서 하나의 문제점이 생겼다.

아래의 스크린샷에 보이는 것처럼, PowerShell에서 패키지를 생성하는 도중 "The file is too long. This operation is currently limited to supporting files less than 2 gigabytes in size." 라는 오류가 발생하였다. 



Sitecore의 Flash Installtion의 사이즈가 얼마나 될지는 모르겠지만, Migration되어진 데이터는 족히 6GB는 넘는것으로 보인다. 몇일동안의 리서치와 테스팅 결과 솔루션이 찾지 못하였고, Siteocre Support Ticket을 만들어 Auzre ToolKit 이슈에 대하여 보고하였다.

몇일후, 사이트코어로 부터 답변을 받았고 이 이슈는 ToolKit의 오류로 확인되었으며, 사이코어에서 문제를 해결하고 있다고한다. 그리고 그 대안의 방법으로 SQL Server Management Studio을 사용하여 Sitecore의 Azure Database를 컨넥하고 Database를 Migration한다. Configuration 및 Assemblies 파일들은 수동의 옮겨야한다.

  1. Using Sitecore Azure Marketplace, deploy a clean solution to Azure: https://azuremarketplace.microsoft.com/en-us/marketplace/apps/Microsoft.AppSvc_SiteCore_IFrame
  2. Using FTP access, copy custom file-based content to your solution
  3. In the Azure SQL Server firewall, allow access for your IP address, via Azure Portal
  4. Connect to Azure SQL databases using the SQL Server Management Studio and restore your databases on top of clean ones As a result, you should get a customized solution (with all your files) that contains the custom content (your databases).

모든 과정이 끝나면, 반드시 Sitecore.config 파일에서 Temp Folder 경로가 제대로 설정되어있는지 확인 후, "Rebuild Indexes" 와 "Rebuild Link Databases" 작업을 사이트코어 Control Panel에서 수행하여야 한다.




2016년 3월 25일 금요일

현재 아이템을 사용중인 모든 아이템 찾기

#사이트코어 #FindRelatedItems #Link

모든 페이지들은 적용되어진 템플릿에 의하여 페이지가 생성이 되고, 템플릿의 값이 어떻게 적용되었는지에 따라, 페이지의 적용된 값도 일괄적으로 업데이트가 된다.
간혹, 잘못 적용된 템플릿을 삭제해야하는 경우가 생기며, 그 템플릿을 삭제하기 위해서는 먼저 템플릿이 사용중인 아이템을 삭제 또는 템플릿 정보를 해당 아이템에서 삭제해야지만이 메인 템플릿 아이템을 삭제할수가 있다.

이번 포스트에서는 어느 아이템에서 해당 템플릿을 사용중인지 찾는 방법을 알아보도록 하겠다.


  1. CMS Link DB를 이용하여 찾는 법

    1. "Content Editor"로 이동 후, 삭제하고자 하는 아이템을 선택한다.
    2. 아이템 선택 후, 상위 매인 툴 박스에서 "Navigation" 탭을 선택한다.
    3. "Navigation" 패널에서 "Links" 버튼을 클릭하면, 선택되어진 아이테을 사용중인 아이템 목록들이 나온다.

  2. 코드를 작성하여 찾는 법

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    public Item[] GetReferrers(string itemId)
    {          
        Item item = Sitecore.Data.Database.GetDatabase("master").GetItem(new Sitecore.Data.ID(itemId));
        // 모든 링크된 아이템의 정보를 가져온다
        ItemLink[] itemLinks = Globals.LinkDatabase.GetReferrers(item);
        if (itemLinks == null)
        {
            return null;
        }
        else
        {
            ArrayList items = new ArrayList(itemLinks.Length);
            foreach (ItemLink itemLink in itemLinks)
            {
                // 'Master' DB에 있는 정보를 비교한다.
                if (itemLink.SourceDatabaseName == "master")
                {
                    Item linkItem = Sitecore.Data.Database.GetDatabase("master").Items[itemLink.SourceItemID];
                    if (linkItem != null)
                    {
                        items.Add(linkItem);
                    }
                }
            }
            return (Item[])items.ToArray(typeof(Item));
        }
    }


  3. Powershell 스크립트를 이용하여 찾는 법
    1. 먼저, Sitecore PowerShell를 설치 한 후,
    2. "Content Editor" 또는 "Dashboard"에서 PowerShell Console를 실행시킨다.
    3. 아래의 코드를 PowerShell 스크립트 필디에 넣은 후, "Execute" 버턴을 실행한다.

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      $props = @{
          InfoTitle = "Referrers"
          InfoDescription = "현재 아이템을 사용중인 모든 아이템을 리스트하여라."
          PageSize = 25
      }
      
      function Get-ItemReferrers {
          $item = Get-Item -Path "/sitecore/your/template/item/path"
          $linkDb = [Sitecore.Globals]::LinkDatabase
          $links = $linkDb.GetReferrers($item)
          foreach($link in $links){
              $linkedItem = Get-Item -Path master:\ -ID $link.SourceItemID
              $linkedItem
          }
      }
      
      $items = Get-ItemReferrers
      $items | Show-ListView @props -Property @{Label="Name"; Expression={$_.DisplayName} },
                  @{Label="Updated"; Expression={$_.__Updated} },
                  @{Label="Updated by"; Expression={$_."__Updated by"} },
                  @{Label="Created"; Expression={$_.__Created} },
                  @{Label="Created by"; Expression={$_."__Created by"} },
                  @{Label="Path"; Expression={$_.ItemPath} }
      
      Close-Window
      

2015년 9월 2일 수요일

Sitecore PowerShell Script

#HowTo #PowerShell

 이번에는 Sitecore PowerShell Script에 관한여 소개해보겠다.

페이지 템플릿 또는 아이템의 필드 템플릿 값을 변경해야할경우, 간혹 많이 아이템을 하나하나씩 들어가 업데이트 해야하는 경우가 있다. 이럴경우 많은 시간이 소비될 뿐아니라 페이지를 만들고 업데이트하는 과정에서 Best Practice라고 할수가 없다.

이럴경우, 두가지 옵션이 있는데, 첫번째는 템플릿의 Standard Value를 리셋하는 것이고, 두번째는 Sitecore PowerShell의 스크립트를 통하여 변경하고 싶은 아이템의 값을 모두 업데이트하는것이다. 첫번째의 경우 가장 간편하고 안전한 업데이트라고 할수있으나, 만약 템들릿이 많은 필드 타입을 가지고 있고, __Standard Value를 통하여 만들어진 아이템이 아니라면 곤란하다.

이럴경우 두번째 옵션을 선택하는데, 아래는 선택되어진 Context 아이템에 Workflow 필드를 없데이트 하는것이다.


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
######################################################################
##  1. 먼저 default workflow state 세팅한다                          ##
##  2. 스크립트를 실행하기전 반드시 아이템의 아이디가 정확한지 확인하다  ##
######################################################################

function SetWorkflow($item)
{
    ## Update only items assigned __Default workflow
    if ($item."__Default workflow" -eq "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}") {
        $item.__Workflow = "{A5BC37E7-ED96-4C1E-8590-A26E64DB55EA}";
        $item."__Workflow state" = "{190B1C84-F1BE-47ED-AA41-F42193D9C8FC}";
    }
}

## Update correct workflow information.
get-item . -Language * | foreach-object { SetWorkFlow($_) }
get-childitem . -recurse -Language * | foreach-object { SetWorkFlow($_) }

## Show Updated Result
get-item . -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow"
get-childitem . -recurse -Language * | Format-Table Id, Name, Language, __Workflow, "__Workflow state", "__Default workflow"


아래는 이런문제때문에 StackworkFlow에 질문하여 답변한 링크이다.
http://stackoverflow.com/questions/29263398/sitecore-workflow-is-not-working/29286256#29286256