Add gitlab ci support
This commit is contained in:
parent
112be80ebd
commit
2284f20207
|
@ -0,0 +1,100 @@
|
||||||
|
image: chocobozzz/peertube-ci:10
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- build-and-lint
|
||||||
|
- test
|
||||||
|
- nightly
|
||||||
|
|
||||||
|
before_script:
|
||||||
|
- 'sed -i -z "s/database:\n hostname: ''localhost''/database:\n hostname: ''postgres''/" config/test.yaml'
|
||||||
|
- 'sed -i -z "s/redis:\n hostname: ''localhost''/redis:\n hostname: ''redis''/" config/test.yaml'
|
||||||
|
- if [[ $CI_JOB_STAGE == "test" ]]; then psql -c "create user peertube with password 'peertube';"; fi
|
||||||
|
- NOCLIENT=1 yarn install --pure-lockfile --cache-folder .yarn-cache
|
||||||
|
|
||||||
|
cache:
|
||||||
|
key: yarn
|
||||||
|
paths:
|
||||||
|
- .yarn-cache
|
||||||
|
- cached-fixtures
|
||||||
|
|
||||||
|
###
|
||||||
|
## Jobs templates
|
||||||
|
#
|
||||||
|
#.build-and-lint: &build-and-lint
|
||||||
|
# stage: build-and-lint
|
||||||
|
#
|
||||||
|
#.tests: &tests
|
||||||
|
# stage: test
|
||||||
|
# dependencies:
|
||||||
|
# - build-server
|
||||||
|
# services:
|
||||||
|
# - name: postgres:9.6
|
||||||
|
# alias: postgres
|
||||||
|
# - name: redis:latest
|
||||||
|
# alias: redis
|
||||||
|
# variables:
|
||||||
|
# PGHOST: postgres
|
||||||
|
# PGUSER: postgres
|
||||||
|
# REDIS_HOST: redis
|
||||||
|
# artifacts:
|
||||||
|
# expire_in: 1 day
|
||||||
|
# paths:
|
||||||
|
# - test*/logs
|
||||||
|
# when: always
|
||||||
|
#
|
||||||
|
####
|
||||||
|
### Build and lint
|
||||||
|
##
|
||||||
|
#build-server:
|
||||||
|
# <<: *build-and-lint
|
||||||
|
# artifacts:
|
||||||
|
# expire_in: 5h
|
||||||
|
# paths:
|
||||||
|
# - dist/
|
||||||
|
# script:
|
||||||
|
# - npm run build:server
|
||||||
|
#
|
||||||
|
#lint:
|
||||||
|
# <<: *build-and-lint
|
||||||
|
# script:
|
||||||
|
# - yarn install --pure-lockfile --cache-folder .yarn-cache
|
||||||
|
# - npm run ci -- "lint"
|
||||||
|
#
|
||||||
|
####
|
||||||
|
### Tests
|
||||||
|
#
|
||||||
|
#test-misc:
|
||||||
|
# <<: *tests
|
||||||
|
# script:
|
||||||
|
# - yarn install --pure-lockfile --cache-folder .yarn-cache
|
||||||
|
# - npm run ci -- "misc"
|
||||||
|
#
|
||||||
|
#test-cli:
|
||||||
|
# <<: *tests
|
||||||
|
# retry:
|
||||||
|
# max: 1
|
||||||
|
# script:
|
||||||
|
# - npm run ci -- "cli"
|
||||||
|
#
|
||||||
|
#api:
|
||||||
|
# <<: *tests
|
||||||
|
# parallel: 4
|
||||||
|
# retry:
|
||||||
|
# max: 1
|
||||||
|
# script:
|
||||||
|
# - NODE_PENDING_JOB_WAIT=1000 npm run ci -- api-$CI_NODE_INDEX
|
||||||
|
|
||||||
|
build-nightly:
|
||||||
|
stage: nightly
|
||||||
|
only:
|
||||||
|
- schedules
|
||||||
|
script:
|
||||||
|
- yarn install --pure-lockfile --cache-folder .yarn-cache
|
||||||
|
- npm run nightly
|
||||||
|
- mkdir "${HOME}/.ssh"
|
||||||
|
- chmod 700 "${HOME}/.ssh"
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KNOWN_HOSTS+x} ]; then echo -e "${DEPLOYEMENT_KNOWN_HOSTS}" > ${HOME}/.ssh/known_hosts; fi
|
||||||
|
- eval `ssh-agent -s`
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KEY+x} ]; then ssh-add <(echo "${DEPLOYEMENT_KEY}"); fi
|
||||||
|
- if [ ! -z ${DEPLOYEMENT_KEY+x} ]; then scp ./peertube-nightly-* ${DEPLOYEMENT_USER}@${DEPLOYEMENT_HOST}:../../web/nightly; fi
|
||||||
|
|
|
@ -47,7 +47,7 @@ matrix:
|
||||||
- env: TEST_SUITE=lint
|
- env: TEST_SUITE=lint
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- NODE_PENDING_JOB_WAIT=2000 travis_retry npm run travis -- "$TEST_SUITE"
|
- NODE_PENDING_JOB_WAIT=2000 travis_retry npm run ci -- "$TEST_SUITE"
|
||||||
|
|
||||||
after_failure:
|
after_failure:
|
||||||
- cat test1/logs/peertube.log
|
- cat test1/logs/peertube.log
|
||||||
|
|
|
@ -45,8 +45,8 @@ Be part of a network of multiple small federated, interoperable video hosting pr
|
||||||
|
|
||||||
<br />
|
<br />
|
||||||
|
|
||||||
<a href="https://travis-ci.org/Chocobozzz/PeerTube">
|
<a href="https://framagit.org/framasoft/peertube/PeerTube/commits/develop">
|
||||||
<img src="https://travis-ci.org/Chocobozzz/PeerTube.svg?branch=develop" alt="Build Status" />
|
<img alt="pipeline status" src="https://framagit.org/framasoft/peertube/PeerTube/badges/develop/pipeline.svg" />
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<a href="https://david-dm.org/Chocobozzz/PeerTube">
|
<a href="https://david-dm.org/Chocobozzz/PeerTube">
|
||||||
|
|
|
@ -20,6 +20,9 @@ database:
|
||||||
hostname: 'localhost'
|
hostname: 'localhost'
|
||||||
port: 5432
|
port: 5432
|
||||||
|
|
||||||
|
redis:
|
||||||
|
hostname: 'localhost'
|
||||||
|
|
||||||
smtp:
|
smtp:
|
||||||
hostname: null
|
hostname: null
|
||||||
port: 1025
|
port: 1025
|
||||||
|
|
10
package.json
10
package.json
|
@ -60,17 +60,19 @@
|
||||||
"postinstall": "test -n \"$NOCLIENT\" || (cd client && yarn install --pure-lockfile)",
|
"postinstall": "test -n \"$NOCLIENT\" || (cd client && yarn install --pure-lockfile)",
|
||||||
"tsc": "tsc",
|
"tsc": "tsc",
|
||||||
"commander": "commander",
|
"commander": "commander",
|
||||||
"lint": "npm run travis -- lint",
|
"lint": "npm run ci -- lint",
|
||||||
"ng": "ng",
|
"ng": "ng",
|
||||||
"nodemon": "nodemon",
|
"nodemon": "nodemon",
|
||||||
"ts-node": "ts-node",
|
"ts-node": "ts-node",
|
||||||
"tslint": "tslint",
|
"tslint": "tslint",
|
||||||
"concurrently": "concurrently",
|
"concurrently": "concurrently",
|
||||||
|
"mocha-parallel-tests": "mocha-parallel-tests",
|
||||||
"sasslint": "sass-lint --verbose --no-exit",
|
"sasslint": "sass-lint --verbose --no-exit",
|
||||||
"sasslint:fix": "sass-lint-auto-fix -c .sass-lint.yml --verbose",
|
"sasslint:fix": "sass-lint-auto-fix -c .sass-lint.yml --verbose",
|
||||||
"mocha": "mocha",
|
"mocha": "mocha",
|
||||||
"travis": "scripty",
|
"ci": "scripty",
|
||||||
"release": "scripty",
|
"release": "scripty",
|
||||||
|
"nightly": "scripty",
|
||||||
"client-report": "scripty"
|
"client-report": "scripty"
|
||||||
},
|
},
|
||||||
"husky": {
|
"husky": {
|
||||||
|
@ -93,7 +95,7 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"resolutions": {
|
"resolutions": {
|
||||||
"@types/bluebird": "3.5.21"
|
"@types/bluebird": "3.5.27"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"apicache": "^1.4.0",
|
"apicache": "^1.4.0",
|
||||||
|
@ -206,7 +208,7 @@
|
||||||
"maildev": "^1.0.0-rc3",
|
"maildev": "^1.0.0-rc3",
|
||||||
"marked-man": "^0.6.0",
|
"marked-man": "^0.6.0",
|
||||||
"mocha": "^6.0.0",
|
"mocha": "^6.0.0",
|
||||||
"mocha-parallel-tests": "^2.1.0",
|
"mocha-parallel-tests": "^2.2.1",
|
||||||
"nodemon": "^1.18.6",
|
"nodemon": "^1.18.6",
|
||||||
"sass-lint": "^1.12.1",
|
"sass-lint": "^1.12.1",
|
||||||
"source-map-support": "^0.5.0",
|
"source-map-support": "^0.5.0",
|
||||||
|
|
|
@ -22,16 +22,16 @@ elif [ "$1" = "cli" ]; then
|
||||||
mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/cli/index.ts
|
mocha --timeout 5000 --exit --require ts-node/register --bail server/tests/cli/index.ts
|
||||||
elif [ "$1" = "api-1" ]; then
|
elif [ "$1" = "api-1" ]; then
|
||||||
npm run build:server
|
npm run build:server
|
||||||
sh ./server/tests/api/travis-1.sh 2
|
sh ./server/tests/api/ci-1.sh 2
|
||||||
elif [ "$1" = "api-2" ]; then
|
elif [ "$1" = "api-2" ]; then
|
||||||
npm run build:server
|
npm run build:server
|
||||||
sh ./server/tests/api/travis-2.sh 2
|
sh ./server/tests/api/ci-2.sh 2
|
||||||
elif [ "$1" = "api-3" ]; then
|
elif [ "$1" = "api-3" ]; then
|
||||||
npm run build:server
|
npm run build:server
|
||||||
sh ./server/tests/api/travis-3.sh 2
|
sh ./server/tests/api/ci-3.sh 2
|
||||||
elif [ "$1" = "api-4" ]; then
|
elif [ "$1" = "api-4" ]; then
|
||||||
npm run build:server
|
npm run build:server
|
||||||
sh ./server/tests/api/travis-4.sh 2
|
sh ./server/tests/api/ci-4.sh 2
|
||||||
elif [ "$1" = "lint" ]; then
|
elif [ "$1" = "lint" ]; then
|
||||||
npm run tslint -- --project ./tsconfig.json -c ./tslint.json server.ts "server/**/*.ts" "shared/**/*.ts"
|
npm run tslint -- --project ./tsconfig.json -c ./tslint.json server.ts "server/**/*.ts" "shared/**/*.ts"
|
||||||
|
|
|
@ -5,7 +5,7 @@ set -eu
|
||||||
recreateDB () {
|
recreateDB () {
|
||||||
dbname="peertube_test$1"
|
dbname="peertube_test$1"
|
||||||
|
|
||||||
dropdb --if-exists "$dbname"
|
dropdb --if-exists "$dbname" 2>&1
|
||||||
|
|
||||||
createdb -O peertube "$dbname"
|
createdb -O peertube "$dbname"
|
||||||
psql -c "CREATE EXTENSION pg_trgm;" "$dbname" &
|
psql -c "CREATE EXTENSION pg_trgm;" "$dbname" &
|
||||||
|
@ -18,10 +18,15 @@ removeFiles () {
|
||||||
|
|
||||||
dropRedis () {
|
dropRedis () {
|
||||||
port=$((9000+$1))
|
port=$((9000+$1))
|
||||||
|
host="localhost"
|
||||||
|
|
||||||
redis-cli KEYS "bull-localhost:$port*" | grep -v empty | xargs --no-run-if-empty redis-cli DEL
|
if [ ! -z ${GITLAB_CI+x} ]; then
|
||||||
redis-cli KEYS "redis-localhost:$port*" | grep -v empty | xargs --no-run-if-empty redis-cli DEL
|
host="redis"
|
||||||
redis-cli KEYS "*redis-localhost:$port-" | grep -v empty | xargs --no-run-if-empty redis-cli DEL
|
fi
|
||||||
|
|
||||||
|
redis-cli -h "$host" KEYS "bull-localhost:$port*" | grep -v empty | xargs --no-run-if-empty redis-cli -h "$host" DEL
|
||||||
|
redis-cli -h "$host" KEYS "redis-localhost:$port*" | grep -v empty | xargs --no-run-if-empty redis-cli -h "$host" DEL
|
||||||
|
redis-cli -h "$host" KEYS "*redis-localhost:$port-" | grep -v empty | xargs --no-run-if-empty redis-cli -h "$host" DEL
|
||||||
}
|
}
|
||||||
|
|
||||||
seq=$(seq 1 6)
|
seq=$(seq 1 6)
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
shutdown() {
|
||||||
|
# Get our process group id
|
||||||
|
# shellcheck disable=SC2009
|
||||||
|
PGID=$(ps -o pgid= $$ | grep -o "[0-9]*")
|
||||||
|
|
||||||
|
# Kill it in a new new process group
|
||||||
|
setsid kill -- -"$PGID"
|
||||||
|
exit 0
|
||||||
|
}
|
||||||
|
|
||||||
|
trap "shutdown" SIGINT SIGTERM
|
||||||
|
|
||||||
|
today=$(date '+%F')
|
||||||
|
directory_name="peertube-nightly-$today"
|
||||||
|
tar_name="peertube-nightly-$today.tar.xz"
|
||||||
|
|
||||||
|
npm run build
|
||||||
|
|
||||||
|
# Creating the archives
|
||||||
|
(
|
||||||
|
# local variables
|
||||||
|
directories_to_archive=("$directory_name/CREDITS.md" "$directory_name/FAQ.md" \
|
||||||
|
"$directory_name/LICENSE" "$directory_name/README.md" \
|
||||||
|
"$directory_name/client/dist/" "$directory_name/client/yarn.lock" \
|
||||||
|
"$directory_name/client/package.json" "$directory_name/config" \
|
||||||
|
"$directory_name/dist" "$directory_name/package.json" \
|
||||||
|
"$directory_name/scripts" "$directory_name/support" \
|
||||||
|
"$directory_name/tsconfig.json" "$directory_name/yarn.lock")
|
||||||
|
|
||||||
|
# temporary setup
|
||||||
|
cd ..
|
||||||
|
ln -s "PeerTube" "$directory_name"
|
||||||
|
|
||||||
|
XZ_OPT=-e9 tar cfJ "PeerTube/$tar_name" "${directories_to_archive[@]}"
|
||||||
|
|
||||||
|
# temporary setup destruction
|
||||||
|
rm "$directory_name"
|
||||||
|
)
|
|
@ -5,6 +5,6 @@ set -eu
|
||||||
npm run build:server
|
npm run build:server
|
||||||
npm run setup:cli
|
npm run setup:cli
|
||||||
|
|
||||||
npm run travis -- lint
|
npm run ci -- lint
|
||||||
|
|
||||||
mocha --exit --require ts-node/register/type-check --bail server/tests/index.ts
|
mocha --exit --require ts-node/register/type-check --bail server/tests/index.ts
|
||||||
|
|
|
@ -113,16 +113,16 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) {
|
||||||
|
|
||||||
// We send the video abuse to the origin server
|
// We send the video abuse to the origin server
|
||||||
if (videoInstance.isOwned() === false) {
|
if (videoInstance.isOwned() === false) {
|
||||||
await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance)
|
await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
|
|
||||||
|
|
||||||
auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON()))
|
auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON()))
|
||||||
|
|
||||||
return videoAbuseInstance
|
return videoAbuseInstance
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Notifier.Instance.notifyOnNewVideoAbuse(videoAbuse)
|
||||||
|
|
||||||
logger.info('Abuse report for video %s created.', videoInstance.name)
|
logger.info('Abuse report for video %s created.', videoInstance.name)
|
||||||
|
|
||||||
return res.json({ videoAbuse: videoAbuse.toFormattedJSON() }).end()
|
return res.json({ videoAbuse: videoAbuse.toFormattedJSON() }).end()
|
||||||
|
|
|
@ -2,6 +2,7 @@ import * as retry from 'async/retry'
|
||||||
import * as Bluebird from 'bluebird'
|
import * as Bluebird from 'bluebird'
|
||||||
import { Model } from 'sequelize-typescript'
|
import { Model } from 'sequelize-typescript'
|
||||||
import { logger } from './logger'
|
import { logger } from './logger'
|
||||||
|
import { Transaction } from 'sequelize'
|
||||||
|
|
||||||
function retryTransactionWrapper <T, A, B, C> (
|
function retryTransactionWrapper <T, A, B, C> (
|
||||||
functionToRetry: (arg1: A, arg2: B, arg3: C) => Promise<T> | Bluebird<T>,
|
functionToRetry: (arg1: A, arg2: B, arg3: C) => Promise<T> | Bluebird<T>,
|
||||||
|
@ -72,11 +73,18 @@ function resetSequelizeInstance (instance: Model<any>, savedFields: object) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function afterCommitIfTransaction (t: Transaction, fn: Function) {
|
||||||
|
if (t) return t.afterCommit(() => fn())
|
||||||
|
|
||||||
|
return fn()
|
||||||
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
export {
|
export {
|
||||||
resetSequelizeInstance,
|
resetSequelizeInstance,
|
||||||
retryTransactionWrapper,
|
retryTransactionWrapper,
|
||||||
transactionRetryer,
|
transactionRetryer,
|
||||||
updateInstanceWithAnother
|
updateInstanceWithAnother,
|
||||||
|
afterCommitIfTransaction
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag,
|
||||||
|
|
||||||
const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: flag.object })
|
const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: flag.object })
|
||||||
|
|
||||||
return sequelizeTypescript.transaction(async t => {
|
const videoAbuse = await sequelizeTypescript.transaction(async t => {
|
||||||
const videoAbuseData = {
|
const videoAbuseData = {
|
||||||
reporterAccountId: account.id,
|
reporterAccountId: account.id,
|
||||||
reason: flag.content,
|
reason: flag.content,
|
||||||
|
@ -42,8 +42,10 @@ async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag,
|
||||||
const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
|
const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
|
||||||
videoAbuseInstance.Video = video
|
videoAbuseInstance.Video = video
|
||||||
|
|
||||||
Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
|
|
||||||
|
|
||||||
logger.info('Remote abuse for video uuid %s created', flag.object)
|
logger.info('Remote abuse for video uuid %s created', flag.object)
|
||||||
|
|
||||||
|
return videoAbuseInstance
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Notifier.Instance.notifyOnNewVideoAbuse(videoAbuse)
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { VideoRedundancyModel } from '../../../models/redundancy/video-redundanc
|
||||||
import { VideoPlaylistModel } from '../../../models/video/video-playlist'
|
import { VideoPlaylistModel } from '../../../models/video/video-playlist'
|
||||||
import { VideoPlaylistPrivacy } from '../../../../shared/models/videos/playlist/video-playlist-privacy.model'
|
import { VideoPlaylistPrivacy } from '../../../../shared/models/videos/playlist/video-playlist-privacy.model'
|
||||||
import { getServerActor } from '../../../helpers/utils'
|
import { getServerActor } from '../../../helpers/utils'
|
||||||
|
import * as Bluebird from 'bluebird'
|
||||||
|
|
||||||
async function sendCreateVideo (video: VideoModel, t: Transaction) {
|
async function sendCreateVideo (video: VideoModel, t: Transaction) {
|
||||||
if (video.privacy === VideoPrivacy.PRIVATE) return undefined
|
if (video.privacy === VideoPrivacy.PRIVATE) return undefined
|
||||||
|
@ -82,7 +83,7 @@ async function sendCreateVideoComment (comment: VideoCommentModel, t: Transactio
|
||||||
|
|
||||||
// This was a reply, send it to the parent actors
|
// This was a reply, send it to the parent actors
|
||||||
const actorsException = [ byActor ]
|
const actorsException = [ byActor ]
|
||||||
await broadcastToActors(createActivity, byActor, parentsCommentActors, actorsException)
|
await broadcastToActors(createActivity, byActor, parentsCommentActors, t, actorsException)
|
||||||
|
|
||||||
// Broadcast to our followers
|
// Broadcast to our followers
|
||||||
await broadcastToFollowers(createActivity, byActor, [ byActor ], t)
|
await broadcastToFollowers(createActivity, byActor, [ byActor ], t)
|
||||||
|
@ -91,7 +92,7 @@ async function sendCreateVideoComment (comment: VideoCommentModel, t: Transactio
|
||||||
if (isOrigin) return broadcastToFollowers(createActivity, byActor, actorsInvolvedInComment, t, actorsException)
|
if (isOrigin) return broadcastToFollowers(createActivity, byActor, actorsInvolvedInComment, t, actorsException)
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl)
|
t.afterCommit(() => unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl))
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate {
|
function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate {
|
||||||
|
|
|
@ -59,7 +59,7 @@ async function sendDeleteVideoComment (videoComment: VideoCommentModel, t: Trans
|
||||||
|
|
||||||
// This was a reply, send it to the parent actors
|
// This was a reply, send it to the parent actors
|
||||||
const actorsException = [ byActor ]
|
const actorsException = [ byActor ]
|
||||||
await broadcastToActors(activity, byActor, threadParentComments.map(c => c.Account.Actor), actorsException)
|
await broadcastToActors(activity, byActor, threadParentComments.map(c => c.Account.Actor), t, actorsException)
|
||||||
|
|
||||||
// Broadcast to our followers
|
// Broadcast to our followers
|
||||||
await broadcastToFollowers(activity, byActor, [ byActor ], t)
|
await broadcastToFollowers(activity, byActor, [ byActor ], t)
|
||||||
|
@ -68,7 +68,7 @@ async function sendDeleteVideoComment (videoComment: VideoCommentModel, t: Trans
|
||||||
if (isVideoOrigin) return broadcastToFollowers(activity, byActor, actorsInvolvedInComment, t, actorsException)
|
if (isVideoOrigin) return broadcastToFollowers(activity, byActor, actorsInvolvedInComment, t, actorsException)
|
||||||
|
|
||||||
// Send to origin
|
// Send to origin
|
||||||
return unicastTo(activity, byActor, videoComment.Video.VideoChannel.Account.Actor.sharedInboxUrl)
|
t.afterCommit(() => unicastTo(activity, byActor, videoComment.Video.VideoChannel.Account.Actor.sharedInboxUrl))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendDeleteVideoPlaylist (videoPlaylist: VideoPlaylistModel, t: Transaction) {
|
async function sendDeleteVideoPlaylist (videoPlaylist: VideoPlaylistModel, t: Transaction) {
|
||||||
|
|
|
@ -6,8 +6,9 @@ import { unicastTo } from './utils'
|
||||||
import { logger } from '../../../helpers/logger'
|
import { logger } from '../../../helpers/logger'
|
||||||
import { ActivityAudience, ActivityFlag } from '../../../../shared/models/activitypub'
|
import { ActivityAudience, ActivityFlag } from '../../../../shared/models/activitypub'
|
||||||
import { audiencify, getAudience } from '../audience'
|
import { audiencify, getAudience } from '../audience'
|
||||||
|
import { Transaction } from 'sequelize'
|
||||||
|
|
||||||
async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) {
|
async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel, t: Transaction) {
|
||||||
if (!video.VideoChannel.Account.Actor.serverId) return // Local user
|
if (!video.VideoChannel.Account.Actor.serverId) return // Local user
|
||||||
|
|
||||||
const url = getVideoAbuseActivityPubUrl(videoAbuse)
|
const url = getVideoAbuseActivityPubUrl(videoAbuse)
|
||||||
|
@ -18,7 +19,7 @@ async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel,
|
||||||
const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
|
const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
|
||||||
const flagActivity = buildFlagActivity(url, byActor, videoAbuse, audience)
|
const flagActivity = buildFlagActivity(url, byActor, videoAbuse, audience)
|
||||||
|
|
||||||
return unicastTo(flagActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
|
t.afterCommit(() => unicastTo(flagActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl))
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildFlagActivity (url: string, byActor: ActorModel, videoAbuse: VideoAbuseModel, audience: ActivityAudience): ActivityFlag {
|
function buildFlagActivity (url: string, byActor: ActorModel, videoAbuse: VideoAbuseModel, audience: ActivityAudience): ActivityFlag {
|
||||||
|
|
|
@ -4,8 +4,9 @@ import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
|
||||||
import { getActorFollowActivityPubUrl } from '../url'
|
import { getActorFollowActivityPubUrl } from '../url'
|
||||||
import { unicastTo } from './utils'
|
import { unicastTo } from './utils'
|
||||||
import { logger } from '../../../helpers/logger'
|
import { logger } from '../../../helpers/logger'
|
||||||
|
import { Transaction } from 'sequelize'
|
||||||
|
|
||||||
function sendFollow (actorFollow: ActorFollowModel) {
|
function sendFollow (actorFollow: ActorFollowModel, t: Transaction) {
|
||||||
const me = actorFollow.ActorFollower
|
const me = actorFollow.ActorFollower
|
||||||
const following = actorFollow.ActorFollowing
|
const following = actorFollow.ActorFollowing
|
||||||
|
|
||||||
|
@ -17,7 +18,7 @@ function sendFollow (actorFollow: ActorFollowModel) {
|
||||||
const url = getActorFollowActivityPubUrl(me, following)
|
const url = getActorFollowActivityPubUrl(me, following)
|
||||||
const data = buildFollowActivity(url, me, following)
|
const data = buildFollowActivity(url, me, following)
|
||||||
|
|
||||||
return unicastTo(data, me, following.inboxUrl)
|
t.afterCommit(() => unicastTo(data, me, following.inboxUrl))
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildFollowActivity (url: string, byActor: ActorModel, targetActor: ActorModel): ActivityFollow {
|
function buildFollowActivity (url: string, byActor: ActorModel, targetActor: ActorModel): ActivityFollow {
|
||||||
|
|
|
@ -37,7 +37,7 @@ async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
|
||||||
const followActivity = buildFollowActivity(followUrl, me, following)
|
const followActivity = buildFollowActivity(followUrl, me, following)
|
||||||
const undoActivity = undoActivityData(undoUrl, me, followActivity)
|
const undoActivity = undoActivityData(undoUrl, me, followActivity)
|
||||||
|
|
||||||
return unicastTo(undoActivity, me, following.inboxUrl)
|
t.afterCommit(() => unicastTo(undoActivity, me, following.inboxUrl))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function sendUndoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
|
async function sendUndoAnnounce (byActor: ActorModel, videoShare: VideoShareModel, video: VideoModel, t: Transaction) {
|
||||||
|
|
|
@ -26,7 +26,9 @@ async function sendUpdateVideo (video: VideoModel, t: Transaction, overrodeByAct
|
||||||
const url = getUpdateActivityPubUrl(video.url, video.updatedAt.toISOString())
|
const url = getUpdateActivityPubUrl(video.url, video.updatedAt.toISOString())
|
||||||
|
|
||||||
// Needed to build the AP object
|
// Needed to build the AP object
|
||||||
if (!video.VideoCaptions) video.VideoCaptions = await video.$get('VideoCaptions') as VideoCaptionModel[]
|
if (!video.VideoCaptions) {
|
||||||
|
video.VideoCaptions = await video.$get('VideoCaptions', { transaction: t }) as VideoCaptionModel[]
|
||||||
|
}
|
||||||
|
|
||||||
const videoObject = video.toActivityPubObject()
|
const videoObject = video.toActivityPubObject()
|
||||||
const audience = getAudience(byActor, video.privacy === VideoPrivacy.PUBLIC)
|
const audience = getAudience(byActor, video.privacy === VideoPrivacy.PUBLIC)
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { JobQueue } from '../../job-queue'
|
||||||
import { VideoModel } from '../../../models/video/video'
|
import { VideoModel } from '../../../models/video/video'
|
||||||
import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience'
|
import { getActorsInvolvedInVideo, getAudienceFromFollowersOf, getRemoteVideoAudience } from '../audience'
|
||||||
import { getServerActor } from '../../../helpers/utils'
|
import { getServerActor } from '../../../helpers/utils'
|
||||||
|
import { afterCommitIfTransaction } from '../../../helpers/database-utils'
|
||||||
|
|
||||||
async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: {
|
async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAudience) => Activity, options: {
|
||||||
byActor: ActorModel,
|
byActor: ActorModel,
|
||||||
|
@ -20,7 +21,9 @@ async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAud
|
||||||
const audience = getRemoteVideoAudience(options.video, actorsInvolvedInVideo)
|
const audience = getRemoteVideoAudience(options.video, actorsInvolvedInVideo)
|
||||||
const activity = activityBuilder(audience)
|
const activity = activityBuilder(audience)
|
||||||
|
|
||||||
return unicastTo(activity, options.byActor, options.video.VideoChannel.Account.Actor.sharedInboxUrl)
|
return afterCommitIfTransaction(options.transaction, () => {
|
||||||
|
return unicastTo(activity, options.byActor, options.video.VideoChannel.Account.Actor.sharedInboxUrl)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send to followers
|
// Send to followers
|
||||||
|
@ -28,6 +31,7 @@ async function sendVideoRelatedActivity (activityBuilder: (audience: ActivityAud
|
||||||
const activity = activityBuilder(audience)
|
const activity = activityBuilder(audience)
|
||||||
|
|
||||||
const actorsException = [ options.byActor ]
|
const actorsException = [ options.byActor ]
|
||||||
|
|
||||||
return broadcastToFollowers(activity, options.byActor, actorsInvolvedInVideo, options.transaction, actorsException)
|
return broadcastToFollowers(activity, options.byActor, actorsInvolvedInVideo, options.transaction, actorsException)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,7 +80,7 @@ async function forwardActivity (
|
||||||
uris,
|
uris,
|
||||||
body: activity
|
body: activity
|
||||||
}
|
}
|
||||||
return JobQueue.Instance.createJob({ type: 'activitypub-http-broadcast', payload })
|
return afterCommitIfTransaction(t, () => JobQueue.Instance.createJob({ type: 'activitypub-http-broadcast', payload }))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function broadcastToFollowers (
|
async function broadcastToFollowers (
|
||||||
|
@ -87,20 +91,22 @@ async function broadcastToFollowers (
|
||||||
actorsException: ActorModel[] = []
|
actorsException: ActorModel[] = []
|
||||||
) {
|
) {
|
||||||
const uris = await computeFollowerUris(toFollowersOf, actorsException, t)
|
const uris = await computeFollowerUris(toFollowersOf, actorsException, t)
|
||||||
return broadcastTo(uris, data, byActor)
|
|
||||||
|
return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function broadcastToActors (
|
async function broadcastToActors (
|
||||||
data: any,
|
data: any,
|
||||||
byActor: ActorModel,
|
byActor: ActorModel,
|
||||||
toActors: ActorModel[],
|
toActors: ActorModel[],
|
||||||
|
t?: Transaction,
|
||||||
actorsException: ActorModel[] = []
|
actorsException: ActorModel[] = []
|
||||||
) {
|
) {
|
||||||
const uris = await computeUris(toActors, actorsException)
|
const uris = await computeUris(toActors, actorsException)
|
||||||
return broadcastTo(uris, data, byActor)
|
return afterCommitIfTransaction(t, () => broadcastTo(uris, data, byActor))
|
||||||
}
|
}
|
||||||
|
|
||||||
async function broadcastTo (uris: string[], data: any, byActor: ActorModel) {
|
function broadcastTo (uris: string[], data: any, byActor: ActorModel) {
|
||||||
if (uris.length === 0) return undefined
|
if (uris.length === 0) return undefined
|
||||||
|
|
||||||
logger.debug('Creating broadcast job.', { uris })
|
logger.debug('Creating broadcast job.', { uris })
|
||||||
|
@ -114,7 +120,7 @@ async function broadcastTo (uris: string[], data: any, byActor: ActorModel) {
|
||||||
return JobQueue.Instance.createJob({ type: 'activitypub-http-broadcast', payload })
|
return JobQueue.Instance.createJob({ type: 'activitypub-http-broadcast', payload })
|
||||||
}
|
}
|
||||||
|
|
||||||
async function unicastTo (data: any, byActor: ActorModel, toActorUrl: string) {
|
function unicastTo (data: any, byActor: ActorModel, toActorUrl: string) {
|
||||||
logger.debug('Creating unicast job.', { uri: toActorUrl })
|
logger.debug('Creating unicast job.', { uri: toActorUrl })
|
||||||
|
|
||||||
const payload = {
|
const payload = {
|
||||||
|
@ -123,7 +129,7 @@ async function unicastTo (data: any, byActor: ActorModel, toActorUrl: string) {
|
||||||
body: data
|
body: data
|
||||||
}
|
}
|
||||||
|
|
||||||
return JobQueue.Instance.createJob({ type: 'activitypub-http-unicast', payload })
|
JobQueue.Instance.createJob({ type: 'activitypub-http-unicast', payload })
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
@ -69,7 +69,7 @@ async function follow (fromActor: ActorModel, targetActor: ActorModel) {
|
||||||
actorFollow.ActorFollower = fromActor
|
actorFollow.ActorFollower = fromActor
|
||||||
|
|
||||||
// Send a notification to remote server if our follow is not already accepted
|
// Send a notification to remote server if our follow is not already accepted
|
||||||
if (actorFollow.state !== 'accepted') await sendFollow(actorFollow)
|
if (actorFollow.state !== 'accepted') sendFollow(actorFollow, t)
|
||||||
|
|
||||||
return actorFollow
|
return actorFollow
|
||||||
})
|
})
|
||||||
|
|
|
@ -87,7 +87,7 @@ describe('Test ActivityPub fetcher', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
after(async function () {
|
after(async function () {
|
||||||
this.timeout(10000)
|
this.timeout(20000)
|
||||||
|
|
||||||
await cleanupTests(servers)
|
await cleanupTests(servers)
|
||||||
|
|
||||||
|
|
|
@ -6,5 +6,5 @@ checkParamFiles=$(find server/tests/api/check-params -type f | grep -v index.ts
|
||||||
notificationsFiles=$(find server/tests/api/notifications -type f | grep -v index.ts | xargs echo)
|
notificationsFiles=$(find server/tests/api/notifications -type f | grep -v index.ts | xargs echo)
|
||||||
searchFiles=$(find server/tests/api/search -type f | grep -v index.ts | xargs echo)
|
searchFiles=$(find server/tests/api/search -type f | grep -v index.ts | xargs echo)
|
||||||
|
|
||||||
MOCHA_PARALLEL=true mocha --timeout 5000 --exit --require ts-node/register --bail \
|
MOCHA_PARALLEL=true npm run mocha --timeout 30000 --exit --require ts-node/register --bail \
|
||||||
$notificationsFiles $searchFiles $checkParamFiles
|
$notificationsFiles $searchFiles $checkParamFiles
|
|
@ -5,5 +5,5 @@ set -eu
|
||||||
serverFiles=$(find server/tests/api/server -type f | grep -v index.ts | xargs echo)
|
serverFiles=$(find server/tests/api/server -type f | grep -v index.ts | xargs echo)
|
||||||
usersFiles=$(find server/tests/api/users -type f | grep -v index.ts | xargs echo)
|
usersFiles=$(find server/tests/api/users -type f | grep -v index.ts | xargs echo)
|
||||||
|
|
||||||
MOCHA_PARALLEL=true mocha --timeout 5000 --exit --require ts-node/register --bail \
|
MOCHA_PARALLEL=true npm run mocha-parallel-tests -- --max-parallel $1 --timeout 30000 --exit --require ts-node/register --bail \
|
||||||
$serverFiles $usersFiles
|
$serverFiles $usersFiles
|
|
@ -4,5 +4,5 @@ set -eu
|
||||||
|
|
||||||
videosFiles=$(find server/tests/api/videos -type f | grep -v index.ts | xargs echo)
|
videosFiles=$(find server/tests/api/videos -type f | grep -v index.ts | xargs echo)
|
||||||
|
|
||||||
MOCHA_PARALLEL=true mocha --timeout 5000 --exit --require ts-node/register --bail \
|
MOCHA_PARALLEL=true npm run mocha --timeout 30000 --exit --require ts-node/register --bail \
|
||||||
$videosFiles
|
$videosFiles
|
|
@ -5,5 +5,5 @@ set -eu
|
||||||
redundancyFiles=$(find server/tests/api/redundancy -type f | grep -v index.ts | xargs echo)
|
redundancyFiles=$(find server/tests/api/redundancy -type f | grep -v index.ts | xargs echo)
|
||||||
activitypubFiles=$(find server/tests/api/activitypub -type f | grep -v index.ts | xargs echo)
|
activitypubFiles=$(find server/tests/api/activitypub -type f | grep -v index.ts | xargs echo)
|
||||||
|
|
||||||
MOCHA_PARALLEL=true mocha-parallel-tests --max-parallel $1 --timeout 5000 --exit --require ts-node/register --bail \
|
MOCHA_PARALLEL=true npm run mocha-parallel-tests -- --max-parallel $1 --timeout 30000 --exit --require ts-node/register --bail \
|
||||||
$redundancyFiles $activitypubFiles
|
$redundancyFiles $activitypubFiles
|
|
@ -782,7 +782,7 @@ describe('Test users notifications', function () {
|
||||||
it('Should not send a notification before the video is published', async function () {
|
it('Should not send a notification before the video is published', async function () {
|
||||||
this.timeout(20000)
|
this.timeout(20000)
|
||||||
|
|
||||||
let updateAt = new Date(new Date().getTime() + 100000)
|
let updateAt = new Date(new Date().getTime() + 1000000)
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
privacy: VideoPrivacy.PRIVATE,
|
privacy: VideoPrivacy.PRIVATE,
|
||||||
|
@ -1074,7 +1074,7 @@ describe('Test users notifications', function () {
|
||||||
it('Should send unblacklist but not published/subscription notes after unblacklisted if scheduled update pending', async function () {
|
it('Should send unblacklist but not published/subscription notes after unblacklisted if scheduled update pending', async function () {
|
||||||
this.timeout(20000)
|
this.timeout(20000)
|
||||||
|
|
||||||
let updateAt = new Date(new Date().getTime() + 100000)
|
let updateAt = new Date(new Date().getTime() + 1000000)
|
||||||
|
|
||||||
const name = 'video with auto-blacklist and future schedule ' + uuidv4()
|
const name = 'video with auto-blacklist and future schedule ' + uuidv4()
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ describe('Test emails', function () {
|
||||||
let emailPort: number
|
let emailPort: number
|
||||||
|
|
||||||
before(async function () {
|
before(async function () {
|
||||||
this.timeout(30000)
|
this.timeout(50000)
|
||||||
|
|
||||||
emailPort = await MockSmtpServer.Instance.collectEmails(emails)
|
emailPort = await MockSmtpServer.Instance.collectEmails(emails)
|
||||||
|
|
||||||
|
|
|
@ -109,7 +109,7 @@ describe('Test handle downs', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should remove followers that are often down', async function () {
|
it('Should remove followers that are often down', async function () {
|
||||||
this.timeout(60000)
|
this.timeout(240000)
|
||||||
|
|
||||||
// Server 2 and 3 follow server 1
|
// Server 2 and 3 follow server 1
|
||||||
await follow(servers[1].url, [ servers[0].url ], servers[1].accessToken)
|
await follow(servers[1].url, [ servers[0].url ], servers[1].accessToken)
|
||||||
|
|
|
@ -8,6 +8,7 @@ import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../../..
|
||||||
import { flushAndRunMultipleServers } from '../../../../shared/extra-utils/server/servers'
|
import { flushAndRunMultipleServers } from '../../../../shared/extra-utils/server/servers'
|
||||||
import { uploadVideo } from '../../../../shared/extra-utils/videos/videos'
|
import { uploadVideo } from '../../../../shared/extra-utils/videos/videos'
|
||||||
import { dateIsValid } from '../../../../shared/extra-utils/miscs/miscs'
|
import { dateIsValid } from '../../../../shared/extra-utils/miscs/miscs'
|
||||||
|
import { Job } from '../../../../shared/models/server'
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
|
||||||
|
@ -50,7 +51,7 @@ describe('Test jobs', function () {
|
||||||
if (job.type === 'videos-views') job = res.body.data[1]
|
if (job.type === 'videos-views') job = res.body.data[1]
|
||||||
|
|
||||||
expect(job.state).to.equal('completed')
|
expect(job.state).to.equal('completed')
|
||||||
expect(job.type).to.equal('activitypub-follow')
|
expect(job.type.startsWith('activitypub-')).to.be.true
|
||||||
expect(dateIsValid(job.createdAt)).to.be.true
|
expect(dateIsValid(job.createdAt)).to.be.true
|
||||||
expect(dateIsValid(job.processedOn)).to.be.true
|
expect(dateIsValid(job.processedOn)).to.be.true
|
||||||
expect(dateIsValid(job.finishedOn)).to.be.true
|
expect(dateIsValid(job.finishedOn)).to.be.true
|
||||||
|
|
|
@ -85,7 +85,7 @@ describe('Test video update scheduler', function () {
|
||||||
})
|
})
|
||||||
|
|
||||||
it('Should wait some seconds and have the video in public privacy', async function () {
|
it('Should wait some seconds and have the video in public privacy', async function () {
|
||||||
this.timeout(20000)
|
this.timeout(50000)
|
||||||
|
|
||||||
await wait(15000)
|
await wait(15000)
|
||||||
await waitJobs(servers)
|
await waitJobs(servers)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
/* tslint:disable:no-unused-expression */
|
/* tslint:disable:no-unused-expression */
|
||||||
|
|
||||||
import * as chai from 'chai'
|
import * as chai from 'chai'
|
||||||
import { basename, isAbsolute, join, resolve } from 'path'
|
import { basename, dirname, isAbsolute, join, resolve } from 'path'
|
||||||
import * as request from 'supertest'
|
import * as request from 'supertest'
|
||||||
import * as WebTorrent from 'webtorrent'
|
import * as WebTorrent from 'webtorrent'
|
||||||
import { pathExists, readFile } from 'fs-extra'
|
import { ensureDir, pathExists, readFile } from 'fs-extra'
|
||||||
import * as ffmpeg from 'fluent-ffmpeg'
|
import * as ffmpeg from 'fluent-ffmpeg'
|
||||||
|
|
||||||
const expect = chai.expect
|
const expect = chai.expect
|
||||||
|
@ -59,12 +59,12 @@ async function testImage (url: string, imageName: string, imagePath: string, ext
|
||||||
expect(data.length).to.be.below(maxLength)
|
expect(data.length).to.be.below(maxLength)
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildAbsoluteFixturePath (path: string, customTravisPath = false) {
|
function buildAbsoluteFixturePath (path: string, customCIPath = false) {
|
||||||
if (isAbsolute(path)) {
|
if (isAbsolute(path)) {
|
||||||
return path
|
return path
|
||||||
}
|
}
|
||||||
|
|
||||||
if (customTravisPath && process.env.TRAVIS) return join(process.env.HOME, 'fixtures', path)
|
if (customCIPath && process.env.GITLAB_CI) return join(root(), 'cached-fixtures', path)
|
||||||
|
|
||||||
return join(root(), 'server', 'tests', 'fixtures', path)
|
return join(root(), 'server', 'tests', 'fixtures', path)
|
||||||
}
|
}
|
||||||
|
@ -72,6 +72,8 @@ function buildAbsoluteFixturePath (path: string, customTravisPath = false) {
|
||||||
async function generateHighBitrateVideo () {
|
async function generateHighBitrateVideo () {
|
||||||
const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true)
|
const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true)
|
||||||
|
|
||||||
|
await ensureDir(dirname(tempFixturePath))
|
||||||
|
|
||||||
const exists = await pathExists(tempFixturePath)
|
const exists = await pathExists(tempFixturePath)
|
||||||
if (!exists) {
|
if (!exists) {
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { QueryTypes, Sequelize } from 'sequelize'
|
import { QueryTypes, Sequelize } from 'sequelize'
|
||||||
import { ServerInfo } from '../server/servers'
|
import { ServerInfo } from '../server/servers'
|
||||||
import { PluginType } from '../../models/plugins/plugin.type'
|
|
||||||
|
|
||||||
let sequelizes: { [ id: number ]: Sequelize } = {}
|
let sequelizes: { [ id: number ]: Sequelize } = {}
|
||||||
|
|
||||||
|
@ -10,7 +9,7 @@ function getSequelize (internalServerNumber: number) {
|
||||||
const dbname = 'peertube_test' + internalServerNumber
|
const dbname = 'peertube_test' + internalServerNumber
|
||||||
const username = 'peertube'
|
const username = 'peertube'
|
||||||
const password = 'peertube'
|
const password = 'peertube'
|
||||||
const host = 'localhost'
|
const host = process.env.GITLAB_CI ? 'postgres' : 'localhost'
|
||||||
const port = 5432
|
const port = 5432
|
||||||
|
|
||||||
const seq = new Sequelize(dbname, username, password, {
|
const seq = new Sequelize(dbname, username, password, {
|
||||||
|
|
|
@ -2,6 +2,7 @@ import * as request from 'supertest'
|
||||||
import { Job, JobState } from '../../models'
|
import { Job, JobState } from '../../models'
|
||||||
import { wait } from '../miscs/miscs'
|
import { wait } from '../miscs/miscs'
|
||||||
import { ServerInfo } from './servers'
|
import { ServerInfo } from './servers'
|
||||||
|
import { inspect } from 'util'
|
||||||
|
|
||||||
function getJobsList (url: string, accessToken: string, state: JobState) {
|
function getJobsList (url: string, accessToken: string, state: JobState) {
|
||||||
const path = '/api/v1/jobs/' + state
|
const path = '/api/v1/jobs/' + state
|
||||||
|
@ -49,7 +50,9 @@ async function waitJobs (serversArg: ServerInfo[] | ServerInfo) {
|
||||||
.then(res => res.body.data)
|
.then(res => res.body.data)
|
||||||
.then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views'))
|
.then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views'))
|
||||||
.then(jobs => {
|
.then(jobs => {
|
||||||
if (jobs.length !== 0) pendingRequests = true
|
if (jobs.length !== 0) {
|
||||||
|
pendingRequests = true
|
||||||
|
}
|
||||||
})
|
})
|
||||||
tasks.push(p)
|
tasks.push(p)
|
||||||
}
|
}
|
||||||
|
|
|
@ -79,8 +79,8 @@ function flushTests (serverNumber?: number) {
|
||||||
return new Promise<void>((res, rej) => {
|
return new Promise<void>((res, rej) => {
|
||||||
const suffix = serverNumber ? ` -- ${serverNumber}` : ''
|
const suffix = serverNumber ? ` -- ${serverNumber}` : ''
|
||||||
|
|
||||||
return exec('npm run clean:server:test' + suffix, err => {
|
return exec('npm run clean:server:test' + suffix, (err, _stdout, stderr) => {
|
||||||
if (err) return rej(err)
|
if (err || stderr) return rej(err || new Error(stderr))
|
||||||
|
|
||||||
return res()
|
return res()
|
||||||
})
|
})
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
* `NODE_APP_INSTANCE=6 NODE_ENV=test npm run start` and check migrations does not fail
|
* `NODE_APP_INSTANCE=6 NODE_ENV=test npm run start` and check migrations does not fail
|
||||||
* Run `rm -r node_modules && rm -r client/node_modules && yarn install --pure-lockfile && npm run build` to see if all the supported languages compile correctly
|
* Run `rm -r node_modules && rm -r client/node_modules && yarn install --pure-lockfile && npm run build` to see if all the supported languages compile correctly
|
||||||
* Update https://peertube2.cpy.re and check it works correctly
|
* Update https://peertube2.cpy.re and check it works correctly
|
||||||
* Check Travis tests are green
|
* Check CI tests are green
|
||||||
* Run E2E tests: `BROWSERSTACK_USER=my_user BROWSERSTACK_KEY=my_key npm run e2e`
|
* Run E2E tests: `BROWSERSTACK_USER=my_user BROWSERSTACK_KEY=my_key npm run e2e`
|
||||||
* Release: `GITHUB_TOKEN=my_token npm run release -- 1.x.x`
|
* Release: `GITHUB_TOKEN=my_token npm run release -- 1.x.x`
|
||||||
* Create a dedicated branch: `git checkout -b release/1.x.x && git push origin release/1.x.x`
|
* Create a dedicated branch: `git checkout -b release/1.x.x && git push origin release/1.x.x`
|
||||||
|
|
|
@ -54,7 +54,12 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
"@types/bluebird@*", "@types/bluebird@3.5.21":
|
"@types/bluebird@*", "@types/bluebird@3.5.27":
|
||||||
|
version "3.5.27"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.27.tgz#61eb4d75dc6bfbce51cf49ee9bbebe941b2cb5d0"
|
||||||
|
integrity sha512-6BmYWSBea18+tSjjSC3QIyV93ZKAeNWGM7R6aYt1ryTZXrlHF+QLV0G2yV0viEGVyRkyQsWfMoJ0k/YghBX5sQ==
|
||||||
|
|
||||||
|
"@types/bluebird@3.5.21":
|
||||||
version "3.5.21"
|
version "3.5.21"
|
||||||
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634"
|
resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.21.tgz#567615589cc913e84a28ecf9edb031732bdf2634"
|
||||||
integrity sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==
|
integrity sha512-6UNEwyw+6SGMC/WMI0ld0PS4st7Qq51qgguFrFizOSpGvZiqe9iswztFSdZvwJBEhLOy2JaxNE6VC7yMAlbfyQ==
|
||||||
|
@ -4678,7 +4683,7 @@ mkdirp@0.5.1, mkdirp@0.x.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
minimist "0.0.8"
|
minimist "0.0.8"
|
||||||
|
|
||||||
mocha-parallel-tests@^2.1.0:
|
mocha-parallel-tests@^2.2.1:
|
||||||
version "2.2.1"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/mocha-parallel-tests/-/mocha-parallel-tests-2.2.1.tgz#616b316c9f20c956a6ce18cd38d45e7db3045b99"
|
resolved "https://registry.yarnpkg.com/mocha-parallel-tests/-/mocha-parallel-tests-2.2.1.tgz#616b316c9f20c956a6ce18cd38d45e7db3045b99"
|
||||||
integrity sha512-9t0NtQ2V/KrNKaUj08RVZp0dqJxeRMTGvC7JA5Daw/LA8GOP+4P7NxRgU0e2sM0JRWYxSakXtpE+MEVGX1ifuw==
|
integrity sha512-9t0NtQ2V/KrNKaUj08RVZp0dqJxeRMTGvC7JA5Daw/LA8GOP+4P7NxRgU0e2sM0JRWYxSakXtpE+MEVGX1ifuw==
|
||||||
|
|
Loading…
Reference in New Issue