テンプレート処理中にエラーが発生しました。
Java method "com.liferay.portal.json.JSONFactoryImpl.createJSONObject(String)" threw an exception when invoked on com.liferay.portal.json.JSONFactoryImpl object "com.liferay.portal.json.JSONFactoryImpl@2ad66ae2"; see cause exception in the Java stack trace.

----
FTL stack trace ("~" means nesting-related):
	- Failed at: navigationJSONObject = jsonFactoryUti...  [in template "17855804202317#32484267#LEARN-ARTICLE-NAV" at line 4, column 9]
----
1<#assign 
2	groupFriendlyURL = themeDisplay.getScopeGroup().getFriendlyURL() 
3	groupPathFriendlyURLPublic = themeDisplay.getPathFriendlyURLPublic() + groupFriendlyURL 
4	navigationJSONObject = jsonFactoryUtil.createJSONObject(navigation.getData()) 
5	navigationMenuItems = 
6
7			"Analytics Cloud": { 
8				"image": "/documents/d${groupFriendlyURL}/analytics_c-svg", 
9				"title": "Analytics Cloud", 
10				"url": "analytics-cloud" 
11			}, 
12			"Commerce": { 
13				"image": "/documents/d${groupFriendlyURL}/commerce_product-svg", 
14				"title": "Commerce", 
15				"url": "commerce" 
16			}, 
17			"DXP": { 
18				"image": "/documents/d${groupFriendlyURL}/dxp_p-svg", 
19				"title": "DXP / Portal", 
20				"url": "dxp" 
21			}, 
22			"Liferay Cloud": { 
23				"image": "/documents/d${groupFriendlyURL}/dxp_c-svg", 
24				"title": "Liferay Cloud", 
25				"url": "liferay-cloud" 
26			}, 
27			"Reference": { 
28				"image": "/documents/d${groupFriendlyURL}/reference-svg", 
29				"title": "Reference", 
30				"url": "reference" 
31
32
33 
34	breadcrumbJSONArray = navigationJSONObject.getJSONArray("breadcrumb") 
35	childrenJSONArray = navigationJSONObject.getJSONArray("children") 
36	parentJSONObject = navigationJSONObject.getJSONObject("parent") 
37	productJSONObject = breadcrumbJSONArray.getJSONObject(breadcrumbJSONArray.length()-1)!navigationJSONObject.getJSONObject("self") 
38	siblingsJSONArray = navigationJSONObject.getJSONArray("siblings") 
39/> 
40 
41<div class="learn-article-nav"> 
42	<#if productJSONObject?has_content && productJSONObject.getString("title")?has_content && navigationMenuItems[productJSONObject.getString("title")]?has_content && navigationMenuItems[productJSONObject.getString("title")].title?has_content> 
43		<div 
44			class="dropdown learn-article-nav-root learn-dropdown" 
45
46			<div class="learn-article-nav-item"> 
47				<div class="d-flex"> 
48					<div class="learn-article-nav-image"> 
49						<img 
50							class="lexicon-icon lexicon-icon-caret-bottom product-icon" 
51							role="presentation" 
52							src='${navigationMenuItems[productJSONObject.getString("title")].image}' 
53							viewBox="0 0 512 512" 
54						/> 
55					</div> 
56 
57					<span class="learn-article-nav-text">${navigationMenuItems[productJSONObject.getString("title")].title}</span> 
58				</div> 
59 
60				<div id="dropdown-icon"> 
61					<svg 
62						class="lexicon-icon lexicon-icon-caret-bottom" 
63						role="presentation" 
64						viewBox="0 0 512 512" 
65
66						<use xlink:href="/o/admin-theme/images/clay/icons.svg#caret-bottom"></use> 
67					</svg> 
68				</div> 
69			</div> 
70 
71			<ul class="dropdown-menu learn-dropdown-menu"> 
72				<#list navigationMenuItems as key, value> 
73					<li> 
74						<a 
75							class="dropdown-item learn-article-nav-item" 
76							href="/w/${navigationMenuItems[key].url}/index" 
77							tabindex="4" 
78
79							<span class="d-flex"> 
80								<span class="learn-article-nav-image"> 
81									<img 
82										class="lexicon-icon lexicon-icon-caret-bottom product-icon mt-0 mr-2" 
83										role="presentation" 
84										src="${value.image}"height: 25px; margin-left: 5px; max-width: none; width: 25px; 
85										viewBox="0 0 512 512" 
86									/> 
87								</span> 
88								<span class="learn-article-nav-text">${value.title}</span> 
89							</span> 
90 
91							<#if navigationMenuItems[productJSONObject.getString("title")].url == value.url> 
92								<span> 
93									<@clay["icon"] symbol="check" /> 
94								</span> 
95							</#if> 
96						</a> 
97					</li> 
98				</#list> 
99			</ul> 
100		</div> 
101	</#if> 
102 
103	<div class="learn-article-nav-content"> 
104		<#if parentJSONObject?has_content && parentJSONObject.getString("url")?has_content> 
105			<div class="learn-article-nav-item learn-article-nav-parent liferay-nav-item p-2"> 
106				<div class="mr-2"> 
107					<a 
108						href='${parentJSONObject.getString("url")}' 
109
110						<svg 
111							class="lexicon-icon lexicon-icon-angle-left" 
112							role="presentation" 
113							viewBox="0 0 512 512" 
114
115							<use xlink:href="/o/admin-theme/images/clay/icons.svg#angle-left"></use> 
116						</svg> 
117					</a> 
118				</div> 
119 
120				<span>${parentJSONObject.getString("title")}</span> 
121			</div> 
122		</#if> 
123 
124		<#if childrenJSONArray.length() gt 0> 
125			<ul class="m-0 p-2"> 
126				<#list 0..childrenJSONArray.length()-1 as i> 
127					<li class="learn-article-nav-item"> 
128						<a 
129							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == childrenJSONArray.getJSONObject(i).url)?then("selected", "")}' 
130							href="${childrenJSONArray.getJSONObject(i).url}" 
131
132							<span>${childrenJSONArray.getJSONObject(i).getString("title")}</span> 
133						</a> 
134					</li> 
135				</#list> 
136			</ul> 
137		<#elseif siblingsJSONArray.length() gt 0> 
138			<ul class="m-0 p-2"> 
139				<#list 0..siblingsJSONArray.length()-1 as i> 
140					<li class="learn-article-nav-item"> 
141						<a 
142							class='liferay-nav-item ${(navigationJSONObject.getJSONObject("self").url == siblingsJSONArray.getJSONObject(i).url)?then("selected", "")}' 
143							href="${siblingsJSONArray.getJSONObject(i).url}" 
144
145							<span>${siblingsJSONArray.getJSONObject(i).getString("title")}</span> 
146						</a> 
147					</li> 
148				</#list> 
149			</ul> 
150		</#if> 
151	</div> 
152</div> 

GitHubリポジトリの設定

Liferay Cloud アカウントがプロビジョニングされた後の最初のタスクは、管理者として設定をデプロイできるようにプロジェクトの Git リポジトリをセットアップすることです。 マーカスは、Delectable Bonsaiプロジェクトの管理者として、この手続きに従わなければなりません。

リポジトリをセットアップし、最初のプッシュを完了させ、機能していることを確認します。

note

このコースを続けるには、 CLIツールのインストール が必要です。

GitHub リポジトリをフォークしてクローンする

まず、Gitをインストールし、GitHubリポジトリのフォークを作成する必要があります。 Delectable Bonsaiプロジェクトの場合、Marcusは初期設定のためにこれらのステップをすべて実行しなければならないが、Kyleは貢献者として最後の2つのステップ(cloneとリモートリポジトリの追加)だけを実行すればよい。

新しいビルドのためにLiferay Cloudプロジェクトをフォークに移します。

  1. ローカル・システムにGit をセットアップする。

  2. GitHubでプロビジョニングしたリポジトリのページを開きます。

    tip

    プロジェクトのリポジトリへのリンクがない場合は、Liferay Cloud コンソールの Builds ページに移動し、最新のビルドの Branch の下のリンクをクリックします。 このリンクは、プロビジョニングされたリポジトリの特定のブランチを指します。

  3. リポジトリのフォーク を作成してください。

  4. 作成したフォーク をローカルシステム上にクローンする。

  5. Git がインストールされた)コマンドプロンプトで、あなたのフォークを(上流の) リモートリポジトリ として追加します。

これで、ローカルと GitHub 上で Liferay Cloud のプロジェクト構造を持つフォークされたリポジトリができました。

ウェブフックの設定

次に、Liferay CloudがリポジトリにアクセスできるようにWebhookを設定します。

  1. GitHub ウェブサイトで、リポジトリの設定ページに行き、 Webhooks をクリックします。

    GitHub リポジトリの設定ページからウェブフックを設定します。

  2. Webhookの追加] をクリックします。

  3. Payload URL フィールドに、Liferay Cloud infra 環境の CI サービスのドメインを追加し、最後に github-webhook/ を追加します(例: https://ci-delectablebonsai-infra.lfr.cloud/github-webhook/ for the delectablebonsai project)。

  4. Content type ドロップダウンメニューで、 application/json を選択する。

  5. Enable SSL verification が選択されていることを確認する。

    新しいWebhookのフォームに必要事項を入力し、トリガーとなるイベントを選択して完了です。

  6. このウェブフックをトリガーにしたいイベントはどれですか?] の下にある、 [個々のイベントを選択させてください] を選択してください。

  7. 表示されるイベントリストから PushesPull Requests を選択する。

    プッシュとプルリクエストを選択して、Liferay Cloud プロジェクトでビルドをトリガーするようにします。

  8. Active チェックボックスが選択されていることを確認する。

  9. Add webhook をクリックする。

これでLiferay Cloudはあなたのリポジトリにアクセスできるようになりました。

Liferayクラウドをプライベートリポジトリに向ける

最後に、 infra 環境でCIサービスを設定し、プライベートリポジトリで動作するようにする。

  1. Liferay Cloud コンソールにログインします。

  2. infra 環境に移動し、 Services をクリックします。

  3. CIサービスを選択する。

  4. Environment Variablesタブで、これらの環境変数の値を追加する:

    名前
    LCP_CI_SCM_PROVIDERgithub
    LCP_CI_SCM_REPOSITORY_NAME[リポジトリ名]
    LCP_CI_SCM_REPOSITORY_OWNER[リポジトリ所有者のアカウント]
    LCP_CI_SCM_TOKEN[個人アクセストークン]

    repo および admin:repo_hook カテゴリですべてのパーミッションがチェックされている パーソナルアクセストークン を使用してください。

CIサービスが再起動すると、プライベートリポジトリへのプッシュやプルリクエストがLiferay Cloudプロジェクトの新しいビルドのトリガーになります。

次: カスタムドメインを使用するようにサイトを設定する。

関連概念