files-external-s3.yml 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. # SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  2. # SPDX-License-Identifier: MIT
  3. name: PHPUnit files_external S3
  4. on:
  5. pull_request:
  6. schedule:
  7. - cron: "5 2 * * *"
  8. concurrency:
  9. group: files-external-s3-${{ github.head_ref || github.run_id }}
  10. cancel-in-progress: true
  11. jobs:
  12. changes:
  13. runs-on: ubuntu-latest-low
  14. outputs:
  15. src: ${{ steps.changes.outputs.src}}
  16. steps:
  17. - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
  18. id: changes
  19. continue-on-error: true
  20. with:
  21. filters: |
  22. src:
  23. - '.github/workflows/**'
  24. - '3rdparty/**'
  25. - 'apps/files_external/**'
  26. - 'vendor/**'
  27. - 'vendor-bin/**'
  28. - 'composer.json'
  29. - 'composer.lock'
  30. - '**.php'
  31. files-external-s3-minio:
  32. runs-on: ubuntu-latest
  33. needs: changes
  34. if: ${{ github.repository_owner != 'nextcloud-gmbh' && needs.changes.outputs.src != 'false' }}
  35. strategy:
  36. matrix:
  37. php-versions: ['8.1', '8.2', '8.3']
  38. include:
  39. - php-versions: '8.2'
  40. coverage: ${{ github.event_name != 'pull_request' }}
  41. name: php${{ matrix.php-versions }}-s3
  42. services:
  43. minio:
  44. image: bitnami/minio
  45. env:
  46. MINIO_ROOT_USER: nextcloud
  47. MINIO_ROOT_PASSWORD: bWluaW8tc2VjcmV0LWtleS1uZXh0Y2xvdWQ=
  48. MINIO_DEFAULT_BUCKETS: nextcloud
  49. ports:
  50. - "9000:9000"
  51. steps:
  52. - name: Checkout server
  53. uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
  54. with:
  55. submodules: true
  56. - name: Set up php ${{ matrix.php-versions }}
  57. uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2
  58. with:
  59. php-version: ${{ matrix.php-versions }}
  60. # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
  61. extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
  62. coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
  63. ini-file: development
  64. env:
  65. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  66. - name: Set up Nextcloud
  67. env:
  68. OBJECT_STORE_KEY: nextcloud
  69. OBJECT_STORE_SECRET: bWluaW8tc2VjcmV0LWtleS1uZXh0Y2xvdWQ=
  70. run: |
  71. composer install
  72. ./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
  73. ./occ app:enable --force files_external
  74. echo "<?php return ['run' => true, 'secret' => 'actually-not-secret', 'passwordsalt' => 'actually-not-secret', 'hostname' => 'localhost','key' => '$OBJECT_STORE_KEY','secret' => '$OBJECT_STORE_SECRET', 'bucket' => 'bucket', 'port' => 9000, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
  75. - name: Wait for S3
  76. run: |
  77. sleep 10
  78. curl -f -m 1 --retry-connrefused --retry 10 --retry-delay 10 http://localhost:9000/minio/health/ready
  79. - name: PHPUnit
  80. run: composer run test:files_external -- \
  81. apps/files_external/tests/Storage/Amazons3Test.php \
  82. apps/files_external/tests/Storage/VersionedAmazonS3Test.php \
  83. ${{ matrix.coverage && ' --coverage-clover ./clover.xml' || '' }}
  84. - name: Upload code coverage
  85. if: ${{ !cancelled() && matrix.coverage }}
  86. uses: codecov/codecov-action@v4.1.1
  87. with:
  88. files: ./clover.xml
  89. flags: phpunit-files-external-s3
  90. - name: S3 logs
  91. if: always()
  92. run: |
  93. docker ps -a
  94. docker ps -aq | while read container ; do IMAGE=$(docker inspect --format='{{.Config.Image}}' $container); echo $IMAGE; docker logs $container; echo "\n\n" ; done
  95. files-external-s3-localstack:
  96. runs-on: ubuntu-latest
  97. needs: changes
  98. if: ${{ github.repository_owner != 'nextcloud-gmbh' && needs.changes.outputs.src != 'false' }}
  99. strategy:
  100. matrix:
  101. php-versions: ['8.1', '8.2', '8.3']
  102. include:
  103. - php-versions: '8.3'
  104. coverage: true
  105. name: php${{ matrix.php-versions }}-s3
  106. services:
  107. localstack:
  108. env:
  109. SERVICES: s3
  110. DEBUG: 1
  111. image: localstack/localstack
  112. ports:
  113. - "4566:4566"
  114. steps:
  115. - name: Checkout server
  116. uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
  117. with:
  118. submodules: true
  119. - name: Set up php ${{ matrix.php-versions }}
  120. uses: shivammathur/setup-php@4bd44f22a98a19e0950cbad5f31095157cc9621b # v2
  121. with:
  122. php-version: ${{ matrix.php-versions }}
  123. # https://docs.nextcloud.com/server/stable/admin_manual/installation/source_installation.html#prerequisites-for-manual-installation
  124. extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, redis, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite
  125. coverage: ${{ matrix.coverage && 'xdebug' || 'none' }}
  126. ini-file: development
  127. env:
  128. GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  129. - name: Set up Nextcloud
  130. run: |
  131. composer install
  132. ./occ maintenance:install --verbose --database=sqlite --database-name=nextcloud --database-host=127.0.0.1 --database-user=root --database-pass=rootpassword --admin-user admin --admin-pass password
  133. ./occ app:enable --force files_external
  134. echo "<?php return ['run' => true,'hostname' => 'localhost','key' => 'ignored','secret' => 'ignored', 'bucket' => 'bucket', 'port' => 4566, 'use_ssl' => false, 'autocreate' => true, 'use_path_style' => true];" > apps/files_external/tests/config.amazons3.php
  135. - name: PHPUnit
  136. run: composer run test:files_external -- \
  137. apps/files_external/tests/Storage/Amazons3Test.php \
  138. apps/files_external/tests/Storage/VersionedAmazonS3Test.php \
  139. ${{ matrix.coverage && ' --coverage-clover ./clover.xml' || '' }}
  140. - name: Upload code coverage
  141. if: ${{ !cancelled() && matrix.coverage }}
  142. uses: codecov/codecov-action@v4.1.1
  143. with:
  144. files: ./clover.xml
  145. flags: phpunit-files-external-s3
  146. - name: S3 logs
  147. if: always()
  148. run: |
  149. docker ps -a
  150. docker ps -aq | while read container ; do IMAGE=$(docker inspect --format='{{.Config.Image}}' $container); echo $IMAGE; docker logs $container; echo "\n\n" ; done
  151. s3-external-summary:
  152. runs-on: ubuntu-latest-low
  153. needs: [changes, files-external-s3-minio, files-external-s3-localstack]
  154. if: always()
  155. steps:
  156. - name: Summary status
  157. run: if ${{ needs.changes.outputs.src != 'false' && needs.files-external-s3-minio.result != 'success' && needs.files-external-s3-localstack.result != 'success' }}; then exit 1; fi