Cloud, DevOps e Automazione
CLOUD & DEVOPS
Cloud, DevOps e Automazione
La tecnologia Cloud permette l’elaborazione e l’archiviazione di dati fuori dai tradizionali data center on-premise, consentendo l’erogazione e la fruizione delle risorse informatiche con disponibilità on demand attraverso Internet. Oggi il Cloud viene considerato all'unanimità l’ingrediente fondamentale della Digital Transformation, l’elemento irrinunciabile da inserire all’interno della propria strategia di business se si desidera crescere e scalare velocemente mantenendo ampi margini di risparmio. Niente infrastrutture fisiche significa infatti riduzione dei costi riguardanti acquisti hardware, manutenzione e personale IT.
Ottimizzare i processi grazie al Cloud
Per noi di Extra Red il Cloud non è solo un luogo fisico. È sinonimo di sviluppo, automazione, modernizzazione delle applicazioni. Siamo “Cloud Enabler”: possiamo creare e mantenere il tuo ambiente Cloud (pubblico, privato o hybrid), ma non ci fermiamo qui. Migrare le applicazioni in Cloud senza trasformarle adeguatamente non ha senso, per questo motivo ti accompagniamo in tutte le fasi del cambiamento e ti aiutiamo a sfruttare a pieno le potenzialità di questa tecnologia tramite lo sviluppo di applicazioni cloud native, applicazioni a microservizi applicazioni containerizzate. Alla base di questo paradigma c’è il concetto di “container”, ovvero l'insieme di codice sorgente che custodisce al suo interno tutto il necessario per essere eseguito in qualsiasi ambiente e che può essere migrato, trasformato, manutenuto indipendentemente dagli altri container che compongono un’applicazione. Ogni applicazione moderna sviluppata in ottica Cloud è composta da più container. Quando i container diventano molti, è necessario disporre di un orchestratore. In Extra Red utilizziamo Red Hat Openshift, il migliore “sistema operativo del cloud” in circolazione. Red Hat Openshift, dato il suo elevato livello di compatibilità, consente alle organizzazioni di poter installare le proprie applicazioni a prescindere dall’ambiente fisico, virtuale o cloud sottostante. Consente inoltre di evitare lock-in dipendenti dal cloud provider ed è fondamentale se si sviluppano applicazioni per hyperscaler come AWS, Azure, Google.
Gestione delle infrastrutture e sinergia DevOps
La moderna gestione delle infrastrutture in Cloud prevede la creazione di vere e proprie piattaforme capaci di governare l’intero ciclo di vita di un’applicazione software, dalla codifica alla messa in esercizio di operazioni quali mantenimento e monitoraggio. Piattaforme del genere sono in grado non solo di supportare il runtime delle applicazioni, ma offrono una serie di servizi fondamentali per gli sviluppatori, in quanto sfruttabili in regime self-service. Adottando questo punto di vista, è evidente come venga a crearsi una stretta collaborazione tra i ruoli dei moderni sistemisti (ops) e gli sviluppatori responsabili del ciclo di vita delle applicazioni (dev). Nasce così la metodologia DevOps, che permette alle aziende di abbassare drasticamente il Time-To-Market di applicazioni e servizi e aumentare allo stesso tempo la loro affidabilità. Grazie a questa metodologia, diventa più semplice progettare automazioni che consentono di sostituire le attività di routine, eseguite da sviluppatori e sistemisti con pacchetti software eseguiti al momento necessario. In questo modo si riducono al minimo le attività di intervento manuale e si accelerano così i processi aziendali.
Sei interessato ad approfondire le nostre tecnologie? Scrivici!
Failed to "?eval" string with this error: ---begin-message--- Syntax error in ?eval-ed string in line 1, column 463: Lexical error: encountered "u" (117), after "\"Extra Red \\". ---end-message--- The failing expression: ==> entitiesListJson?eval [in template "20097#20123#53602" at line 72, column 29] ---- FTL stack trace ("~" means nesting-related): - Failed at: #assign entities = entitiesListJson?eval [in template "20097#20123#53602" at line 72, column 9] ----
1<#-- Blog Index Argomento ADT -->
2<#assign portletBackground = "bg-red-white" />
3<#list portletPreferences?keys as key>
4 <#if key=="portletBackground">
5 <#assign portletBackground=portletPreferences[key]?first />
6 </#if>
7</#list>
8
9<#assign dlAppServiceUtil = serviceLocator.findService("com.liferay.document.library.kernel.service.DLAppService")/>
10<#assign categoryService = serviceLocator.findService("it.extrared.redweb.commons.service.CategoryService") />
11<#assign assetCategoryPropertyLocalService = serviceLocator.findService("com.liferay.asset.category.property.service.AssetCategoryPropertyLocalService") />
12<#assign assetEntryLocalService=serviceLocator.findService("com.liferay.asset.kernel.service.AssetEntryLocalService") />
13<#assign dlFileEntryService = serviceLocator.findService('com.liferay.document.library.kernel.service.DLFileEntryService') />
14
15<#assign contentTopic = languageUtil.get(locale, "content-topic") />
16<#assign noArticle = languageUtil.get(locale, "no-article") />
17<#assign readMore = languageUtil.get(locale, "read-all") />
18
19<#assign redSimilarJournalArticle = serviceLocator.findService("it.extrared.redweb.commons.service.SimilarJournalArticle") />
20<#assign journalArticleLocalService = serviceLocator.findService("com.liferay.journal.service.JournalArticleLocalService") />
21
22<#assign article = "" />
23<#assign urlTitle = "" />
24
25<#assign dirtyUrlTitle = themeDisplay.getURLCurrent() />
26<#if dirtyUrlTitle?contains("curPage")>
27 <#assign curPage = paramUtil.getString(request, "curPage")?number />
28 <#assign last = dirtyUrlTitle?split("/")?last />
29 <#assign urlTitle = last?substring(0, last?index_of("?")) />
30<#elseif dirtyUrlTitle?contains("?wkrh___tabs1=properties")>
31 <#assign curPage = 1 />
32 <#assign last = themeDisplay.getURLCurrent()?split("/")?last />
33 <#assign urlTitle = last?substring(0, last?index_of('?wkrh___tabs1=properties')) />
34<#elseif dirtyUrlTitle?contains("_redirect")>
35 <#assign curPage = 1 />
36 <#assign urlTitle = dirtyUrlTitle?split("/")?last />
37<#else>
38 <#assign curPage = 1 />
39 <#assign urlTitle = dirtyUrlTitle?split("/")?last />
40</#if>
41
42<#assign logfactory = staticUtil["com.liferay.portal.kernel.log.LogFactoryUtil"] />
43<#assign log = logfactory.getLog("FreemarkerLog") />
44${log.debug("urlTitle: " + urlTitle)}
45
46<#attempt>
47 <#assign article = journalArticleLocalService.getArticleByUrlTitle(groupId, urlTitle) />
48<#recover>
49</#attempt>
50
51<#assign entitiesListJson = "" />
52<#assign total = 0 />
53<#assign delta = 0 />
54
55<#list portletPreferences?keys as k >
56 <#if k == "delta">
57 <#assign delta = portletPreferences[k]?first?number />
58 </#if>
59</#list>
60
61<input type="hidden" value="${curPage}" id="custom-curPage"/>
62
63<#if article?? && article?has_content>
64 <#assign entitiesListJson = redSimilarJournalArticle.getSimilarJournalArticlesWithConfig(portletPreferences, article.articleId, groupId, false, curPage?number) />
65 <#assign total = redSimilarJournalArticle.getSimilarJournalArticleCount(portletPreferences, article.articleId, groupId) />
66</#if>
67
68<#assign totalPages = (total/delta)?ceiling />
69
70<input type="hidden" value="${totalPages}" id="custom-totalPages"/>
71<#if entitiesListJson?? && entitiesListJson?has_content>
72 <#assign entities = entitiesListJson?eval />
73</#if>
74
75
76<#if entities?has_content && entities?size gt 0>
77 <section class="container-fluid ${portletBackground} custom-scroll-class" id="custom-scroll-class">
78 <div class="container col-xxl-12">
79 <div class="row">
80 <div class="col-12">
81 <div class="row align-items-center">
82 <div class="col-lg-4 col-12">
83 <span class="pb-5 text-muted">${contentTopic?upper_case}</span>
84 </div>
85 </div>
86 </div>
87 </div>
88 </div>
89 </section>
90
91 <section class="container-fluid pt-0 ${portletBackground}">
92 <div class="container">
93 <div class="row align-items-center pt-lg-5">
94 <#list entities?keys as k>
95 <#assign entitiesGroup=entities[k] />
96 <#if entitiesGroup?size gt 0>
97 <#list entitiesGroup as array>
98 <div class="col-lg-4 mb-5">
99 <#assign titolo = array["articleTitle"] />
100 <#assign articleId = array["articleId"] />
101 <#assign singleArticle = journalArticleLocalService.fetchArticle(groupId, articleId) />
102 <#assign categories = array["categoriesString"] />
103 <#assign displayPage = array["displayPage"] />
104 <#assign assetEntryId = array["assetEntryId"] />
105 <#assign assetEntry = assetEntryLocalService.getEntry(assetEntryId) />
106 <#assign categories = assetEntry.getCategories() />
107 <#assign urlImage = "" />
108 <#assign altImage = "" />
109 <#assign fileEntryId = "" />
110 <#if array["image"]?? && array["image"]?has_content>
111 <#assign docVal=array["image"]?eval />
112 <#if docVal.url?? && docVal.url?has_content>
113 <#assign urlImage = docVal.url />
114 </#if>
115 <#if docVal.title?? && docVal.title?has_content>
116 <#assign altImage = docVal.title />
117 </#if>
118 <#if docVal.fileEntryId?? && docVal.fileEntryId?has_content>
119 <#assign fileEntryId = docVal.fileEntryId />
120 </#if>
121 <div class="col-lg-9 col-9 col-sm-9 p-0">
122 <@adaptive_media_image["img"]
123 fileVersion=dlAppServiceUtil.getFileEntry(fileEntryId?number).getFileVersion()
124 width="100%"
125 height="auto"
126 alt="${altImage}"
127 class="mb-4"
128 />
129 <#--
130 <img width="100%" class="mb-4" height="auto" src="${urlImage}" alt="${altImage}" title="${titolo}">
131 -->
132 </div>
133 </#if>
134 <#--
135 <#list categoriesList as c>
136 <#attempt>
137 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
138 <#if typeProperty?? && typeProperty?has_content>
139 <#assign type = typeProperty.getValue() />
140 <#if type?? && type?has_content>
141 <div class="badge badge-pill badge-primary bg-red-red">${c.getTitle(locale)}</div>
142 </#if>
143 </#if>
144 <#recover>
145 </#attempt>
146 </#list>
147 -->
148 <div class="card-body pt-2">
149 <div class="card-subtitle text-muted">
150 <#list categories as c>
151 <#--
152 <#attempt>
153 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
154 <#if typeProperty?? && typeProperty?has_content>
155 <#assign type = typeProperty.getValue() />
156 <#if type?? && type?has_content>
157 ${c.getTitle(locale)?upper_case}
158 </#if>
159 </#if>
160 <#recover>
161 </#attempt>
162 -->
163 <#assign hasProperty = categoryService.hasCategoryProperty(c.getCategoryId(), "type") />
164 <#if hasProperty>
165 <#assign typeProperty = categoryService.getCategoryProperty(c.getCategoryId(), "type") />
166 <#if typeProperty?? && typeProperty?has_content && typeProperty == "true">
167 ${c.getTitle(locale)?upper_case}
168 </#if>
169 </#if>
170 </#list>
171
172 <#--
173 ${singleArticle.getDDMStructure().getName(locale)?upper_case}
174 -->
175 </div>
176 <#--
177 <#if categoriesList?? && categoriesList?has_content>
178 <div class="card-subtitle text-muted">
179 <#assign categoriesString = "" />
180 <#list categoriesList as c>
181 <#attempt>
182 <#assign typeProperty = assetCategoryPropertyLocalService.fetchCategoryProperty(c.categoryId?long, "type") />
183 <#recover>
184 <#if !categoriesString?has_content>
185 <#assign categoriesString = c.getTitle(locale)?upper_case />
186 <#else>
187 <#assign categoriesString = categoriesString + ", " + c.getTitle(locale)?upper_case />
188 </#if>
189 </#attempt>
190 </#list>
191 ${categoriesString}
192 </div>
193 <div class="card-subtitle text-muted">
194 ${categories?upper_case}
195 </div>
196 </#if>
197 -->
198 <a href="${displayPage}" target="_self" title="${titolo}">
199 <h3 class="m-0">${titolo}</h3>
200 </a>
201 </div>
202 </div>
203 </#list>
204 <#else>
205 <div class="container">
206 <h2 class="m-0 color50percent">${noArticle}</h2>
207 </div>
208 <a class="pt-5 align-middle" style="display: block" href="/blog">
209 <i class="align-middle me-2 material-icons-outlined">explore</i>
210 <span class="align-middle">${readMore?capitalize}</span>
211 </a>
212 </#if>
213 </#list>
214 </div>
215 </div>
216
217 <div class="lfr-pagination custom-pagination">
218 <ul class="lfr-pagination-buttons pagination">
219 <li class="page-item">
220 <a class="custom-pagination-prec <#if curPage == 1> disabled </#if>">
221 <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_back_ios</span>
222 </a>
223 </li>
224 <li class="page-item">
225 <a class="custom-pagination-succ <#if curPage == totalPages> disabled </#if>">
226 <span class="material-symbols-outlined" style="vertical-align: middle; padding-left: 5.0px;">arrow_forward_ios</span>
227 </a>
228 </li>
229 </ul>
230 </div>
231
232 </section>
233</#if>