-
Notifications
You must be signed in to change notification settings - Fork 9
284 lines (241 loc) · 10 KB
/
integration_test.yml
File metadata and controls
284 lines (241 loc) · 10 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
# SPDX-FileCopyrightText: Nextcloud contributors
# SPDX-License-Identifier: AGPL-3.0-or-later
name: Integration test
on:
pull_request:
push:
branches:
- main
- stable*
env:
APP_NAME: context_agent
concurrency:
group: integration-test-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
transcription:
runs-on: ubuntu-22.04
strategy:
# do not stop on another job's failure
fail-fast: false
matrix:
php-versions: [ '8.2' ]
databases: [ 'sqlite' ]
server-versions: [ 'master', 'stable33', 'stable32', 'stable31' ]
name: Integration test on ☁️${{ matrix.server-versions }} 🐘${{ matrix.php-versions }}
env:
MYSQL_PORT: 4444
PGSQL_PORT: 4445
PYTHONUNBUFFERED: 1
APP_HOST: 0.0.0.0
APP_SECRET: 12345
COMPUTE_DEVICE: CPU
NEXTCLOUD_URL: http://localhost:8080
services:
mysql:
image: mariadb:10.5
ports:
- 4444:3306/tcp
env:
MYSQL_ROOT_PASSWORD: rootpassword
options: --health-cmd="mysqladmin ping" --health-interval 5s --health-timeout 2s --health-retries 5
postgres:
image: postgres
ports:
- 4445:5432/tcp
env:
POSTGRES_USER: root
POSTGRES_PASSWORD: rootpassword
POSTGRES_DB: nextcloud
options: --health-cmd pg_isready --health-interval 5s --health-timeout 2s --health-retries 5
steps:
- name: Checkout server
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
repository: nextcloud/server
submodules: 'true'
ref: ${{ matrix.server-versions }}
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@accd6127cb78bee3e8082180cb391013d204ef9f # v2.37.0
with:
php-version: ${{ matrix.php-versions }}
tools: phpunit
extensions: mbstring, iconv, fileinfo, intl, sqlite, pdo_mysql, pdo_sqlite, pgsql, pdo_pgsql, gd, zip
- name: Checkout llm2 app
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: llm2
repository: nextcloud/llm2
ref: main
persist-credentials: false
- name: Get app version
id: llm2_appinfo
uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master
with:
filename: llm2/appinfo/info.xml
expression: "/info/version/text()"
- name: Checkout app
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: ${{ env.APP_NAME }}
persist-credentials: false
- name: Get app version
id: context_agent_appinfo
uses: skjnldsv/xpath-action@7e6a7c379d0e9abc8acaef43df403ab4fc4f770c # master
with:
filename: ${{ env.APP_NAME }}/appinfo/info.xml
expression: "/info/version/text()"
- name: Set up Nextcloud
if: ${{ matrix.databases != 'pgsql'}}
run: |
sleep 25
mkdir data
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$MYSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
composer run serve &
- name: Set up Nextcloud
if: ${{ matrix.databases == 'pgsql'}}
run: |
sleep 25
mkdir data
./occ maintenance:install --verbose --database=${{ matrix.databases }} --database-name=nextcloud --database-host=127.0.0.1 --database-port=$PGSQL_PORT --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
composer run serve &
- name: Create user
run: |
export OC_PASS='alice'
./occ user:add --password-from-env alice
- name: Checkout app_api
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
path: apps/app_api
repository: nextcloud/app_api
ref: ${{ matrix.server-versions == 'master' && 'main' || matrix.server-versions }}
persist-credentials: false
- name: Enable app and app_api
run: ./occ app:enable -vvv -f app_api
- name: Register manual deploy daemon
run: |
./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080
- name: Setup python 3.11
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 #v6.2.0
with:
python-version: '3.11'
- name: Install llm2 app
working-directory: llm2
run: |
sudo apt-get update
sudo apt install pipx
pipx install poetry
poetry install
- name: Init llm2
working-directory: llm2/lib
env:
APP_ID: llm2
APP_PORT: 9080
APP_VERSION: ${{ fromJson(steps.llm2_appinfo.outputs.result).version }}
run: |
poetry run python3 main.py > ../logs 2>&1 &
- name: Register backend
run: |
./occ app_api:app:register llm2 manual_install --json-info "{\"appid\":\"llm2\",\"name\":\"Local large language model\",\"daemon_config_name\":\"manual_install\",\"version\":\"${{ fromJson(steps.llm2_appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":9080,\"scopes\":[\"AI_PROVIDERS\", \"TASK_PROCESSING\"],\"system_app\":0}" --force-scopes --wait-finish
- name: Install context_agent app
working-directory: ${{ env.APP_NAME }}
run: |
sudo apt install pipx
pipx install poetry
poetry install
- name: Init context_agent
working-directory: ${{ env.APP_NAME }}/ex_app/lib/
env:
APP_ID: ${{ env.APP_NAME }}
APP_PORT: 9081
APP_VERSION: ${{ fromJson(steps.context_agent_appinfo.outputs.result).version }}
run: |
PYTHONPATH="$(pwd)/../.." poetry run python3 main.py > ../../logs 2>&1 &
- name: Register backend
run: |
./occ app_api:app:register context_agent manual_install --json-info \
"$(jq -nc \
--arg version "${{ fromJson(steps.context_agent_appinfo.outputs.result).version }}" \
'{
appid: "context_agent",
name: "Nextcloud Assistant Context Agent",
daemon_config_name: "manual_install",
version: $version,
secret: "12345",
port: 9081,
scopes: ["AI_PROVIDERS", "TASK_PROCESSING"],
system_app: 0,
routes: [
{
url: "mcp",
verb: "POST,GET,DELETE",
access_level: 1,
headers_to_exclude: "[]"
}
]
}'
)" --force-scopes --wait-finish
- name: Verify MCP tool discovery includes async calendar tools
env:
CREDS: "alice:alice"
run: |
set -euo pipefail
MCP_URL="http://localhost:8080/index.php/apps/app_api/proxy/context_agent/mcp/"
CREDS=$(OC_PASS=alice ./occ user:add-app-password --password-from-env alice | tail -n 1)
sleep 300
ATTEMPT=0
until [ "$ATTEMPT" -ge 20 ]; do
TOOLS_RESPONSE=$(curl -sS -w "\n%{http_code}" \
-H "Authorization: Bearer $CREDS" \
-H "Accept: application/json, text/event-stream" \
-H "Content-Type: application/json" \
-H "oCS-APIRequest: true" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}' \
"$MCP_URL")
STATUS=$(echo "$TOOLS_RESPONSE" | tail -1)
BODY=$(echo "$TOOLS_RESPONSE" | sed '$d')
if [ "$STATUS" = "200" ]; then
break
fi
ATTEMPT=$((ATTEMPT + 1))
echo "tools/list attempt $ATTEMPT failed with status=$STATUS, retrying..."
echo "$BODY"
sleep 3
done
[ "$STATUS" = "200" ]
echo "$BODY"
echo "$BODY" | grep -q 'list_calendars'
- name: Run task
env:
CREDS: "alice:alice"
run: |
TASK=$(curl -X POST -u "$CREDS" -H "oCS-APIRequest: true" -H "Content-type: application/json" http://localhost:8080/ocs/v2.php/taskprocessing/schedule?format=json --data-raw '{"input": {"input": "List the files I have in Nextcloud", "confirmation":1, "conversation_token": ""},"type":"core:contextagent:interaction", "appId": "test", "customId": ""}')
echo $TASK
TASK_ID=$(echo $TASK | jq '.ocs.data.task.id')
NEXT_WAIT_TIME=0
TASK_STATUS='"STATUS_SCHEDULED"'
until [ $NEXT_WAIT_TIME -eq 80 ] || [ "$TASK_STATUS" == '"STATUS_SUCCESSFUL"' ] || [ "$TASK_STATUS" == '"STATUS_FAILED"' ]; do
TASK=$(curl -u "$CREDS" -H "oCS-APIRequest: true" http://localhost:8080/ocs/v2.php/taskprocessing/task/$TASK_ID?format=json)
echo $TASK
TASK_STATUS=$(echo $TASK | jq '.ocs.data.task.status')
echo $TASK_STATUS
echo "Sleeping for $NEXT_WAIT_TIME seconds"
sleep $(( NEXT_WAIT_TIME++ ))
done
curl -u "$CREDS" -H "oCS-APIRequest: true" http://localhost:8080/ocs/v2.php/taskprocessing/task/$TASK_ID?format=json
[ "$TASK_STATUS" == '"STATUS_SUCCESSFUL"' ]
echo $TASK | jq '.ocs.data.task.output.output'
echo $TASK | jq '.ocs.data.task.output.sources'
echo $TASK | jq '.ocs.data.task.output.sources' | grep -q 'get_folder_tree'
- name: Show nextcloud logs
if: always()
run: |
tail data/nextcloud.log
- name: Show context_chat logs
if: always()
run: |
[ -f ${{ env.APP_NAME }}/logs ] && cat ${{ env.APP_NAME }}/logs || echo "No context_chat logs"
- name: Show llm2 logs
if: always()
run: |
[ -f llm2/logs ] && cat llm2/logs || echo "No llm2 logs"