Repository navigation
222 lines (194 loc) · 8.96 KB
/
Copy pathintegration_test.yml
File metadata and controls
222 lines (194 loc) · 8.96 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
# 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: llm2
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.3' ]
databases: [ 'sqlite' ]
server-versions: [ 'master', 'stable34', 'stable33', 'stable32', 'stable31', 'stable30' ]
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_ID: llm2
APP_PORT: 9080
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@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
repository: nextcloud/server
ref: ${{ matrix.server-versions }}
submodules: recursive
- name: Set up php ${{ matrix.php-versions }}
uses: shivammathur/setup-php@f3e473d116dcccaddc5834248c87452386958240 # v2.37.2
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 app
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
with:
path: ${{ env.APP_NAME }}
persist-credentials: false
- name: Get app version
id: appinfo
uses: skjnldsv/xpath-action@f5b036e9d973f42c86324833fd00be90665fbf77 # v1.0.0
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: Checkout app_api
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
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: Setup python 3.10
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: '3.13'
cache: 'pip'
cache-dependency-path: context_chat_backend/requirements.txt
- name: Install app
working-directory: ${{ env.APP_NAME }}
run: |
sudo apt install pipx
pipx install poetry
poetry install
# pyproject.toml pins xllamacpp to the cu128 wheel, which needs libcuda.so.1 at import
# time. The CI runner has no NVIDIA driver, so we swap in the PyPI CPU build for tests.
poetry run pip install --force-reinstall --no-deps xllamacpp
- name: Cache llm2 models
uses: actions/cache/restore@v6
id: cache-llm2-models-restore
env:
cache-name: cache-llm2-models
with:
path: llm2-persistent_storage/
key: ${{ runner.os }}-llm2-models-${{ env.cache-name }}-${{ hashFiles('llm2/lib/main.py') }}
- name: Install and init backend
working-directory: ${{ env.APP_NAME }}/lib
env:
APP_VERSION: ${{ fromJson(steps.appinfo.outputs.result).version }}
run: |
mkdir -p "$(pwd)/../../llm2-persistent_storage/"
APP_PERSISTENT_STORAGE="$(pwd)/../../llm2-persistent_storage/" poetry run python3 main.py > ../backend_logs 2>&1 &
- name: Register backend
run: |
./occ app_api:daemon:register --net host manual_install "Manual Install" manual-install http localhost http://localhost:8080
./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.appinfo.outputs.result).version }}\",\"secret\":\"12345\",\"port\":9080,\"scopes\":[\"AI_PROVIDERS\", \"TASK_PROCESSING\"],\"system_app\":0}" --force-scopes --wait-finish
- name: Run task
env:
CREDS: "admin:password"
run: |
set -x
sleep 300
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": "Hello World"},"type":"core:text2text", "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 35 ] || [ "$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
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"' ]
- name: Cache llm2 models
uses: actions/cache/save@v6
env:
cache-name: cache-llm2-models
with:
path: llm2-persistent_storage/
key: ${{ steps.cache-llm2-models-restore.outputs.cache-primary-key }}
- name: Run streaming task
if: matrix.server-versions == 'master'
env:
CREDS: "admin:password"
run: |
set -x
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": "Count from 1 to 20 in words"},"type":"core:text2text", "appId": "test", "customId": "", "preferStreaming": true}')
echo $TASK
TASK_ID=$(echo $TASK | jq '.ocs.data.task.id')
NEXT_WAIT_TIME=0
TASK_STATUS='"STATUS_SCHEDULED"'
STREAMING_UPDATES=0
until [ $NEXT_WAIT_TIME -eq 35 ] || [ "$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
TASK_OUTPUT=$(echo $TASK | jq -r '.ocs.data.task.output.output // ""')
if [ -n "$TASK_OUTPUT" ] && [ "$TASK_STATUS" != '"STATUS_SUCCESSFUL"' ] && [ "$TASK_STATUS" != '"STATUS_FAILED"' ]; then
STREAMING_UPDATES=$((STREAMING_UPDATES+1))
echo "Streaming update detected (count: $STREAMING_UPDATES)"
fi
sleep $(( NEXT_WAIT_TIME++ ))
done
echo "Final status: $TASK_STATUS"
echo "Total streaming updates detected: $STREAMING_UPDATES"
[ "$TASK_STATUS" == '"STATUS_SUCCESSFUL"' ]
[ $STREAMING_UPDATES -gt 0 ]
- name: Show logs
if: always()
run: |
tail data/nextcloud.log
echo '--------------------------------------------------'
[ -f ${{ env.APP_NAME }}/backend_logs ] && cat ${{ env.APP_NAME }}/backend_logs || echo "No backend logs"