diff --git a/.github/workflows/continous-integration.yml b/.github/workflows/continous-integration.yml new file mode 100644 index 0000000..6609422 --- /dev/null +++ b/.github/workflows/continous-integration.yml @@ -0,0 +1,174 @@ +name: Continous Integration and Deployment + +on: + push: + branches: + - main + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + DEFAULT_PYTHON_VERSION: '3.9' + POETRY_VERSION: 1.4.2 + +jobs: + train-model: + name: Train model + runs-on: ubuntu-22.04 + + steps: + - name: Checkout git repository 🕝 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + + - name: Setup Python + uses: actions/setup-python@57ded4d7d5e986d7296eab16560982c6dd7c923b + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install poetry 🦄 + uses: Gr1N/setup-poetry@15821dc8a61bc630db542ae4baf6a7c19a994844 + with: + poetry-version: ${{ env.POETRY_VERSION }} + + - name: Load Poetry Cached Libraries ⬇ + id: cache-poetry + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 + with: + path: .venv + key: ${{ runner.os }}-poetry-${{ env.POETRY_VERSION }}-${{ env.DEFAULT_PYTHON_VERSION }}-${{ hashFiles('**/poetry.lock') }} + restore-keys: ${{ runner.os }}-poetry-${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Create virtual environment + if: steps.cache-poetry.outputs.cache-hit != 'true' + run: python -m venv create .venv + + - name: Set up virtual environment + run: poetry config virtualenvs.in-project true + + # Authenticate with gcloud for release registry (where Rasa is published) + - id: "auth-release" + name: Authenticate with gcloud for release registry 🎫 + uses: "google-github-actions/auth@ef5d53e30bbcd8d0836f4288f5e50ff3e086997d" + with: + token_format: 'access_token' + credentials_json: "${{ secrets.RASA_RELEASES_READ }}" + + - name: Configure OAuth token for poetry + run: | + poetry config http-basic.rasa-plus oauth2accesstoken $(gcloud auth print-access-token) + + - name: Install Dependencies 📦 + run: | + make install + + - name: Train model + env: + OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}} + RASA_PRO_LICENSE: ${{secrets.RASA_PRO_LICENSE}} + RASA_PRO_BETA_INTENTLESS: true + run: | + make train + + - name: Upload model to Rasa X + id: upload_model + run: | + cd models + files=(*) + curl -k -F "model=@$files" "https://llm-demo2.rasademo.com/api/projects/default/models?api_token=${{secrets.RASA_X_TOKEN}}" + echo "model=${files%%.*}" >> "$GITHUB_OUTPUT" + + - name: Tag model as production in Rasa X + if: github.ref == 'refs/heads/main' + run: | + curl --request PUT \ + --url https://llm-demo2.rasademo.com/api/projects/default/models/${{steps.upload_model.outputs.model}}/tags/production?api_token=${{secrets.RASA_X_TOKEN}} \ + --header 'content-type: application/json' + + - name: Persist model + uses: actions/upload-artifact@0b7f8abb1508181956e8e162db84b466c27e18ce + with: + name: trained-model + path: models/${{steps.upload_model.outputs.model}}.tar.gz + + run_e2e_tests: + name: Run e2e Tests + runs-on: ubuntu-22.04 + needs: [train-model] + + steps: + - name: Checkout git repository 🕝 + uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c + + - name: Setup Python + uses: actions/setup-python@57ded4d7d5e986d7296eab16560982c6dd7c923b + with: + python-version: ${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Install poetry 🦄 + uses: Gr1N/setup-poetry@15821dc8a61bc630db542ae4baf6a7c19a994844 + with: + poetry-version: ${{ env.POETRY_VERSION }} + + - name: Load Poetry Cached Libraries ⬇ + id: cache-poetry + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 + with: + path: .venv + key: ${{ runner.os }}-poetry-${{ env.POETRY_VERSION }}-${{ env.DEFAULT_PYTHON_VERSION }}-${{ hashFiles('**/poetry.lock') }} + restore-keys: ${{ runner.os }}-poetry-${{ env.DEFAULT_PYTHON_VERSION }} + + - name: Create virtual environment + if: steps.cache-poetry.outputs.cache-hit != 'true' + run: python -m venv create .venv + + - name: Set up virtual environment + run: poetry config virtualenvs.in-project true + + # Authenticate with gcloud for release registry (where Rasa is published) + - id: "auth-release" + name: Authenticate with gcloud for release registry 🎫 + uses: "google-github-actions/auth@ef5d53e30bbcd8d0836f4288f5e50ff3e086997d" + with: + token_format: 'access_token' + credentials_json: "${{ secrets.RASA_RELEASES_READ }}" + + - name: Configure OAuth token for poetry + run: | + poetry config http-basic.rasa-plus oauth2accesstoken $(gcloud auth print-access-token) + + - name: Install Dependencies 📦 + run: | + make install + + - uses: actions/download-artifact@9bc31d5ccc31df68ecc42ccf4149144866c47d8a + with: + name: trained-model + path: models/ + + - name: Init LLM Cache + id: cache-llm + uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 + with: + path: .rasa + key: rasa-llm-cache + + - name: Run e2e passing tests + env: + OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}} + RASA_PRO_LICENSE: ${{secrets.RASA_PRO_LICENSE}} + RASA_PRO_BETA_INTENTLESS: true + run: | + make actions & + make test-passing + + - name: Run e2e failing tests + env: + OPENAI_API_KEY: ${{secrets.OPENAI_API_KEY}} + RASA_PRO_LICENSE: ${{secrets.RASA_PRO_LICENSE}} + RASA_PRO_BETA_INTENTLESS: true + run: | + make actions & + make test-failing | grep '0 passed' \ No newline at end of file