ื™ื™ืฉื•ืžื™ื ืžื•ื“ืจื ื™ื™ื ื‘-OpenShift, ื—ืœืง 2: ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช

ืฉืœื•ื ืœื›ื•ืœื! ื–ื”ื• ื”ืคื•ืกื˜ ื”ืฉื ื™ ื‘ืกื“ืจื” ืฉืœื ื• ื‘ื• ืื ื• ืžืจืื™ื ื›ื™ืฆื“ ืœืคืจื•ืก ื™ื™ืฉื•ืžื™ ืื™ื ื˜ืจื ื˜ ืžื•ื“ืจื ื™ื™ื ื‘-Red Hat OpenShift.

ื™ื™ืฉื•ืžื™ื ืžื•ื“ืจื ื™ื™ื ื‘-OpenShift, ื—ืœืง 2: ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช

ื‘ืคื•ืกื˜ ื”ืงื•ื“ื ื ื’ืขื ื• ืžืขื˜ ื‘ื™ื›ื•ืœื•ืช ืฉืœ ืชืžื•ื ืช ื‘ื•ื ื” S2I (ืžืงื•ืจ-ืœืชืžื•ื ื”) ื”ื—ื“ืฉื”, ื”ืžื™ื•ืขื“ืช ืœื‘ื ื™ื™ื” ื•ืคืจื™ืกื” ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ืื™ื ื˜ืจื ื˜ ืžื•ื“ืจื ื™ื•ืช ื‘ืคืœื˜ืคื•ืจืžืช OpenShift. ืื– ื”ืชืขื ื™ื™ื ื• ื‘ื ื•ืฉื ืฉืœ ืคืจื™ืกื” ืžื”ื™ืจื” ืฉืœ ืืคืœื™ืงืฆื™ื”, ื•ื”ื™ื•ื ื ื‘ื—ืŸ ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช S2I ื›ืชืžื•ื ืช ื‘ื•ื ื” "ื˜ื”ื•ืจื”" ื•ืœืฉืœื‘ ืื•ืชื” ืขื ืžื›ืœื•ืœื™ื ืงืฉื•ืจื™ื ืฉืœ OpenShift.

ืชืžื•ื ืช ื‘ื ืื™ ื ืงื™ื™ื”

ื›ืคื™ ืฉื”ื–ื›ืจื ื• ื‘ื—ืœืง XNUMX, ืœืจื•ื‘ ื™ื™ืฉื•ืžื™ ื”ืื™ื ื˜ืจื ื˜ ื”ืžื•ื“ืจื ื™ื™ื ื™ืฉ ืžื” ืฉื ืงืจื ืฉืœื‘ ื‘ื ื™ื™ื”, ืืฉืจ ื‘ื“ืจืš ื›ืœืœ ืžื‘ืฆืข ืคืขื•ืœื•ืช ื›ืžื• ืชืขืชื•ืง ืงื•ื“, ืฉืจืฉื•ืจ ืงื‘ืฆื™ื ืžืจื•ื‘ื™ื ื•ื”ืงื˜ื ื”. ื”ืงื‘ืฆื™ื ื”ืžืชืงื‘ืœื™ื ื›ืชื•ืฆืื” ืžืคืขื•ืœื•ืช ืืœื• - ื•ื–ื”ื• HTML ืกื˜ื˜ื™, JavaScript ื•-CSS - ืžืื•ื—ืกื ื™ื ื‘ืชื™ืงื™ื™ืช ื”ืคืœื˜. ื”ืžื™ืงื•ื ืฉืœ ืชื™ืงื™ื” ื–ื• ืชืœื•ื™ ื‘ื“ืจืš ื›ืœืœ ื‘ืื™ืœื• ื›ืœื™ ื‘ื ื™ื™ื” ืžืฉืชืžืฉื™ื, ื•ืขื‘ื•ืจ React ื–ื• ืชื”ื™ื” ืชื™ืงื™ื™ืช ./build (ื ื—ื–ื•ืจ ืœื›ืš ื‘ืคื™ืจื•ื˜ ืจื‘ ื™ื•ืชืจ ื‘ื”ืžืฉืš).

ืžืงื•ืจ ืœืชืžื•ื ื” (S2I)

ื‘ืคื•ืกื˜ ื–ื” ืื™ื ื ื• ื ื•ื’ืขื™ื ื‘ื ื•ืฉื "ืžื”ื• S2I ื•ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ื•" (ืชื•ื›ืœื• ืœืงืจื•ื ืขื•ื“ ืขืœ ื–ื” ื›ืืŸ), ืื‘ืœ ื—ืฉื•ื‘ ืฉื™ื”ื™ื” ื‘ืจื•ืจ ืœื’ื‘ื™ ืฉื ื™ ื”ืฉืœื‘ื™ื ื‘ืชื”ืœื™ืš ื–ื” ื›ื“ื™ ืœื”ื‘ื™ืŸ ืžื” ืขื•ืฉื” ืชืžื•ื ื” ืฉืœ Web App Builder.

ืฉืœื‘ ื”ื”ืจื›ื‘ื”

ืฉืœื‘ ื”ื”ืจื›ื‘ื” ื“ื•ืžื” ืžืื•ื“ ื‘ืžื”ื•ืชื• ืœืžื” ืฉืงื•ืจื” ื›ืืฉืจ ืืชื” ืžืคืขื™ืœ ืืช docker build ื•ืžืกื™ื™ื ืขื ืชืžื•ื ืช Docker ื—ื“ืฉื”. ื‘ื”ืชืื, ืฉืœื‘ ื–ื” ืžืชืจื—ืฉ ื‘ืขืช ืชื—ื™ืœืช ื‘ื ื™ื™ื” ื‘ืคืœื˜ืคื•ืจืžืช OpenShift.

ื‘ืžืงืจื” ืฉืœ ืชืžื•ื ืช Web App Builder, ื”ื•ื ืื—ืจืื™ ืขืœ ื”ืชืงื ืช ื”ืชืœื•ืช ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ื•ื”ืคืขืœืช ื”-build. ืœื”ืจื›ื™ื‘ ืกืงืจื™ืคื˜. ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ืชืžื•ื ืช ื”ื‘ื•ื ื” ืžืฉืชืžืฉืช ื‘ืžื‘ื ื” npm run build, ืืš ื ื™ืชืŸ ืœืขืงื•ืฃ ื–ืืช ื‘ืืžืฆืขื•ืช ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” NPM_BUILD.

ื›ืคื™ ืฉืืžืจื ื• ืงื•ื“ื ืœื›ืŸ, ื”ืžื™ืงื•ื ืฉืœ ื”ื™ื™ืฉื•ื ื”ืžื•ื’ืžืจ, ืฉื ื‘ื ื” ื›ื‘ืจ, ืชืœื•ื™ ื‘ืื™ืœื• ื›ืœื™ื ืืชื” ืžืฉืชืžืฉ. ืœื“ื•ื’ืžื”, ื‘ืžืงืจื” ืฉืœ React ื–ื• ืชื”ื™ื” ื”ืชื™ืงื™ื” ./build, ื•ืขื‘ื•ืจ ื™ื™ืฉื•ืžื™ Angular ื–ื• ืชื”ื™ื” ื”ืชื™ืงื™ื” project_name/dist. ื•ื›ืคื™ ืฉื›ื‘ืจ ื”ื•ืฆื’ ื‘ืคื•ืกื˜ ื”ืงื•ื“ื, ื ื™ืชืŸ ืœืขืงื•ืฃ ืืช ื”ืžื™ืงื•ื ืฉืœ ืกืคืจื™ื™ืช ื”ืคืœื˜, ื”ืžื•ื’ื“ืจืช ืœื‘ื ื™ื™ื” ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื“ืจืš ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” OUTPUT_DIR. ื•ื‘ื›ืŸ, ืžื›ื™ื•ื•ืŸ ืฉื”ืžื™ืงื•ื ืฉืœ ืชื™ืงื™ื™ืช ื”ืคืœื˜ ืฉื•ื ื” ืžืžืกื’ืจืช ืœืžืกื’ืจืช, ืืชื” ืคืฉื•ื˜ ืžืขืชื™ืง ืืช ื”ืคืœื˜ ืฉื ื•ืฆืจ ืœืชื™ืงื™ื” ื”ืจื’ื™ืœื” ื‘ืชืžื•ื ื”, ื›ืœื•ืžืจ /opt/apt-root/output. ื–ื” ื—ืฉื•ื‘ ืœื”ื‘ื ืช ื”ืžืฉืš ื”ืžืืžืจ ื”ื–ื”, ืื‘ืœ ืœืขืช ืขืชื” ื‘ื•ืื• ื ืกืชื›ืœ ื‘ืžื”ื™ืจื•ืช ืขืœ ื”ืฉืœื‘ ื”ื‘ื - ืฉืœื‘ ื”ืจื™ืฆื”.

ืฉืœื‘ ื”ืจื™ืฆื”

ืฉืœื‘ ื–ื” ืžืชืจื—ืฉ ื›ืืฉืจ ืžืชื‘ืฆืขืช ืงืจื™ืื” ืœ-docer run ืขืœ ื”ืชืžื•ื ื” ื”ื—ื“ืฉื” ืฉื ื•ืฆืจื” ื‘ืžื”ืœืš ืฉืœื‘ ื”ื”ืจื›ื‘ื”. ืื•ืชื• ื“ื‘ืจ ืงื•ืจื” ื‘ืขืช ืคืจื™ืกื” ื‘ืคืœื˜ืคื•ืจืžืช OpenShift. ื‘ึผึฐืจึดื™ืจึทืช ืžึถื—ื“ึธืœ ืœื”ืคืขื™ืœ ืกืงืจื™ืคื˜ ะธัะฟะพะปัŒะทัƒะตั‚ ืžื•ื“ื•ืœ ืฉื™ืจื•ืช ืœืฉืจืช ืชื•ื›ืŸ ืกื˜ื˜ื™ ื”ืžืžื•ืงื ื‘ืกืคืจื™ื™ืช ื”ืคืœื˜ ื”ืกื˜ื ื“ืจื˜ื™ืช ืœืขื™ืœ.

ืฉื™ื˜ื” ื–ื• ื˜ื•ื‘ื” ืœืคืจื™ืกื” ืžื”ื™ืจื” ืฉืœ ื™ื™ืฉื•ืžื™ื, ืืš ื‘ื“ืจืš ื›ืœืœ ืœื ืžื•ืžืœืฅ ืœื”ื’ื™ืฉ ืชื•ื›ืŸ ืกื˜ื˜ื™ ื‘ืฆื•ืจื” ื–ื•. ื•ื‘ื›ืŸ, ืžื›ื™ื•ื•ืŸ ืฉื‘ืžืฆื™ืื•ืช ืื ื• ืžื’ื™ืฉื™ื ืจืง ืชื•ื›ืŸ ืกื˜ื˜ื™, ืื™ื ื ื• ื–ืงื•ืงื™ื ืœื”ืชืงื ื” ืฉืœ Node.js ื‘ืชื•ืš ื”ืชืžื•ื ื” ืฉืœื ื• - ืฉืจืช ืื™ื ื˜ืจื ื˜ ื™ืกืคื™ืง.

ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื‘ื”ืจื›ื‘ื” ืื ื—ื ื• ืฆืจื™ื›ื™ื ื“ื‘ืจ ืื—ื“, ื‘ื‘ื™ืฆื•ืข ืื ื—ื ื• ืฆืจื™ื›ื™ื ื“ื‘ืจ ืื—ืจ. ื‘ืžืฆื‘ ื–ื”, ืžื‘ื ื” ืžืฉื•ืจืฉืจ ืžื•ืขื™ืœ.

ื‘ื•ื ื” ืžืฉื•ืจืฉืจ

ืขืœ ื–ื” ื”ื ื›ื•ืชื‘ื™ื ื‘ื•ื ื™ื ืžืฉื•ืจืฉืจื™ื ื‘ืชื™ืขื•ื“ ืฉืœ OpenShift:

"ื ื™ืชืŸ ืœืงืฉืจ ืฉื ื™ ืžื›ืœื•ืœื™ื, ื›ืืฉืจ ื”ืื—ื“ ืžื™ื™ืฆืจ ื™ืฉื•ืช ืžื”ื•ื“ืจืช ื•ื”ืฉื ื™ ืžืืจื— ืืช ื”ื™ืฉื•ืช ื”ื–ื• ื‘ืชืžื•ื ื” ื ืคืจื“ืช ื”ืžืฉืžืฉืช ืœื”ืคืขืœืช ื”ื™ืฉื•ืช ื”ื–ื•."

ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช Web App Builder ื›ื“ื™ ืœื”ืคืขื™ืœ ืืช ื”-build ืฉืœื ื•, ื•ืœืื—ืจ ืžื›ืŸ ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช ืฉืจืช ื”ืื™ื ื˜ืจื ื˜, ืื•ืชื” NGINX, ื›ื“ื™ ืœืฉืจืช ืืช ื”ืชื•ื›ืŸ ืฉืœื ื•.

ืœืคื™ื›ืš, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช Web App Builder ื›ื‘ื•ื ื” "ื˜ื”ื•ืจื”" ื•ื‘ืžืงื‘ื™ืœ ืœืงื‘ืœ ืชืžื•ื ืช ื–ืžืŸ ืจื™ืฆื” ืงื˜ื ื”.

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ื–ื” ืขื ื“ื•ื’ืžื” ืกืคืฆื™ืคื™ืช.

ืœื”ื“ืจื›ื” ื ืฉืชืžืฉ ื™ื™ืฉื•ื ืคืฉื•ื˜ ืฉืœ React, ื ื•ืฆืจ ื‘ืืžืฆืขื•ืช ื›ืœื™ ืฉื•ืจืช ื”ืคืงื•ื“ื” create-react-app.

ื–ื” ื™ืขื–ื•ืจ ืœื ื• ืœื—ื‘ืจ ื”ื›ืœ ื‘ื™ื—ื“ ืงื•ื‘ืฅ ืชื‘ื ื™ืช 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'

ืชืกืชื›ืœ ืขืœ ื”ืชืžื•ื ื” ื”ืฉืœื™ืฉื™ืช ื•ื”ืจื‘ื™ืขื™ืช. ืฉืชื™ื”ืŸ ืžื•ื’ื“ืจื•ืช ื›ืชืžื•ื ื•ืช Docker, ื•ื ื™ืชืŸ ืœืจืื•ืช ื‘ื‘ื™ืจื•ืจ ืžืื™ืคื” ื”ืŸ ืžื’ื™ืขื•ืช.

ื”ืชืžื•ื ื” ื”ืฉืœื™ืฉื™ืช ื”ื™ื web-app-builder ื•ื”ื™ื ืžื’ื™ืขื” ืž-nodeshift/ubi8-s2i-web-app ืžืชื•ื™ื’ 10.x ื‘- ืจื›ื–ืช ื“ื•ืงืจ.

ื”ืจื‘ื™ืขื™ืช ื”ื™ื ืชืžื•ื ืช NGINX (ื’ืจืกื” 1.12) ืขื ื”ืชื’ ื”ืื—ืจื•ืŸ ืจื›ื–ืช ื“ื•ืงืจ.

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืฉืชื™ ื”ืชืžื•ื ื•ืช ื”ืจืืฉื•ื ื•ืช. ืฉื ื™ื”ื ืจื™ืงื™ื ื‘ื”ืชื—ืœื” ื•ื ื•ืฆืจื™ื ืจืง ื‘ืฉืœื‘ ื”ื‘ื ื™ื™ื”. ื”ืชืžื•ื ื” ื”ืจืืฉื•ื ื”, react-web-app-builder, ืชื”ื™ื” ืชื•ืฆืื” ืฉืœ ืฉืœื‘ ื”ืจื›ื‘ื” ืฉื™ืฉืœื‘ ืืช ืชืžื•ื ืช ื”-web-app-builder-runtime ื•ืงื•ื“ ื”ืžืงื•ืจ ืฉืœื ื•. ืœื›ืŸ ื”ื•ืกืคื ื• "-ื‘ื•ื ื”" ืœืฉื ื”ืชืžื•ื ื” ื”ื–ื•.

ื”ืชืžื•ื ื” ื”ืฉื ื™ื™ื” - react-web-app-runtime - ืชื”ื™ื” ืชื•ืฆืื” ืฉืœ ืฉื™ืœื•ื‘ ืฉืœ nginx-image-runtime ื•ื›ืžื” ืงื‘ืฆื™ื ืžืชืžื•ื ืช react-web-app-builder. ืชืžื•ื ื” ื–ื• ืชืฉืžืฉ ื’ื ื‘ืžื”ืœืš ื”ืคืจื™ืกื” ื•ืชื›ื™ืœ ืจืง ืืช ืฉืจืช ื”ืื™ื ื˜ืจื ื˜ ื•-HTML ืกื˜ื˜ื™, JavaScript, CSS ืฉืœ ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื•.

ืžึฐื‘ื•ึผืœื‘ึผึธืœ? ืขื›ืฉื™ื• ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืชืฆื•ืจื•ืช ื”ื‘ื ื™ื™ื” ื•ื–ื” ื™ื”ืคื•ืš ืงืฆืช ื™ื•ืชืจ ื‘ืจื•ืจ.

ืœืชื‘ื ื™ืช ืฉืœื ื• ื™ืฉ ืฉืชื™ ืชืฆื•ืจื•ืช ื‘ื ื™ื™ื”. ื”ื ื” ื”ืจืืฉื•ืŸ, ื•ื”ื•ื ื“ื™ ืกื˜ื ื“ืจื˜ื™:

  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 ืื•ืžืจืช ืฉื”ืชื•ืฆืื” ืฉืœ ื”ื‘ื ื™ื™ื” ื”ื–ื• ืชืžื•ืงื ื‘ืื•ืชื” ืชืžื•ื ืช react-web-app-builder ืฉืจืื™ื ื• ืงืฆืช ืงื•ื“ื ื‘ืงื˜ืข ImageStreams.

ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 2 ืื•ืžืจืช ืœืš ืžืื™ืคื” ืœื”ืฉื™ื’ ืืช ื”ืงื•ื“. ื‘ืžืงืจื” ืฉืœื ื•, ื–ื”ื• ืžืื’ืจ git, ื•ื”ืชื™ืงื™ื” ืฉืœ ื”ืžื™ืงื•ื, ื”-ref ื•ืชื™ืงื™ื™ืช ื”ื”ืงืฉืจ ื ืงื‘ืขื™ื ืœืคื™ ื”ืคืจืžื˜ืจื™ื ืฉื›ื‘ืจ ืจืื™ื ื• ืœืžืขืœื”.

ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 3 ื”ื™ื ืžื” ืฉื›ื‘ืจ ืจืื™ื ื• ื‘ืกืขื™ืฃ ื”ืคืจืžื˜ืจื™ื. ื”ื•ื ืžื•ืกื™ืฃ ืืช ืžืฉืชื ื” ื”ืกื‘ื™ื‘ื” OUTPUT_DIR, ืฉื‘ื“ื•ื’ืžื” ืฉืœื ื• ื”ื•ื build.
ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 4 ืื•ืžืจืช ืœื”ืฉืชืžืฉ ื‘ืชืžื•ื ืช ื”-web-app-builder-runtime, ืื•ืชื” ืจืื™ื ื• ื›ื‘ืจ ื‘ืงื˜ืข ImageStream.

ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 5 ืื•ืžืจืช ืฉืื ื—ื ื• ืจื•ืฆื™ื ืœื”ืฉืชืžืฉ ื‘-build ืžืฆื˜ื‘ืจ ืื ืชืžื•ื ืช S2I ืชื•ืžื›ืช ื‘ื–ื”, ื•ืชืžื•ื ืช Web App Builder ื›ืŸ. ื‘ื”ืฉืงื” ื”ืจืืฉื•ื ื”, ืœืื—ืจ ื”ืฉืœืžืช ืฉืœื‘ ื”ื”ืจื›ื‘ื”, ื”ืชืžื•ื ื” ืชืฉืžื•ืจ ืืช ืชื™ืงื™ื™ืช node_modules ืœืงื•ื‘ืฅ ืืจื›ื™ื•ืŸ. ืœืื—ืจ ืžื›ืŸ, ื‘ืจื™ืฆื•ืช ืขื•ืงื‘ื•ืช, ื”ืชืžื•ื ื” ืคืฉื•ื˜ ืชืคืชื— ืืช ื”ืชื™ืงื™ื™ื” ื”ื–ื• ื›ื“ื™ ืœื”ืคื—ื™ืช ืืช ื–ืžืŸ ื”ื‘ื ื™ื™ื”.

ื•ืœื‘ืกื•ืฃ, ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 6 ื”ื™ื ืจืง ื›ืžื” ื˜ืจื™ื’ืจื™ื ื›ื“ื™ ืœื’ืจื•ื ืœื‘ื ื™ื™ื” ืœืคืขื•ืœ ื‘ืื•ืคืŸ ืื•ื˜ื•ืžื˜ื™, ืœืœื ื”ืชืขืจื‘ื•ืช ื™ื“ื ื™ืช, ื›ืืฉืจ ืžืฉื”ื• ืžืฉืชื ื”.

ื‘ืกืš ื”ื›ืœ ืžื“ื•ื‘ืจ ื‘ืชืฆื•ืจืช ื‘ื ื™ื™ื” ื“ื™ ืกื˜ื ื“ืจื˜ื™ืช.

ืขื›ืฉื™ื• ื‘ื•ืื• ื ืกืชื›ืœ ืขืœ ืชืฆื•ืจืช ื”ื‘ื ื™ื™ื” ื”ืฉื ื™ื™ื”. ื–ื” ืžืื•ื“ ื“ื•ืžื” ืœืจืืฉื•ืŸ, ืื‘ืœ ื™ืฉ ื”ื‘ื“ืœ ืื—ื“ ื—ืฉื•ื‘.

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

ืื– ืชืฆื•ืจืช ื”ื‘ื ื™ื™ื” ื”ืฉื ื™ื™ื” ื”ื™ื react-web-app-runtime, ื•ื”ื™ื ืžืชื—ื™ืœื” ื“ื™ ืกื˜ื ื“ืจื˜ื™ืช.

ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 1 ืื™ื ื” ื—ื“ืฉื” - ื”ื™ื ืคืฉื•ื˜ ืื•ืžืจืช ืฉืชื•ืฆืืช ื”ื‘ื ื™ื™ื” ืžื•ื›ื ืกืช ืœืชืžื•ื ืช ืจื™act-web-app-runtime.

ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 2, ื›ืžื• ื‘ืชืฆื•ืจื” ื”ืงื•ื“ืžืช, ืžืฆื™ื™ื ืช ืžืื™ืคื” ืœื”ืฉื™ื’ ืืช ืงื•ื“ ื”ืžืงื•ืจ. ืื‘ืœ ืฉื™ืžื• ืœื‘ ืฉื›ืืŸ ืื ื—ื ื• ืื•ืžืจื™ื ืฉื–ื” ื ืœืงื— ืžื”ืชืžื•ื ื”. ื™ืชืจื” ืžื›ืš, ืžื”ืชืžื•ื ื” ืฉื™ืฆืจื ื• ื–ื” ืขืชื” - ืž-react-web-app-builder (ืžืกื•ืžืŸ ื‘ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 3). ื”ืงื‘ืฆื™ื ืฉืื ื• ืจื•ืฆื™ื ืœื”ืฉืชืžืฉ ื‘ื”ื ื ืžืฆืื™ื ื‘ืชื•ืš ื”ืชืžื•ื ื” ื•ืžื™ืงื•ืžื ืฉื ืžื•ื’ื“ืจ ื‘ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 4, ื‘ืžืงืจื” ืฉืœื ื• ื–ื” /opt/app-root/output/. ืื ืืชื” ื–ื•ื›ืจ, ื›ืืŸ ืžืื•ื—ืกื ื™ื ื”ืงื‘ืฆื™ื ืฉื ื•ืฆืจื• ืขืœ ืกืžืš ืชื•ืฆืื•ืช ื‘ื ื™ื™ืช ื”ืืคืœื™ืงืฆื™ื” ืฉืœื ื•.

ืชื™ืงื™ื™ืช ื”ื™ืขื“ ืฉืฆื•ื™ื ื” ื‘ืžื•ื ื— ืขื ืชื•ื•ื™ืช 5 ื”ื™ื ืคืฉื•ื˜ ื”ืกืคืจื™ื™ื” ื”ื ื•ื›ื—ื™ืช (ื–ื” ื”ื›ืœ, ื–ื›ื•ืจ, ืคื•ืขืœ ื‘ืชื•ืš ืžืฉื”ื• ืงืกื•ื ื‘ืฉื OpenShift, ื•ืœื ื‘ืžื—ืฉื‘ ื”ืžืงื•ืžื™ ืฉืœืš).

ืงื˜ืข ื”ืืกื˜ืจื˜ื’ื™ื” - ืงื• ืฉื›ื•ืชืจืชื• 6 - ื“ื•ืžื” ื’ื ืœืชืฆื•ืจืช ื”ื‘ื ื™ื™ื” ื”ืจืืฉื•ื ื”. ืจืง ืฉื”ืคืขื ืื ื—ื ื• ื”ื•ืœื›ื™ื ืœื”ืฉืชืžืฉ ื‘-nginx-image-runtime, ืฉื›ื‘ืจ ืจืื™ื ื• ื‘ืงื˜ืข ImageStream.

ืœื‘ืกื•ืฃ, ื”ืฉื•ืจื” ืฉื›ื•ืชืจืชื” 7 ื”ื™ื ืงื˜ืข ืฉืœ ื˜ืจื™ื’ืจื™ื ืฉื™ืคืขื™ืœ ืืช ื”ืžื‘ื ื” ื”ื–ื” ื‘ื›ืœ ืคืขื ืฉืชืžื•ื ืช React-Web-App-Builder ืžืฉืชื ื”.

ืื—ืจืช, ื”ืชื‘ื ื™ืช ื”ื–ื• ืžื›ื™ืœื” ืชืฆื•ืจืช ืคืจื™ืกื” ื“ื™ ืกื˜ื ื“ืจื˜ื™ืช, ื›ืžื• ื’ื ื“ื‘ืจื™ื ืฉืงืฉื•ืจื™ื ืœืฉื™ืจื•ืชื™ื ื•ืœืžืกืœื•ืœื™ื, ืื‘ืœ ืœื ื ื™ื›ื ืก ื™ื•ืชืจ ืžื“ื™ ืœืคืจื˜ื™ื. ืฉื™ืžื• ืœื‘ ืฉื”ืชืžื•ื ื” ืฉืชื™ืคืจืก ื”ื™ื ืชืžื•ื ืช ืจื™act-web-app-runtime.

ืคืจื™ืกืช ื™ื™ืฉื•ืžื™ื

ืื– ืขื›ืฉื™ื•, ืœืื—ืจ ืฉื”ืกืชื›ืœื ื• ืขืœ ื”ืชื‘ื ื™ืช, ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ืœื”ืฉืชืžืฉ ื‘ื” ื›ื“ื™ ืœืคืจื•ืก ืืคืœื™ืงืฆื™ื”.

ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ื›ืœื™ ื”ืœืงื•ื— OpenShift ืฉื ืงืจื oc ื›ื“ื™ ืœืคืจื•ืก ืืช ื”ืชื‘ื ื™ืช ืฉืœื ื•:

$ 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.

ื”ืคืงื•ื“ื” ื”ืฉื ื™ื™ื” ืคืฉื•ื˜ ื™ื•ืฆืจืช ื™ื™ืฉื•ื ื—ื“ืฉ ื”ืžื‘ื•ืกืก ืขืœ ืชื‘ื ื™ืช ื–ื•.

ืœืื—ืจ ืฉื”ืคืงื•ื“ื•ืช ื”ืœืœื• ื™ืคืขืœื•, ื ืจืื” ืฉื™ืฉ ืœื ื• ืฉื ื™ ืžื›ืœื•ืœื™ื:

ื™ื™ืฉื•ืžื™ื ืžื•ื“ืจื ื™ื™ื ื‘-OpenShift, ื—ืœืง 2: ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช

ื•ื‘ื—ื–ืจื” ืœืžืกืš ืกืงื™ืจื” ื›ืœืœื™ืช, ื ืจืื” ืืช ื”ืคื•ื“ ืฉื”ื•ืฉืง:

ื™ื™ืฉื•ืžื™ื ืžื•ื“ืจื ื™ื™ื ื‘-OpenShift, ื—ืœืง 2: ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช

ืœื—ืฅ ืขืœ ื”ืงื™ืฉื•ืจ ื•ื ื•ืขื‘ืจ ืœืืคืœื™ืงืฆื™ื” ืฉืœื ื•, ืฉื”ื™ื ื“ืฃ ืืคืœื™ืงืฆื™ื™ืช React ื”ืžื•ื’ื“ืจ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ:

ื™ื™ืฉื•ืžื™ื ืžื•ื“ืจื ื™ื™ื ื‘-OpenShift, ื—ืœืง 2: ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช

ืžื•ืกืฃ 1

ืœืื•ื”ื‘ื™ Angular ื™ืฉ ืœื ื• ื’ื ื™ื™ืฉื•ื ืœื“ื•ื’ืžื”.

ื”ื“ืคื•ืก ื›ืืŸ ื–ื”ื”, ืœืžืขื˜ ื”ืžืฉืชื ื” OUTPUT_DIR.

ืžื•ืกืฃ 2

ื‘ืžืืžืจ ื–ื” ื”ืฉืชืžืฉื ื• ื‘-NGINX ื›ืฉืจืช ืื™ื ื˜ืจื ื˜, ืื‘ืœ ื“ื™ ืงืœ ืœื”ื—ืœื™ืฃ ืื•ืชื• ื‘-Apache, ืคืฉื•ื˜ ืฉื ื” ืืช ื”ืชื‘ื ื™ืช ื‘ืงื•ื‘ืฅ ืชืžื•ื ืช NGINX ืขืœ ืชืžื•ื ืช ืืคืืฆ'ื™.

ืžืกืงื ื”

ื‘ื—ืœืง ื”ืจืืฉื•ืŸ ืฉืœ ืกื“ืจื” ื–ื•, ื”ืจืื™ื ื• ื›ื™ืฆื“ ืœืคืจื•ืก ื‘ืžื”ื™ืจื•ืช ื™ื™ืฉื•ืžื™ ืื™ื ื˜ืจื ื˜ ืžื•ื“ืจื ื™ื™ื ื‘ืคืœื˜ืคื•ืจืžืช OpenShift. ื”ื™ื•ื ื‘ื“ืงื ื• ืžื” ืขื•ืฉื” ืชืžื•ื ื” ืฉืœ ืืคืœื™ืงืฆื™ื™ืช Web ื•ื›ื™ืฆื“ ื ื™ืชืŸ ืœืฉืœื‘ ืื•ืชื” ืขื ืฉืจืช ืื™ื ื˜ืจื ื˜ ื˜ื”ื•ืจ ื›ืžื• NGINX ื‘ืืžืฆืขื•ืช ื‘ื ื™ื™ื” ืžืฉื•ืจืฉืจืช ื›ื“ื™ ืœื™ืฆื•ืจ ื‘ื ื™ื™ืช ืืคืœื™ืงืฆื™ื” ืžื•ื›ื ื” ื™ื•ืชืจ ืœื™ื™ืฆื•ืจ. ื‘ืžืืžืจ ื”ื‘ื ื•ื”ืื—ืจื•ืŸ ื‘ืกื“ืจื” ื–ื•, ื ืจืื” ื›ื™ืฆื“ ืœื”ืคืขื™ืœ ืฉืจืช ืคื™ืชื•ื— ืขื‘ื•ืจ ื”ืืคืœื™ืงืฆื™ื” ืฉืœืš ื‘-OpenShift ื•ืœื”ื‘ื˜ื™ื— ืกื ื›ืจื•ืŸ ืฉืœ ืงื‘ืฆื™ื ืžืงื•ืžื™ื™ื ื•ืžืจื•ื—ืงื™ื.

ืชื•ื›ืŸ ืกื“ืจืช ืžืืžืจื™ื ื–ื•

ืžืฉืื‘ื™ื ื ื•ืกืคื™ื

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”