ååã®æçš¿ã§ã¯ãOpenShiftãã©ãããã©ãŒã ã§ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã³å±éããããã«èšèšããããæ°ããS2IïŒãœãŒã¹ããã€ã¡ãŒãžïŒãã«ããŒã€ã¡ãŒãžã®æ©èœã«ã€ããŠå°ãè§ŠããŸãããæ¬¡ã«ãã¢ããªã±ãŒã·ã§ã³ã®è¿ éãªå±éã®ãããã¯ã«é¢å¿ããããŸãããã仿¥ã¯ãS2Iã€ã¡ãŒãžããã¯ãªãŒã³ãªããã«ããŒã€ã¡ãŒãžãšããŠäœ¿çšããé¢é£ããOpenShiftã¢ã»ã³ããªãšçµã¿åãããæ¹æ³ãèŠãŠãããŸãã
ããããªãã«ããŒç»å
æåã®éšåã§è¿°ã¹ãããã«ãã»ãšãã©ã®ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ã«ã¯ããããããã«ãã¹ããŒãžããããéåžžãã³ãŒãã®å€æãè€æ°ã®ãã¡ã€ã«ã®é£çµããããã¡ã€ãªã©ã®æäœãå®è¡ããŸããçµæã®ãã¡ã€ã«ïŒéçHTMLãJavaScriptãããã³CSSïŒãåºåãã©ã«ããŒã«è¿œå ãããŸãããã®ãã©ã«ãã®å Žæã¯éåžžã䜿çšãããŠãããã«ãããŒã«ã«ãã£ãŠç°ãªããReactã®å Žåãããã¯./buildãã©ã«ãã«ãªããŸãïŒããã«ã€ããŠã¯ã以äžã§è©³ãã説æããŸãïŒã
ãœãŒã¹ããã€ã¡ãŒãžïŒS2IïŒ
ãã®æçš¿ã§ã¯ãS2Iãšã¯äœããããã³ãã®äœ¿ç𿹿³ã«ã€ããŠã¯ãŸã£ãã説æããŠããŸããïŒè©³çްã«ã€ããŠã¯ããã¡ããåç §ããŠãã ããïŒããWeb App Builderã€ã¡ãŒãžã®æ©èœãçè§£ããã«ã¯ããã®ããã»ã¹ã®2ã€ã®æ®µéã«ã€ããŠæç¢ºã«ããããšãéèŠã§ãã
çµã¿ç«ãŠæ®µé
çµã¿ç«ãŠæé ã¯ãæ¬è³ªçã«ãdocker buildãå®è¡ããŠãæ°ããDockerã€ã¡ãŒãžãäœæãããšãã«çºçããæé ãšéåžžã«ãã䌌ãŠããŸãããããã£ãŠããã®æ®µéã¯ãOpenShiftãã©ãããã©ãŒã ã§ãã«ããéå§ãããšãã«çºçããŸãã
Web App Builderã€ã¡ãŒãžã®å Žåãã¢ã»ã³ãã«ã¹ã¯ãªããã¯ãã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããã«ããå®è¡ãã圹å²ãæãããŸããããã©ã«ãã§ã¯ããã«ããŒã€ã¡ãŒãžã¯npm runãã«ãã³ã³ã¹ãã©ã¯ãã䜿çšããŸãããNPM_BUILDç°å¢å€æ°ãä»ããŠãªãŒããŒã©ã€ãã§ããŸãã
åã«è¿°ã¹ãããã«ã宿ããããã§ã«ãã«ããããã¢ããªã±ãŒã·ã§ã³ã®å Žæã¯ã䜿çšããããŒã«ã«ãã£ãŠç°ãªããŸããããšãã°ãReactã®å Žåãããã¯ã/Buildãã©ã«ããŒã«ãªããAngularã¢ããªã±ãŒã·ã§ã³ã®å Žåãproject_name / distãã©ã«ããŒã«ãªããŸãããŸããååã®æçš¿ã«ç€ºãããŠããããã«ãããã©ã«ãã§ãã«ãããããã«èšå®ãããŠããåºåãã£ã¬ã¯ããªã®å Žæã¯ãOUTPUT_DIRç°å¢å€æ°ãä»ããŠãªãŒããŒã©ã€ãã§ããŸããåºåãã©ã«ãã®å Žæã¯ãã¬ãŒã ã¯ãŒã¯ããšã«ç°ãªããããçæãããåºåãã€ã¡ãŒãžå ã®æšæºãã©ã«ããã€ãŸã/ opt / apt-root / outputã«ã³ããŒããã ãã§ããããã¯ããã®èšäºã®æ®ãã®éšåãçè§£ããããã«éèŠã§ãããä»ã®ãšãããæ¬¡ã®æ®µéã§ããå®è¡ïŒå®è¡ãã§ãŒãºïŒãç°¡åã«èŠãŠã¿ãŸãããã
å®è¡ãã§ãŒãº
ãã®æ®µéã¯ãã¢ã»ã³ããªæ®µéã§äœæãããæ°ããã€ã¡ãŒãžã«å¯ŸããŠdockerrunã®åŒã³åºããè¡ããããšãã«çºçããŸããããã¯ãOpenShiftãã©ãããã©ãŒã ã«ãããã€ãããšãã«ãçºçããŸããããã©ã«ãã§ã¯ãå®è¡ã¹ã¯ãªããã¯serveã¢ãžã¥ãŒã«ã䜿çšããŠãäžèšã®æšæºåºåãã£ã¬ã¯ããªã«ããéçã³ã³ãã³ããæäŸããŸãã
ãã®æ¹æ³ã¯ãã¢ããªã±ãŒã·ã§ã³ããã°ããå±éããã®ã«é©ããŠããŸãããäžè¬ã«ããã®æ¹æ³ã§éçã³ã³ãã³ããæäŸããããšã¯ãå§ãããŸãããå®éã«ã¯éçã³ã³ãã³ãã®ã¿ãæäŸãããããã€ã¡ãŒãžå ã«ã€ã³ã¹ããŒã«ãããNode.jsã¯å¿ èŠãããŸãããWebãµãŒããŒã§ååã§ãã
ã€ãŸããçµã¿ç«ãŠäžã«1ã€ãå®è¡äžã«ãã1ã€å¿ èŠã§ããããã§ããã§ãŒã³ãã«ãã圹ç«ã¡ãŸãã
é£éãã«ã
OpenShiftã®ããã¥ã¡ã³ãã«ãã§ãŒã³ãã«ã ã«ã€ããŠæžãããŠããå å®¹ã¯æ¬¡ã®ãšããã§ãã
ã2ã€ã®ã¢ã»ã³ããªãçžäºã«ãªã³ã¯ã§ããŸãã1ã€ã¯ã³ã³ãã€ã«æžã¿ãšã³ãã£ãã£ãçæãããã1ã€ã¯ãã®ãšã³ãã£ãã£ãå®è¡ããããã«äœ¿çšãããå¥ã®ã€ã¡ãŒãžã§ãã®ãšã³ãã£ãã£ããã¹ãããŸããã
ã€ãŸããWeb App Builderã€ã¡ãŒãžã䜿çšããŠãã«ããå®è¡ããæ¬¡ã«WebãµãŒããŒã€ã¡ãŒãžNGINXã䜿çšããŠã³ã³ãã³ããæäŸã§ããŸãã
ãããã£ãŠãWeb App Builderã€ã¡ãŒãžãçŽç²ãªãã«ããŒãšããŠäœ¿çšããŠããå®è¡æã€ã¡ãŒãžã¯å°ãããªããŸãã
ããã§ã¯ãå ·äœçãªäŸã§ãããèŠãŠã¿ãŸãããã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãcreate-react-appã³ãã³ãã©ã€ã³ããŒã«ã§æ§ç¯ãããåçŽãªReactã¢ããªã±ãŒã·ã§ã³ã䜿çšããŸããOpenShiftãã³ãã¬ãŒããã¡ã€ã«
ã¯ããã¹ãŠããŸãšããã®ã«åœ¹ç«ã¡ãŸãã
ãã®ãã¡ã€ã«ã詳ããèŠãŠããã©ã¡ãŒã¿ã®ã»ã¯ã·ã§ã³ããå§ããŸãããã
parameters:
- name: SOURCE_REPOSITORY_URL
description: The source URL for the application
displayName: Source URL
required: true
- name: SOURCE_REPOSITORY_REF
description: The branch name for the application
displayName: Source Branch
value: master
required: true
- name: SOURCE_REPOSITORY_DIR
description: The location within the source repo of the application
displayName: Source Directory
value: .
required: true
- name: OUTPUT_DIR
description: The location of the compiled static files from your web apps builder
displayName: Output Directory
value: build
required: false
ããã§ã¯ãã¹ãŠãããªãæç¢ºã§ãããOUTPUT_DIRãã©ã¡ãŒã¿ãŒã«æ³šæããå¿ èŠããããŸãããã®äŸã®Reactã¢ããªã±ãŒã·ã§ã³ã®å ŽåãReactã¯ããã©ã«ãå€ãåºåãã©ã«ããŒãšããŠäœ¿çšãããããå¿é ããå¿ èŠã¯ãããŸããããAngularãªã©ã®å Žåã¯ããã®ãã©ã¡ãŒã¿ãŒãå¿ èŠã«å¿ããŠå€æŽããå¿ èŠããããŸãã
ããã§ã¯ãImageStreamsã»ã¯ã·ã§ã³ãèŠãŠã¿ãŸãããã
- apiVersion: v1
kind: ImageStream
metadata:
name: react-web-app-builder // 1
spec: {}
- apiVersion: v1
kind: ImageStream
metadata:
name: react-web-app-runtime // 2
spec: {}
- apiVersion: v1
kind: ImageStream
metadata:
name: web-app-builder-runtime // 3
spec:
tags:
- name: latest
from:
kind: DockerImage
name: nodeshift/ubi8-s2i-web-app:10.x
- apiVersion: v1
kind: ImageStream
metadata:
name: nginx-image-runtime // 4
spec:
tags:
- name: latest
from:
kind: DockerImage
name: 'centos/nginx-112-centos7:latest'
3çªç®ãš4çªç®ã®ç»åãèŠãŠãã ãããã©ã¡ããDockerã€ã¡ãŒãžãšããŠå®çŸ©ãããŠãããã©ãããæ¥ãã®ããã¯ã£ãããšããããŸãã
3çªç®ã®ç»åã¯web-app-builderã§ãDockerããã«10.xã¿ã°ãä»ããnodeshift / ubi8-s2i-web-appããååŸãããŸãã
4ã€ç®ã¯ãDockerããã«ææ°ã®ã¿ã°ãä»ããNGINXã€ã¡ãŒãžïŒããŒãžã§ã³1.12ïŒã§ãã
ããã§ã¯ãæåã®2ã€ã®ç»åãèŠãŠã¿ãŸãããããããã¯äž¡æ¹ãšãéå§æã«ã¯ç©ºã§ããããã«ããã§ãŒãºã§ã®ã¿äœæãããŸããæåã®ã€ã¡ãŒãžã§ããreact-web-app-builderã¯ãweb-app-builder-runtimeã€ã¡ãŒãžãšãœãŒã¹ã³ãŒããããŒãžããã¢ã»ã³ããªã¹ãããã®çµæã«ãªããŸãããã®ããããã®ç»åã®ååã«ã-builderããä»ããŸããã
2çªç®ã®ã€ã¡ãŒãžïŒreact-web-app-runtimeïŒã¯ãnginx-image-runtimeãšreact-web-app-builderã€ã¡ãŒãžã®ããã€ãã®ãã¡ã€ã«ãçµã¿åãããçµæã«ãªããŸãããã®ç»åã¯å±éäžã«ã䜿çšãããWebãµãŒããŒãšã¢ããªã±ãŒã·ã§ã³ã®éçHTMLãJavaScriptãCSSã®ã¿ãå«ãŸããŸãã
æ··ä¹±ããŠããŸããïŒæ¬¡ã«ããã«ãæ§æãèŠãŠã¿ãŸããããå°ãæç¢ºã«ãªããŸãã
ãã³ãã¬ãŒãã«ã¯2ã€ã®ãã«ãæ§æããããŸãããããæåã®ãã®ã§ãããªãæšæºçã§ãã
apiVersion: v1
kind: BuildConfig
metadata:
name: react-web-app-builder
spec:
output:
to:
kind: ImageStreamTag
name: react-web-app-builder:latest // 1
source: // 2
git:
uri: ${SOURCE_REPOSITORY_URL}
ref: ${SOURCE_REPOSITORY_REF}
contextDir: ${SOURCE_REPOSITORY_DIR}
type: Git
strategy:
sourceStrategy:
env:
- name: OUTPUT_DIR // 3
value: ${OUTPUT_DIR}
from:
kind: ImageStreamTag
name: web-app-builder-runtime:latest // 4
incremental: true // 5
type: Source
triggers: // 6
- github:
secret: ${GITHUB_WEBHOOK_SECRET}
type: GitHub
- type: ConfigChange
- imageChange: {}
type: ImageChange
ã芧ã®ãšããã1ãšããã©ãã«ã®ä»ããè¡ã¯ããã®ãã«ãã®çµæããåã«ImageStreamsã»ã¯ã·ã§ã³ã§èŠãã®ãšåãreact-web-app-builderã€ã¡ãŒãžã«é 眮ãããããšã瀺ããŠããŸãã
2ãšããã©ãã«ã®ä»ããè¡ã¯ãã³ãŒãã®å ¥æå ã瀺ããŠããŸããç§ãã¡ã®å Žåãããã¯gitãªããžããªã§ãããå Žæãrefãããã³ã³ã³ããã¹ããã©ã«ãã¯ãäžèšã§ãã§ã«èŠããã©ã¡ãŒã¿ã«ãã£ãŠå®çŸ©ãããŸãã
3ãšããã©ãã«ã®ä»ããè¡ã¯ããã©ã¡ãŒã¿ã»ã¯ã·ã§ã³ã«ãã§ã«è¡šç€ºãããŠããŸãããã®äŸã§ãã«ããããŠããOUTPUT_DIRç°å¢å€æ°ã远å ããŸãã
4ãšããã©ãã«ã®ä»ããè¡ã¯ãImageStreamã»ã¯ã·ã§ã³ã§ãã§ã«èŠãweb-app-builder-runtimeã€ã¡ãŒãžã䜿çšããããšã瀺ããŠããŸãã
5ãšããã©ãã«ã®ä»ããè¡ã¯ãS2Iã€ã¡ãŒãžãããããµããŒãããWeb App Builderã€ã¡ãŒãžããµããŒãããŠããå Žåãã€ã³ã¯ãªã¡ã³ã¿ã«ãã«ãã䜿çšããããšã瀺ããŠããŸããæåã®èµ·åæã«ãã¢ã»ã³ããªãã§ãŒãºã®å®äºåŸãã€ã¡ãŒãžã¯node_modulesãã©ã«ããŒãã¢ãŒã«ã€ããã¡ã€ã«ã«ä¿åããŸãããã®åŸã®å®è¡ã§ã¯ãã€ã¡ãŒãžã¯ãã®ãã©ã«ããŒãè§£åããã ãã§ãã«ãæéãççž®ããŸãã
ãããŠæåŸã«ã6ãšããã©ãã«ã®ä»ããè¡ã¯ãäœãã倿Žããããšãã«æåã®ä»å ¥ãªãã§ãã«ããèªåçã«éå§ãããããã«ãã»ãã®æ°åã®ããªã¬ãŒã§ãã
å šäœãšããŠãããã¯ããªãæšæºçãªãã«ãæ§æã§ãã
次ã«ã2çªç®ã®ãã«ãæ§æãèŠãŠã¿ãŸããããæåã®ãã®ãšéåžžã«äŒŒãŠããŸãããéèŠãªéãã1ã€ãããŸãã
apiVersion: v1
kind: BuildConfig
metadata:
name: react-web-app-runtime
spec:
output:
to:
kind: ImageStreamTag
name: react-web-app-runtime:latest // 1
source: // 2
type: Image
images:
- from:
kind: ImageStreamTag
name: react-web-app-builder:latest // 3
paths:
- sourcePath: /opt/app-root/output/. // 4
destinationDir: . // 5
strategy: // 6
sourceStrategy:
from:
kind: ImageStreamTag
name: nginx-image-runtime:latest
incremental: true
type: Source
triggers:
- github:
secret: ${GITHUB_WEBHOOK_SECRET}
type: GitHub
- type: ConfigChange
- type: ImageChange
imageChange: {}
- type: ImageChange
imageChange:
from:
kind: ImageStreamTag
name: react-web-app-builder:latest // 7
ãããã£ãŠã2çªç®ã®ãã«ãæ§æã¯react-web-app-runtimeã§ãããæåã¯ããªãæšæºçã§ãã
1ãšããã©ãã«ã®ä»ããè¡ã¯æ°ãããã®ã§ã¯ãªãããã«ãçµæãreact-web-app-runtimeã€ã¡ãŒãžã«å ¥ããããŠããããšã瀺ããŠããŸãã
åã®æ§æãšåæ§ã«ã2ãšããã©ãã«ã®ä»ããè¡ã¯ããœãŒã¹ã³ãŒãã®ååŸå ã瀺ããŠããŸããããããããã§ã¯ãããç»åããæ¥ãŠãããšèšã£ãŠããããšã«æ³šæããŠãã ãããããã«ãäœæããã°ããã®ç»åãã-react-web-app-builderããïŒ3ãšããã©ãã«ã®ä»ããè¡ã«ç€ºãããŠããŸãïŒã䜿çšãããã¡ã€ã«ã¯ç»åå ã«ããããã®å Žæã¯4ãšããã©ãã«ã®ä»ããè¡ã§æå®ãããŠããŸãããã®å Žåã¯/ opt / app-root / output /ã§ããããªããèŠããŠãããªããããã¯ç§ãã¡ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããçµæããçæããããã¡ã€ã«ã眮ãããå Žæã§ãã
5ãšããã©ãã«ã®ä»ããè¡ã§æå®ãããŠããå®å ãã©ã«ããŒã¯ãçŸåšã®ãã£ã¬ã¯ããªã«ãããŸããïŒããã¯ãã¹ãŠãããŒã«ã«ã³ã³ãã¥ãŒã¿ãŒã§ã¯ãªããOpenShiftãšåŒã°ããéæ³ã®ãããªãã®ã®äžã§å転ããŠããããšãå¿ããªãã§ãã ããïŒã
æŠç¥ã»ã¯ã·ã§ã³ïŒ6ãšããã©ãã«ã®ä»ããè¡ïŒããæåã®ãã«ãæ§æãšåæ§ã§ããä»åã ããImageStreamã»ã¯ã·ã§ã³ã§ãã§ã«èŠãnginx-image-runtimeã䜿çšããŸãã
æåŸã«ã7ãšããã©ãã«ã®ä»ããè¡ã¯ãreact-web-app-builderã€ã¡ãŒãžã倿Žããããã³ã«ãã®ãã«ããèµ·åããããªã¬ãŒã»ã¯ã·ã§ã³ã§ãã
ãã以å€ã®å Žåããã®ãã³ãã¬ãŒãã«ã¯ãããªãæšæºçãªå±éæ§æãšããµãŒãã¹ããã³ã«ãŒãã«é¢é£ãããã®ãå«ãŸããŠããŸãããããã«ã€ããŠã¯èª¬æããŸããããããã€ãããã€ã¡ãŒãžã¯react-web-app-runtimeã€ã¡ãŒãžã§ããããšã«æ³šæããŠãã ããã
ã¢ããªã±ãŒã·ã§ã³ããããã€ããŸã
ãããã£ãŠããã³ãã¬ãŒãã確èªããåŸãããã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããããã€ããæ¹æ³ãèŠãŠã¿ãŸãããã
ocãšããOpenShiftã¯ã©ã€ã¢ã³ãããŒã«ã䜿çšããŠããã³ãã¬ãŒããå±éã§ããŸãã
$ find . | grep openshiftio | grep application | xargs -n 1 oc apply -f
$ oc new-app --template react-web-app -p SOURCE_REPOSITORY_URL=https://github.com/lholmquist/react-web-app
äžã®ã¹ã¯ãªãŒã³ã·ã§ããã®æåã®ã³ãã³ãã¯ããã³ãã¬ãŒããèŠã€ããããã®æå³çãªãšã³ãžãã¢ãªã³ã°æ¹æ³ã§ãã/Openshiftio/application.yamlã
2çªç®ã®ã³ãã³ãã¯ããã®ãã³ãã¬ãŒãã«åºã¥ããŠæ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããã ãã§ãã
ãããã®ã³ãã³ããå®è¡ãããšã2ã€ã®ã¢ã»ã³ããªãããããšãããããŸãã

æŠèŠç»é¢ã«æ»ããšãããããèµ·åããŸãã

ãªã³ã¯ãã¯ãªãã¯ãããšãããã©ã«ãã®ReactAppããŒãžã§ããã¢ããªã«ç§»åããŸãã

ä»é²1
Angularæå¥œå®¶ã®ããã«ããµã³ãã«ã¢ããªããããŸãã
ãã³ãã¬ãŒãã¯ãOUTPUT_DIR倿°ãé€ããŠãããã§ãåãã§ãã
ä»é²2
ãã®èšäºã§ã¯ãWebãµãŒããŒNGINXãšããŠäœ¿çšããŸããããApacheã«çœ®ãæããã®ã¯éåžžã«ç°¡åã§ãApacheã®éäžã§ãã¡ã€ã«ãã³ãã¬ãŒãã€ã¡ãŒãžNGINXã倿Žããã ãã§ãã
çµè«
ãã®ã·ãªãŒãºã®æåã®ããŒãã§ã¯ãOpenShiftãã©ãããã©ãŒã ã«ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ããã°ãããããã€ããæ¹æ³ã玹ä»ããŸããã仿¥ã¯ãWebã¢ããªã€ã¡ãŒãžãäœæãããã®ãšããã§ãŒã³ãã«ãã䜿çšããŠNGINXãªã©ã®çŽç²ãªWebãµãŒããŒãšçµã¿åãããŠãããæ¬çªç°å¢ã«å¯Ÿå¿ããã¢ããªãã«ããäœæããæ¹æ³ã«ã€ããŠèª¬æããŸããããã®ã·ãªãŒãºã®æ¬¡ã®æåŸã®èšäºã§ã¯ãOpenShiftã§ã¢ããªã±ãŒã·ã§ã³ã®éçºãµãŒããŒãå®è¡ããããŒã«ã«ãã¡ã€ã«ãšãªã¢ãŒããã¡ã€ã«ã®åæãç¶æããæ¹æ³ã瀺ããŸãã
ãã®èšäºã·ãªãŒãºã®å 容
- ããŒã1ïŒãããæ°ã¹ãããã§ææ°ã®Webã¢ããªã±ãŒã·ã§ã³ãå±éããæ¹æ³;
- ããŒã2ïŒé¢é£ããOpenShiftã¢ã»ã³ããªã䜿çšããŠæ¬çªãããã€ã¡ã³ããç·šæããæ¢åã®HTTPãµãŒããŒã€ã¡ãŒãžïŒNGINXãªã©ïŒãšãšãã«æ°ããS2Iã€ã¡ãŒãžã䜿çšããæ¹æ³ã
- 3: OpenShift .