デビルズを通しての旅行-パート3:より高い


これは、ソフトウェア開発を通して私の旅を記録する3部シリーズです.デップスを通しての旅行のために-パート2:覚醒、クリック
このポストは、我々が我々のプロジェクトで使うオートメーションへの洞察です.これはチュートリアルではなく、オートメーションがソフトウェアプロセスを変更できる方法のデモです.

背景


我々は2つのアプリケーションの展開を管理する.我々は、Rasaの自然言語処理の枠組みを介してコンテンツを配信するために必要な場合は、チャットで追跡し、介入チャットChatWootを目指しています.

チャトウット 技術スタック

  • 雲:AWS
  • の配備:ヘルム、Kubernetes(1.21、弾力的なKubernetesサービス)
  • Datastore : postgres , redis ( AWS Managed )
  • Applications : RASA - X ( Python )、ChatWoot ( Ruby on Rails )
  • VCS:gitlab
  • ラサックス セットアップ


    クベルネート


    AWS EKSを使ってアプリケーションを展開します.ポッドは両方のFargateと管理されたノードグループの上で走ります.ChatWootのマイクロサービスはステートレスであるため、Fargateを使用しますが、RASA - X展開では、少数のリソースを必要とする特定のPODに対してノードグループを使用します.

    インフラ


    AWSインフラストラクチャでは、terraformを使います.RIPOは、私たちがCIパイプラインを持っているのではなく、インフラそのものに集中することを可能にする地形形態雲へのバージョン管理システムとして接続されています.


    私たちは の両方のためのヘルムチャートを使用しています.ヘルム私たちは、更新のたびに変更を必要とする多くのYAMLファイルの代わりにアプリケーションを展開する標準的な方法を持つことができます.

    ラサックス 自動化


    その自然による自動化は、直感的です.我々が従う親指の一般的な規則は、特定のタスクが3回以上行われるなら、それを自動化するのが最善です.
    軽量コンポーネントから始めましょう.

    チャトウット チャトウット


    ChatWootはオープンソースプロジェクトであり、ChatWootに多くのカスタムコードを追加しないので、ChatWoot用のCI/CDパイプラインの必要性はありません.すべての更新プログラムを実行するのは簡単ですhelm upgrade <release-name> chatwoot/chatwoot

    インフラ


    テララ雲を使用しているので、これも非常に簡単です.我々はパイプラインで局所的に地形を使用することを検討したが、これは私たちのチームが小さいと考えてオーバーヘッドだった.Terraformの実行のためにterraform雲を使用して、terraform状態を単独で格納することができることに注意してください.

    ラサックス


    これは繰り返しの最大数を含むコンポーネントですので、完全に自動化されます.
    RASA - Xにはいくつかのコンポーネントがありますが、RasaオープンソースやRasaカスタムアクションサーバーなどの重要なものに焦点を当てます.前者はRasaのNLP部分です、そして、後者はあなたがあなたのchatbotのカスタムイベントをデータベースからデータを取り入れることのように走らせるPythonサーバーです.chatbotsは反復的であるので、我々は前進する前にこのプロセスを自動化することが不可欠であった.

    シー・シーディー


    この部分は、繰り返しNLPモデルを訓練し、それらをテストする必要があります.したがって、gitlab CIパイプラインを使用してモデルを訓練し、その後、それをテストし、アーチファクトとして結果をアップロードします.
    
    build-actions:
      image: docker:20.10.7
      stage: build
      services:
        - docker:20.10.7-dind
      script:
        - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
        - chmod +x ./ci.sh
        - ./ci.sh
    
    train-job:       
      stage: train
      script:
        - rasa train --fixed-model-name $CI_COMMIT_SHORT_SHA
      artifacts:
        paths:
          - models/
        expire_in: 1 day
    
    data-validate-job:  
      stage: validate    
      script:
        - rasa data validate
    
    core-test-job:   
      stage: test    
      script:
        - rasa test core --model models/ --stories test/ --out results
    
    nlu-test-job:   
      stage: test    
      script:
        - rasa test nlu --nlu data/nlu.yml --cross-validation
    
    upload-job:
      stage: report
      script:
        - echo "Upload results"
      artifacts:
        paths:
          - results/
    
    これは2つの部分に分けることができます.カスタムアクションサーバー部分とRasaボット.
    カスタムアクションは、Pythonのサーバーですので、簡単に開発と標準化を可能にするDockerize.“./ci . sh”は、環境変数からブランチ名を読んで、それに応じてDockerイメージタグを設定するためのシェルスクリプトです.
    このパイプラインの次の部分では、モデルを訓練し、衝突やエラーのモデルを検証し、最終的にテストを実行します.すべてのテストは、パイプラインのアーチファクトとしてアップロードされます.これにより、すべてのモデルと反復をログ出力できます.固定モデル名タグは、モデルがパイプラインでさらに使用できる予測可能な名前を持つことを保証することです.rasaデフォルトではタイムスタンプを使用できません.

  • メイン:
    これは、生産を表す枝ですので、ここに存在するコードのすべての部分は、バトルテストされ、検証されます.したがって、このブランチへのすべてのプッシュで、我々はサーバーでNLPモデルをアップデートすることができると仮定するのは安全です.
  • カスタムアクションのためのDockerタグ:安定
    deploy-job: 
      stage: deploy 
      #before_script: []
      #image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest  # see the note below
      script:
        - apt-get update
        #- apt install git-all -y
        - curl -k -F "model=@models/$CI_COMMIT_SHORT_SHA.tar.gz" "http://rasax-url.com/api/projects/default/models?api_token=$RASAXTOKEN"
        - echo "Application successfully deployed."
        - aws eks update-kubeconfig --name ${EKS_CLUSTER_NAME}
        - curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
        - helm plugin install https://github.com/rimusz/helm-tiller --kubeconfig=$HOME/.kube/kubeconfig
        - helm repo add rasa-x https://rasahq.github.io/rasa-x-helm  
        - helm upgrade rasa rasa-x/rasa-x -n rasa --set app.name=$CI_REGISTRY/weunlearn/wulu2.0/rasa_actions --set "app.tag=stable" --reuse-values   # Redeploys the kubernetes deployment with a new image name while reusing already existing values      
    
      rules:
        - if: '$CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH == "main"'
    
    イベントがプッシュイベントであり、コミットされたブランチがメインのときのみ実行されるGitLabパイプラインのこの段階.これは、様々な他のブランチの微調整のためのモデルトレーニングの不要なトリガを防止します.
  • 現像
    これが非生産環境であるので、このブランチからの配備はありません.前のセクションからの展開ステージは実行されません.しかし、このブランチはメインブランチで生産コードを更新する前に参照点となるので、静的な名前を持ちます.
  • テスト結果は、前にアップロードされます.これにより、すべてのモデル反復を追跡できます.
    カスタムアクションのためのDockerタグ

    ワークフロー


    非メインブランチにプッシュします。



    メインに押す


    パイプラインは、最終ステージを除いて前と同じです

    結論


    このセットアップは、品質管理を実行するための標準化された方法を確保しながら、我々の生産環境で複数のアプリケーションを管理する2人の技術チームを可能にします.現在、技術チームのゴールは問題を解決して、製品を構築することです.