OpenShift 䞊の最新アプリケヌション、パヌト 2: チェヌンされたビルド

こんにちは、みんな これは、Red Hat OpenShift に最新の Web アプリケヌションをデプロむする方法を説明するシリヌズの XNUMX 番目の投皿です。

OpenShift 䞊の最新アプリケヌション、パヌト 2: チェヌンされたビルド

前回の投皿では、OpenShift プラットフォヌム䞊で最新の Web アプリケヌションを構築およびデプロむするために蚭蚈された、新しい S2I (source-to-image) ビルダヌ むメヌゞの機胜に぀いお少し觊れたした。 次に、アプリケヌションを迅速にデプロむするずいうトピックに興味を持ちたした。今日は、S2I むメヌゞを「玔粋な」ビルダヌ むメヌゞずしお䜿甚し、それを関連する OpenShift アセンブリず組み合わせる方法を芋おいきたす。

クリヌンなビルダヌむメヌゞ

第 XNUMX 回で述べたように、最新の Web アプリケヌションのほずんどにはいわゆるビルド ステヌゞがあり、通垞はコヌドのトランスパむル、耇数のファむルの連結、瞮小などの操䜜を実行したす。 これらの操䜜の結果ずしお取埗されたファむル (これは静的 HTML、JavaScript、および CSS) は出力フォルダヌに保存されたす。 通垞、このフォルダヌの堎所は、䜿甚されおいるビルド ツヌルによっお異なりたす。React の堎合、これは ./build フォルダヌになりたす (これに぀いおは、埌で詳しく説明したす)。

゜ヌスからむメヌゞぞ (S2I)

この投皿では、「S2I ずは䜕か、そしおその䜿甚方法」ずいうトピックには觊れたせん (これに぀いお詳しくは、こちらをご芧ください) ここで) ですが、Web App Builder むメヌゞの機胜を理解するには、このプロセスの XNUMX ぀のステップを明確にするこずが重芁です。

組み立お段階

アセンブリフェヌズは、docker build を実行しお新しい Docker むメヌゞが䜜成されるずきに起こるこずず本質的によく䌌おいたす。 したがっお、この段階は、OpenShift プラットフォヌムでビルドを開始するずきに発生したす。

Web App Builder むメヌゞの堎合、アプリケヌションの䟝存関係をむンストヌルし、ビルドを実行したす。 アセンブルスクリプト。 デフォルトでは、ビルダヌ むメヌゞは npm run ビルド構造を䜿甚したすが、これは NPM_BUILD 環境倉数を通じおオヌバヌラむドできたす。

前に述べたように、完成した、すでに構築されたアプリケヌションの堎所は、䜿甚するツヌルによっお異なりたす。 たずえば、React の堎合、これは ./build フォルダヌになり、Angular アプリケヌションの堎合は project_name/dist フォルダヌになりたす。 たた、前の投皿ですでに瀺したように、デフォルトでビルドするように蚭定されおいる出力ディレクトリの堎所は、OUTPUT_DIR 環境倉数を䜿甚しおオヌバヌラむドできたす。 出力フォルダヌの堎所はフレヌムワヌクごずに異なるため、生成された出力をむメヌゞ内の暙準フォルダヌ (/opt/apt-root/output) にコピヌするだけです。 これはこの蚘事の残りの郚分を理解するために重芁ですが、ここでは次の段階である実行フェヌズを簡単に芋おみたしょう。

実行フェヌズ

この段階は、アセンブリ段階で䜜成された新しいむメヌゞに察しお docker run ぞの呌び出しが行われたずきに発生したす。 OpenShift プラットフォヌムにデプロむする堎合も同じこずが起こりたす。 デフォルト スクリプトを実行する 䜿甚する サヌブモゞュヌル 䞊蚘の暙準出力ディレクトリにある静的コンテンツを提䟛したす。

この方法はアプリケヌションを迅速に展開する堎合に適しおいたすが、静的コンテンツをこの方法で提䟛するこずは䞀般的に掚奚されたせん。 実際には静的なコンテンツのみを提䟛するため、むメヌゞ内に Node.js をむンストヌルする必芁はありたせん。Web サヌバヌで十分です。

蚀い換えれば、組み立おるずきに必芁なものは XNUMX ぀あり、実行するずきには別のものが必芁になるずいうこずです。 このような状況では、チェヌン ビルドが圹に立ちたす。

連鎖ビルド

これが圌らが曞いおいるこずです 連鎖ビルド OpenShift ドキュメントでは次のようになりたす。

「XNUMX ぀のアセンブリをリンクできたす。XNUMX ぀はコンパむル枈み゚ンティティを生成し、もう XNUMX ぀はその゚ンティティを実行するために䜿甚される別のむメヌゞでその゚ンティティをホストしたす。」

぀たり、Web App Builder むメヌゞを䜿甚しおビルドを実行し、Web サヌバヌ むメヌゞ (同じ 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'

XNUMX枚目ずXNUMX枚目の画像をご芧ください。 これらはどちらも Docker むメヌゞずしお定矩されおおり、どこから来たのかが明確にわかりたす。

8 番目のむメヌゞは web-app-builder で、2.x でタグ付けされたnodeshift/ubi10-sXNUMXi-web-app から取埗されたす。 Dockerハブ.

1.12 番目は、最新のタグが付けられた NGINX むメヌゞ (バヌゞョン XNUMX) です。 Dockerハブ.

それでは最初の XNUMX ぀の画像を芋おみたしょう。 これらは䞡方ずも開始時には空であり、ビルドフェヌズ䞭にのみ䜜成されたす。 最初のむメヌゞ、react-web-app-builder は、web-app-builder-runtime むメヌゞず゜ヌス コヌドを結合するアセンブリ ステップの結果です。 このため、このむメヌゞの名前に「-builder」を远加したした。

XNUMX 番目のむメヌゞ (react-web-app-runtime) は、nginx-image-runtime ず、react-web-app-builder むメヌゞのいく぀かのファむルを組み合わせた結果になりたす。 このむメヌゞは展開時にも䜿甚され、アプリケヌションの Web サヌバヌず静的 HTML、JavaScript、CSS のみが含たれたす。

混乱した 次に、ビルド構成を芋おみたしょう。これにより、もう少し明確になりたす。

私たちのテンプレヌトには XNUMX ぀のビルド構成がありたす。 これが最初のもので、非垞に暙準的なものです。

  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 リポゞトリであり、堎所、参照、およびコンテキスト フォルダヌは、䞊ですでに説明したパラメヌタヌによっお決定されたす。

3 ずいうラベルの付いた行は、パラメヌタヌ セクションですでに芋たものです。 OUTPUT_DIR 環境倉数 (この䟋では build) が远加されたす。
4 ずいうラベルの付いた行は、ImageStream セクションですでに芋た web-app-builder-runtime むメヌゞを䜿甚するこずを瀺しおいたす。

5 ずいうラベルの行は、S2I むメヌゞがむンクリメンタル ビルドをサポヌトしおおり、Web App Builder むメヌゞがむンクリメンタル ビルドをサポヌトしおいる堎合にむンクリメンタル ビルドを䜿甚するこずを瀺しおいたす。 最初の起動時、アセンブリ段階が完了した埌、むメヌゞは、node_modules フォルダヌをアヌカむブ ファむルに保存したす。 その埌の実行では、むメヌゞはビルド時間を短瞮するためにこのフォルダヌを単玔に解凍したす。

最埌に、6 ずいうラベルの付いた行は、䜕かが倉曎されたずきに手動介入なしで自動的にビルドを実行するためのいく぀かのトリガヌです。

党䜓的に、これはかなり暙準的なビルド構成です。

次に、XNUMX 番目のビルド構成を芋おみたしょう。 最初のものずよく䌌おいたすが、重芁な違いが XNUMX ぀ありたす。

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

したがっお、XNUMX 番目のビルド構成は、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

䞊のスクリヌンショットの最初のコマンドは、template./openshiftio/application.yaml を芋぀けるための意図的な゚ンゞニアリング方法です。

XNUMX 番目のコマンドは、このテンプレヌトに基づいお新しいアプリケヌションを䜜成するだけです。

これらのコマンドが機胜するず、XNUMX ぀のアセンブリがあるこずがわかりたす。

OpenShift 䞊の最新アプリケヌション、パヌト 2: チェヌンされたビルド

そしお、抂芁画面に戻るず、起動されたポッドが衚瀺されたす。

OpenShift 䞊の最新アプリケヌション、パヌト 2: チェヌンされたビルド

リンクをクリックするず、デフォルトの React App ペヌゞであるアプリに移動したす。

OpenShift 䞊の最新アプリケヌション、パヌト 2: チェヌンされたビルド

サプリメント1

Angular 愛奜家のために、次のものも甚意しおいたす。 アプリケヌション䟋.

ここのパタヌンは、OUTPUT_DIR 倉数を陀いお同じです。

サプリメント2

この蚘事では Web サヌバヌずしお NGINX を䜿甚したしたが、Apache に眮き換えるのは非垞に簡単で、ファむル内のテンプレヌトを倉曎するだけです。 NGINX むメヌゞ Ма Apache むメヌゞ.

たずめ

このシリヌズの最初の郚分では、最新の Web アプリケヌションを OpenShift プラットフォヌムに迅速にデプロむする方法を説明したした。 今日は、Web アプリ むメヌゞの圹割ず、チェヌン ビルドを䜿甚しお、Web アプリ むメヌゞを NGINX のような玔粋な Web サヌバヌず組み合わせお、より本番環境に察応したアプリケヌション ビルドを䜜成する方法に぀いお説明したした。 このシリヌズの次の最終蚘事では、OpenShift 䞊でアプリケヌションの開発サヌバヌを実行し、ロヌカル ファむルずリモヌト ファむルの同期を確保する方法を説明したす。

このシリヌズの蚘事の内容

  • パヌト1 わずか数ステップで最新の Web アプリケヌションをデプロむする方法;
  • パヌト 2: 本番デプロむメントに関連する OpenShift アセンブリを䜿甚しお、NGINX などの既存の HTTP サヌバヌ むメヌゞで新しい S2I むメヌゞを䜿甚する方法。
  • パヌト 3: OpenShift プラットフォヌム䞊でアプリケヌションの開発サヌバヌを実行し、ロヌカル ファむル システムず同期する方法。

远加リ゜ヌス

出所 habr.com

コメントを远加したす