development.yml 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. name: CI
  2. on:
  3. push:
  4. branches: [main]
  5. pull_request:
  6. jobs:
  7. test-deploy:
  8. name: Test and deploy
  9. runs-on: ${{ matrix.os }}
  10. strategy:
  11. matrix:
  12. go: [1.16]
  13. os: [ubuntu-latest, macos-latest]
  14. upload-coverage: [true]
  15. include:
  16. - go: 1.16
  17. os: windows-latest
  18. upload-coverage: false
  19. steps:
  20. - uses: actions/checkout@v2
  21. with:
  22. fetch-depth: 0
  23. - name: Set up Go
  24. uses: actions/setup-go@v2
  25. with:
  26. go-version: ${{ matrix.go }}
  27. - name: Build for Linux/macOS
  28. if: startsWith(matrix.os, 'windows-') != true
  29. run: go build -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -o sftpgo
  30. - name: Build for Windows
  31. if: startsWith(matrix.os, 'windows-')
  32. run: |
  33. $GIT_COMMIT = (git describe --always --dirty) | Out-String
  34. $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String
  35. go build -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/version.date=$DATE_TIME" -o sftpgo.exe
  36. - name: Run test cases using SQLite provider
  37. run: go test -v -p 1 -timeout 10m ./... -coverprofile=coverage.txt -covermode=atomic
  38. - name: Upload coverage to Codecov
  39. if: ${{ matrix.upload-coverage }}
  40. uses: codecov/codecov-action@v1
  41. with:
  42. file: ./coverage.txt
  43. fail_ci_if_error: false
  44. - name: Run test cases using bolt provider
  45. run: |
  46. go test -v -p 1 -timeout 2m ./config -covermode=atomic
  47. go test -v -p 1 -timeout 2m ./common -covermode=atomic
  48. go test -v -p 1 -timeout 3m ./httpd -covermode=atomic
  49. go test -v -p 1 -timeout 8m ./sftpd -covermode=atomic
  50. go test -v -p 1 -timeout 2m ./ftpd -covermode=atomic
  51. go test -v -p 1 -timeout 2m ./webdavd -covermode=atomic
  52. go test -v -p 1 -timeout 2m ./telemetry -covermode=atomic
  53. env:
  54. SFTPGO_DATA_PROVIDER__DRIVER: bolt
  55. SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db'
  56. - name: Run test cases using memory provider
  57. run: go test -v -p 1 -timeout 10m ./... -covermode=atomic
  58. env:
  59. SFTPGO_DATA_PROVIDER__DRIVER: memory
  60. SFTPGO_DATA_PROVIDER__NAME: ''
  61. - name: Prepare build artifact for macOS
  62. if: startsWith(matrix.os, 'macos-') == true
  63. run: |
  64. mkdir -p output/{init,bash_completion,zsh_completion}
  65. cp sftpgo output/
  66. cp sftpgo.json output/
  67. cp -r templates output/
  68. cp -r static output/
  69. cp init/com.github.drakkan.sftpgo.plist output/init/
  70. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  71. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  72. ./sftpgo gen man -d output/man/man1
  73. gzip output/man/man1/*
  74. - name: Prepare build artifact for Windows
  75. if: startsWith(matrix.os, 'windows-')
  76. run: |
  77. mkdir output
  78. copy .\sftpgo.exe .\output
  79. copy .\sftpgo.json .\output
  80. mkdir output\templates
  81. xcopy .\templates .\output\templates\ /E
  82. mkdir output\static
  83. xcopy .\static .\output\static\ /E
  84. - name: Upload build artifact
  85. if: startsWith(matrix.os, 'ubuntu-') != true
  86. uses: actions/upload-artifact@v2
  87. with:
  88. name: sftpgo-${{ matrix.os }}-go-${{ matrix.go }}
  89. path: output
  90. test-postgresql-mysql-crdb:
  91. name: Test with PgSQL/MySQL/Cockroach
  92. runs-on: ubuntu-latest
  93. services:
  94. postgres:
  95. image: postgres:latest
  96. env:
  97. POSTGRES_PASSWORD: postgres
  98. POSTGRES_DB: sftpgo
  99. options: >-
  100. --health-cmd pg_isready
  101. --health-interval 10s
  102. --health-timeout 5s
  103. --health-retries 5
  104. ports:
  105. - 5432:5432
  106. mariadb:
  107. image: mariadb:latest
  108. env:
  109. MYSQL_ROOT_PASSWORD: mysql
  110. MYSQL_DATABASE: sftpgo
  111. MYSQL_USER: sftpgo
  112. MYSQL_PASSWORD: sftpgo
  113. options: >-
  114. --health-cmd "mysqladmin status -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD"
  115. --health-interval 10s
  116. --health-timeout 5s
  117. --health-retries 6
  118. ports:
  119. - 3307:3306
  120. steps:
  121. - uses: actions/checkout@v2
  122. - name: Set up Go
  123. uses: actions/setup-go@v2
  124. with:
  125. go-version: 1.16
  126. - name: Build
  127. run: go build -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -o sftpgo
  128. - name: Run tests using PostgreSQL provider
  129. run: |
  130. go test -v -p 1 -timeout 10m ./... -covermode=atomic
  131. env:
  132. SFTPGO_DATA_PROVIDER__DRIVER: postgresql
  133. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  134. SFTPGO_DATA_PROVIDER__HOST: localhost
  135. SFTPGO_DATA_PROVIDER__PORT: 5432
  136. SFTPGO_DATA_PROVIDER__USERNAME: postgres
  137. SFTPGO_DATA_PROVIDER__PASSWORD: postgres
  138. - name: Run tests using MySQL provider
  139. run: |
  140. go test -v -p 1 -timeout 10m ./... -covermode=atomic
  141. env:
  142. SFTPGO_DATA_PROVIDER__DRIVER: mysql
  143. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  144. SFTPGO_DATA_PROVIDER__HOST: localhost
  145. SFTPGO_DATA_PROVIDER__PORT: 3307
  146. SFTPGO_DATA_PROVIDER__USERNAME: sftpgo
  147. SFTPGO_DATA_PROVIDER__PASSWORD: sftpgo
  148. - name: Run tests using CockroachDB provider
  149. run: |
  150. docker run --rm --name crdb --health-cmd "curl -I http://127.0.0.1:8080" --health-interval 10s --health-timeout 5s --health-retries 6 -p 26257:26257 -d cockroachdb/cockroach:latest start-single-node --insecure --listen-addr 0.0.0.0:26257
  151. docker exec crdb cockroach sql --insecure -e 'create database "sftpgo"'
  152. go test -v -p 1 -timeout 10m ./... -covermode=atomic
  153. docker stop crdb
  154. env:
  155. SFTPGO_DATA_PROVIDER__DRIVER: cockroachdb
  156. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  157. SFTPGO_DATA_PROVIDER__HOST: localhost
  158. SFTPGO_DATA_PROVIDER__PORT: 26257
  159. SFTPGO_DATA_PROVIDER__USERNAME: root
  160. SFTPGO_DATA_PROVIDER__PASSWORD:
  161. build-linux-packages:
  162. name: Build Linux packages
  163. runs-on: ubuntu-18.04
  164. strategy:
  165. matrix:
  166. include:
  167. - arch: amd64
  168. go: 1.16
  169. go-arch: amd64
  170. - arch: aarch64
  171. distro: ubuntu18.04
  172. go: latest
  173. go-arch: arm64
  174. - arch: ppc64le
  175. distro: ubuntu18.04
  176. go: latest
  177. go-arch: ppc64le
  178. steps:
  179. - uses: actions/checkout@v2
  180. with:
  181. fetch-depth: 0
  182. - name: Set up Go
  183. if: ${{ matrix.arch == 'amd64' }}
  184. uses: actions/setup-go@v2
  185. with:
  186. go-version: ${{ matrix.go }}
  187. - name: Build on amd64
  188. if: ${{ matrix.arch == 'amd64' }}
  189. run: |
  190. go build -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -o sftpgo
  191. mkdir -p output/{init,bash_completion,zsh_completion}
  192. cp sftpgo.json output/
  193. cp -r templates output/
  194. cp -r static output/
  195. cp init/sftpgo.service output/init/
  196. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  197. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  198. ./sftpgo gen man -d output/man/man1
  199. gzip output/man/man1/*
  200. cp sftpgo output/
  201. - uses: uraimo/[email protected]
  202. if: ${{ matrix.arch != 'amd64' }}
  203. name: Build for ${{ matrix.arch }}
  204. id: build
  205. with:
  206. arch: ${{ matrix.arch }}
  207. distro: ${{ matrix.distro }}
  208. setup: |
  209. mkdir -p "${PWD}/output"
  210. dockerRunArgs: |
  211. --volume "${PWD}/output:/output"
  212. shell: /bin/bash
  213. install: |
  214. apt-get update -q -y
  215. apt-get install -q -y curl gcc git
  216. if [ ${{ matrix.go }} == 'latest' ]
  217. then
  218. GO_VERSION=$(curl https://golang.org/VERSION?m=text)
  219. else
  220. GO_VERSION=${{ matrix.go }}
  221. fi
  222. curl --retry 5 --retry-delay 2 --connect-timeout 10 -o go.tar.gz -L https://golang.org/dl/${GO_VERSION}.linux-${{ matrix.go-arch }}.tar.gz
  223. tar -C /usr/local -xzf go.tar.gz
  224. run: |
  225. export PATH=$PATH:/usr/local/go/bin
  226. go build -ldflags "-s -w -X github.com/drakkan/sftpgo/version.commit=`git describe --always --dirty` -X github.com/drakkan/sftpgo/version.date=`date -u +%FT%TZ`" -o sftpgo
  227. mkdir -p output/{init,bash_completion,zsh_completion}
  228. cp sftpgo.json output/
  229. cp -r templates output/
  230. cp -r static output/
  231. cp init/sftpgo.service output/init/
  232. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  233. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  234. ./sftpgo gen man -d output/man/man1
  235. gzip output/man/man1/*
  236. cp sftpgo output/
  237. - name: Upload build artifact
  238. uses: actions/upload-artifact@v2
  239. with:
  240. name: sftpgo-linux-${{ matrix.arch }}-go-${{ matrix.go }}
  241. path: output
  242. - name: Build Packages
  243. id: build_linux_pkgs
  244. run: |
  245. export NFPM_ARCH=${{ matrix.go-arch }}
  246. cd pkgs
  247. ./build.sh
  248. PKG_VERSION=$(cat dist/version)
  249. echo "::set-output name=pkg-version::${PKG_VERSION}"
  250. - name: Upload Debian Package
  251. uses: actions/upload-artifact@v2
  252. with:
  253. name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-deb
  254. path: pkgs/dist/deb/*
  255. - name: Upload RPM Package
  256. uses: actions/upload-artifact@v2
  257. with:
  258. name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-rpm
  259. path: pkgs/dist/rpm/*
  260. golangci-lint:
  261. name: golangci-lint
  262. runs-on: ubuntu-latest
  263. steps:
  264. - uses: actions/checkout@v2
  265. - name: Set up Go
  266. uses: actions/setup-go@v2
  267. with:
  268. go-version: 1.16
  269. - name: Run golangci-lint
  270. uses: golangci/golangci-lint-action@v2
  271. with:
  272. version: latest
  273. skip-go-installation: true