From 240a9feecf1edd1e11f8a04209a4e7a1b5a76e2e Mon Sep 17 00:00:00 2001 From: in4margaret Date: Thu, 13 Feb 2020 21:10:44 -0500 Subject: [PATCH] Added Github Actions example --- README.md | 1 + docs/NLUGitHubActions.md | 78 ++++++++++++++++++++++ docs/images/compareResults.PNG | Bin 0 -> 6749 bytes docs/images/credentials.PNG | Bin 0 -> 39141 bytes models/utterancesTest.json | 27 ++++++++ pipelines/.github/workflows/nlugithub.yml | 50 ++++++++++++++ 6 files changed, 156 insertions(+) create mode 100644 docs/NLUGitHubActions.md create mode 100644 docs/images/compareResults.PNG create mode 100644 docs/images/credentials.PNG create mode 100644 models/utterancesTest.json create mode 100644 pipelines/.github/workflows/nlugithub.yml diff --git a/README.md b/README.md index 5dc8903..9f82ac8 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,7 @@ Detailed information on the CLI tool sub-commands and arguments can be found in - [Dialogflow endpoint configuration](docs/DialogflowEndpointConfiguration.md) - [Configuring LUIS CI/CD with Azure Pipelines](docs/AzurePipelines.md) - [Extending the CLI to new NLU providers](docs/CliExtensions.md) +- [GitHub Actions workflow using NLU.DevOps cli tool](docs/NLUGitHubActions.md) ## Contributing diff --git a/docs/NLUGitHubActions.md b/docs/NLUGitHubActions.md new file mode 100644 index 0000000..fd37bcd --- /dev/null +++ b/docs/NLUGitHubActions.md @@ -0,0 +1,78 @@ +## GitHub Actions workflow using NLU.DevOps CLI tool + +This document covers setting up a CI pipeline for LUIS using GitHub Actions and NLU.DevOps. +The workflow will be the following:  +1. create, train, publish the LUIS model using sample utterances +2. send a test set to created LUIS model +3. evaluate model by comparing results received from LUIS with expected values +4. delete the model from the portal + +Supply a name for the action and set it up to trigger on pull requests. + +``` +name: CINLU + +on: [pull_request] +``` + +1. Install NLU.DevOps CLI tool on GitHub agent. + +``` + - name: Install dotnet-nlu + run: dotnet tool install -g dotnet-nlu +``` +For Ubuntu agents, you need to prepend a directory to the system PATH variable for all subsequent actions in the current job to make sure that CLI tool works. More about this command [here](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/development-tools-for-github-actions#add-a-system-path-add-path). + +``` + - name: Path + run: echo "::add-path::$HOME/.dotnet/tools" +``` +We use [utterances.json](../models/utterances.json) for training. You can replace this file with another file that consists of intents, utterances, entities that you need for your own model. +More about the format of this file [here](https://github.com/microsoft/NLU.DevOps/blob/master/docs/GenericUtterances.md). +To train your model we should add the following: + +``` +- name: Train Luis model + run: dotnet nlu train -s luis -u utterances.json --save-appsettings + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} + ``` + +More about the command [here](https://github.com/microsoft/NLU.DevOps/blob/master/docs/Train.md).  +Before you push to the repo, you need to add credentials (at least luisAuthoringKey and luisAuthoringRegion are required) to your GitHub Secrets. For example, +![credentials](./images/credentials.png) + +Check out the [LUIS docs](https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-how-to-azure-subscription) for more information on where to find your authoring or runtime keys. + +2. To test LUIS model let's use [utterancesTest.json](../models/utterancesTest.json) file. +We can save the result in results.json. During the training step, we may have created a new LUIS application. By using the `--save-appsettings` flag, the LUIS application ID is stored locally in a settings file that is picked up by subsequent NLU.DevOps CLI commands. + +Yaml may look like that: +``` + - name: Test Luis model + run: dotnet nlu test -s luis -u utterancesTest.json -o results.json + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} +``` +3. We use the `compare` command from the NLU.DevOps CLI to evaluate the results. The expected intents and entities in this case are given in the `utterancesTest.json` file, while the results predicted by the LUIS model are in the `results.json` file. + +``` + - name: Compare Luis model + run: dotnet nlu compare -e utterancesTest.json -a results.json +``` + +If you open your GitHub workflow run step for this command in the console, you can see something similar to +![compareResults](./images/compareResults.png) + +4. When you work on several hypotheses, sometimes you need only to get results and you don't want to keep the model. It is possible to delete the model in the same pipeline after you get results. +``` + - name: Delete Luis model + run: dotnet nlu clean -s luis + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} +``` + +You can find GitHub Action workflow yaml file [here](../pipelines/.github/workflows/nlugithub.yml). diff --git a/docs/images/compareResults.PNG b/docs/images/compareResults.PNG new file mode 100644 index 0000000000000000000000000000000000000000..1f6cece7a9d415d71437ad6488dbc48d669b70cd GIT binary patch literal 6749 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 literal 0 HcmV?d00001 diff --git a/docs/images/credentials.PNG b/docs/images/credentials.PNG new file mode 100644 index 0000000000000000000000000000000000000000..2c60a05fa63636b1cf50860de35a03cb3533a6fa GIT binary patch literal 39141 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 bc>TTKcgMHv=T7ZxkW)Ne{an^LB{Ts5Z3Co* literal 0 HcmV?d00001 diff --git a/models/utterancesTest.json b/models/utterancesTest.json new file mode 100644 index 0000000..90326b0 --- /dev/null +++ b/models/utterancesTest.json @@ -0,0 +1,27 @@ +[ + { + "text": "start playing music", + "intent": "PlayMusic" + }, + { + "text": "play music", + "intent": "PlayMusic" + }, + { + "text": "listen to hip hop", + "intent": "PlayMusic" + }, + { + "text": "is it cold out", + "intent": "None" + }, + { + "text": "how many days until Christmas", + "intent": "None" + }, + { + "text": "what's the weather like", + "intent": "None" + } + ] + \ No newline at end of file diff --git a/pipelines/.github/workflows/nlugithub.yml b/pipelines/.github/workflows/nlugithub.yml new file mode 100644 index 0000000..3a345f5 --- /dev/null +++ b/pipelines/.github/workflows/nlugithub.yml @@ -0,0 +1,50 @@ +name: CINLU + +on: [pull_request] + +jobs: + build: + name: NLU workflow + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v1 + + - name: Setup .NET Core + uses: actions/setup-dotnet@v1 + with: + dotnet-version: 2.2.108 + + - name: Install dotnet-nlu + run: dotnet tool install -g dotnet-nlu + + - name: Path + run: echo "::add-path::$HOME/.dotnet/tools" + + - name: Train Luis model + run: dotnet nlu train -s luis -u utterances.json --save-appsettings + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} + + - name: Test Luis model + run: dotnet nlu test -s luis -u utterancesTest.json -o results.json + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} + + - name: Compare Luis model + run: dotnet nlu compare -e utterancesTest.json -a results.json + + - name: Archive TestResult + uses: actions/upload-artifact@v1 + with: + name: TestResult + path: TestResult.xml + + - name: Delete Luis model + run: dotnet nlu clean -s luis + env: + luisAuthoringRegion: ${{ secrets.luisAuthoringRegion }} + luisAuthoringKey: ${{ secrets.luisAuthoringKey }} + \ No newline at end of file