development.yml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527
  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.23']
  13. os: [ubuntu-latest, macos-latest]
  14. upload-coverage: [true]
  15. include:
  16. - go: '1.23'
  17. os: windows-latest
  18. upload-coverage: false
  19. steps:
  20. - uses: actions/checkout@v4
  21. with:
  22. fetch-depth: 0
  23. - name: Set up Go
  24. uses: actions/setup-go@v5
  25. with:
  26. go-version: ${{ matrix.go }}
  27. - name: Build for Linux/macOS x86_64
  28. if: startsWith(matrix.os, 'windows-') != true
  29. run: |
  30. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
  31. cd tests/eventsearcher
  32. go build -trimpath -ldflags "-s -w" -o eventsearcher
  33. cd -
  34. cd tests/ipfilter
  35. go build -trimpath -ldflags "-s -w" -o ipfilter
  36. cd -
  37. ./sftpgo initprovider
  38. ./sftpgo resetprovider --force
  39. - name: Build for macOS arm64
  40. if: startsWith(matrix.os, 'macos-') == true
  41. run: CGO_ENABLED=1 GOOS=darwin GOARCH=arm64 SDKROOT=$(xcrun --sdk macosx --show-sdk-path) go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo_arm64
  42. - name: Build for Windows
  43. if: startsWith(matrix.os, 'windows-')
  44. run: |
  45. $GIT_COMMIT = (git describe --always --abbrev=8 --dirty) | Out-String
  46. $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String
  47. $LATEST_TAG = ((git describe --tags $(git rev-list --tags --max-count=1)) | Out-String).Trim()
  48. $REV_LIST=$LATEST_TAG+"..HEAD"
  49. $COMMITS_FROM_TAG= ((git rev-list $REV_LIST --count) | Out-String).Trim()
  50. $FILE_VERSION = $LATEST_TAG.substring(1) + "." + $COMMITS_FROM_TAG
  51. go install github.com/tc-hib/go-winres@latest
  52. go-winres simply --arch amd64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0 with additional terms" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico
  53. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o sftpgo.exe
  54. cd tests/eventsearcher
  55. go build -trimpath -ldflags "-s -w" -o eventsearcher.exe
  56. cd ../..
  57. cd tests/ipfilter
  58. go build -trimpath -ldflags "-s -w" -o ipfilter.exe
  59. cd ../..
  60. mkdir arm64
  61. $Env:CGO_ENABLED='0'
  62. $Env:GOOS='windows'
  63. $Env:GOARCH='arm64'
  64. go-winres simply --arch arm64 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0 with additional terms" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico
  65. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\arm64\sftpgo.exe
  66. mkdir x86
  67. $Env:GOARCH='386'
  68. go-winres simply --arch 386 --product-version $LATEST_TAG-dev-$GIT_COMMIT --file-version $FILE_VERSION --file-description "SFTPGo server" --product-name SFTPGo --copyright "AGPL-3.0 with additional terms" --original-filename sftpgo.exe --icon .\windows-installer\icon.ico
  69. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nosqlite -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=$GIT_COMMIT -X github.com/drakkan/sftpgo/v2/internal/version.date=$DATE_TIME" -o .\x86\sftpgo.exe
  70. Remove-Item Env:\CGO_ENABLED
  71. Remove-Item Env:\GOOS
  72. Remove-Item Env:\GOARCH
  73. - name: Run test cases using SQLite provider
  74. run: go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -coverprofile=coverage.txt -covermode=atomic
  75. - name: Upload coverage to Codecov
  76. if: ${{ matrix.upload-coverage }}
  77. uses: codecov/codecov-action@v4
  78. with:
  79. file: ./coverage.txt
  80. fail_ci_if_error: false
  81. token: ${{ secrets.CODECOV_TOKEN }}
  82. - name: Run test cases using bolt provider
  83. run: |
  84. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/config -covermode=atomic
  85. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/common -covermode=atomic
  86. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/httpd -covermode=atomic
  87. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 8m ./internal/sftpd -covermode=atomic
  88. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/ftpd -covermode=atomic
  89. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 5m ./internal/webdavd -covermode=atomic
  90. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/telemetry -covermode=atomic
  91. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/mfa -covermode=atomic
  92. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 2m ./internal/command -covermode=atomic
  93. env:
  94. SFTPGO_DATA_PROVIDER__DRIVER: bolt
  95. SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db'
  96. - name: Run test cases using memory provider
  97. run: go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic
  98. env:
  99. SFTPGO_DATA_PROVIDER__DRIVER: memory
  100. SFTPGO_DATA_PROVIDER__NAME: ''
  101. - name: Prepare build artifact for macOS
  102. if: startsWith(matrix.os, 'macos-') == true
  103. run: |
  104. mkdir -p output/{init,bash_completion,zsh_completion}
  105. cp sftpgo output/sftpgo_x86_64
  106. cp sftpgo_arm64 output/
  107. cp sftpgo.json output/
  108. cp -r templates output/
  109. cp -r static output/
  110. cp -r openapi output/
  111. cp init/com.github.drakkan.sftpgo.plist output/init/
  112. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  113. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  114. ./sftpgo gen man -d output/man/man1
  115. gzip output/man/man1/*
  116. - name: Prepare Windows installer
  117. if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }}
  118. run: |
  119. Remove-Item -LiteralPath "output" -Force -Recurse -ErrorAction Ignore
  120. mkdir output
  121. copy .\sftpgo.exe .\output
  122. copy .\sftpgo.json .\output
  123. copy .\sftpgo.db .\output
  124. copy .\LICENSE .\output\LICENSE.txt
  125. copy .\NOTICE .\output\NOTICE.txt
  126. mkdir output\templates
  127. xcopy .\templates .\output\templates\ /E
  128. mkdir output\static
  129. xcopy .\static .\output\static\ /E
  130. mkdir output\openapi
  131. xcopy .\openapi .\output\openapi\ /E
  132. $LATEST_TAG = ((git describe --tags $(git rev-list --tags --max-count=1)) | Out-String).Trim()
  133. $REV_LIST=$LATEST_TAG+"..HEAD"
  134. $COMMITS_FROM_TAG= ((git rev-list $REV_LIST --count) | Out-String).Trim()
  135. $Env:SFTPGO_ISS_DEV_VERSION = $LATEST_TAG + "." + $COMMITS_FROM_TAG
  136. $CERT_PATH=(Get-Location -PSProvider FileSystem).ProviderPath + "\cert.pfx"
  137. [IO.File]::WriteAllBytes($CERT_PATH,[System.Convert]::FromBase64String($Env:CERT_DATA))
  138. certutil -f -p "$Env:CERT_PASS" -importpfx MY "$CERT_PATH"
  139. rm "$CERT_PATH"
  140. & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\sftpgo.exe
  141. & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\arm64\sftpgo.exe
  142. & 'C:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe' sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n "Nicola Murino" /d "SFTPGo" .\x86\sftpgo.exe
  143. $INNO_S='/Ssigntool=$qC:/Program Files (x86)/Windows Kits/10/bin/10.0.20348.0/x86/signtool.exe$q sign /sm /tr http://timestamp.sectigo.com /td sha256 /fd sha256 /n $qNicola Murino$q /d $qSFTPGo$q $f'
  144. iscc "$INNO_S" .\windows-installer\sftpgo.iss
  145. rm .\output\sftpgo.exe
  146. rm .\output\sftpgo.db
  147. copy .\arm64\sftpgo.exe .\output
  148. (Get-Content .\output\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\output\sftpgo.json
  149. $Env:SFTPGO_DATA_PROVIDER__DRIVER='bolt'
  150. $Env:SFTPGO_DATA_PROVIDER__NAME='.\output\sftpgo.db'
  151. .\sftpgo.exe initprovider
  152. Remove-Item Env:\SFTPGO_DATA_PROVIDER__DRIVER
  153. Remove-Item Env:\SFTPGO_DATA_PROVIDER__NAME
  154. $Env:SFTPGO_ISS_ARCH='arm64'
  155. iscc "$INNO_S" .\windows-installer\sftpgo.iss
  156. rm .\output\sftpgo.exe
  157. copy .\x86\sftpgo.exe .\output
  158. $Env:SFTPGO_ISS_ARCH='x86'
  159. iscc "$INNO_S" .\windows-installer\sftpgo.iss
  160. certutil -delstore MY "Nicola Murino"
  161. env:
  162. CERT_DATA: ${{ secrets.CERT_DATA }}
  163. CERT_PASS: ${{ secrets.CERT_PASS }}
  164. - name: Upload Windows installer x86_64 artifact
  165. if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }}
  166. uses: actions/upload-artifact@v4
  167. with:
  168. name: sftpgo_windows_installer_x86_64
  169. path: ./sftpgo_windows_x86_64.exe
  170. - name: Upload Windows installer arm64 artifact
  171. if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }}
  172. uses: actions/upload-artifact@v4
  173. with:
  174. name: sftpgo_windows_installer_arm64
  175. path: ./sftpgo_windows_arm64.exe
  176. - name: Upload Windows installer x86 artifact
  177. if: ${{ startsWith(matrix.os, 'windows-') && github.event_name != 'pull_request' }}
  178. uses: actions/upload-artifact@v4
  179. with:
  180. name: sftpgo_windows_installer_x86
  181. path: ./sftpgo_windows_x86.exe
  182. - name: Prepare build artifact for Windows
  183. if: startsWith(matrix.os, 'windows-')
  184. run: |
  185. Remove-Item -LiteralPath "output" -Force -Recurse -ErrorAction Ignore
  186. mkdir output
  187. copy .\sftpgo.exe .\output
  188. mkdir output\arm64
  189. copy .\arm64\sftpgo.exe .\output\arm64
  190. mkdir output\x86
  191. copy .\x86\sftpgo.exe .\output\x86
  192. copy .\sftpgo.json .\output
  193. (Get-Content .\output\sftpgo.json).replace('"sqlite"', '"bolt"') | Set-Content .\output\sftpgo.json
  194. mkdir output\templates
  195. xcopy .\templates .\output\templates\ /E
  196. mkdir output\static
  197. xcopy .\static .\output\static\ /E
  198. mkdir output\openapi
  199. xcopy .\openapi .\output\openapi\ /E
  200. - name: Upload build artifact
  201. if: startsWith(matrix.os, 'ubuntu-') != true
  202. uses: actions/upload-artifact@v4
  203. with:
  204. name: sftpgo-${{ matrix.os }}-go-${{ matrix.go }}
  205. path: output
  206. test-build-flags:
  207. name: Test build flags
  208. runs-on: ubuntu-latest
  209. steps:
  210. - uses: actions/checkout@v4
  211. - name: Set up Go
  212. uses: actions/setup-go@v5
  213. with:
  214. go-version: '1.23'
  215. - name: Build
  216. run: |
  217. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,nogcs,nos3,noportable,nobolt,nomysql,nopgsql,nosqlite,nometrics,noazblob,unixcrypt -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
  218. ./sftpgo -v
  219. cp -r openapi static templates internal/bundle/
  220. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules,bundle -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
  221. ./sftpgo -v
  222. test-postgresql-mysql-crdb:
  223. name: Test with PgSQL/MySQL/Cockroach
  224. runs-on: ubuntu-latest
  225. services:
  226. postgres:
  227. image: postgres:latest
  228. env:
  229. POSTGRES_PASSWORD: postgres
  230. POSTGRES_DB: sftpgo
  231. options: >-
  232. --health-cmd pg_isready
  233. --health-interval 10s
  234. --health-timeout 5s
  235. --health-retries 5
  236. ports:
  237. - 5432:5432
  238. mariadb:
  239. image: mariadb:latest
  240. env:
  241. MYSQL_ROOT_PASSWORD: mysql
  242. MYSQL_DATABASE: sftpgo
  243. MYSQL_USER: sftpgo
  244. MYSQL_PASSWORD: sftpgo
  245. options: >-
  246. --health-cmd "mariadb-admin status -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD"
  247. --health-interval 10s
  248. --health-timeout 5s
  249. --health-retries 6
  250. ports:
  251. - 3307:3306
  252. mysql:
  253. image: mysql:latest
  254. env:
  255. MYSQL_ROOT_PASSWORD: mysql
  256. MYSQL_DATABASE: sftpgo
  257. MYSQL_USER: sftpgo
  258. MYSQL_PASSWORD: sftpgo
  259. options: >-
  260. --health-cmd "mysqladmin status -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD"
  261. --health-interval 10s
  262. --health-timeout 5s
  263. --health-retries 6
  264. ports:
  265. - 3308:3306
  266. steps:
  267. - uses: actions/checkout@v4
  268. - name: Set up Go
  269. uses: actions/setup-go@v5
  270. with:
  271. go-version: '1.23'
  272. - name: Build
  273. run: |
  274. go build -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=`git describe --always --abbrev=8 --dirty` -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
  275. cd tests/eventsearcher
  276. go build -trimpath -ldflags "-s -w" -o eventsearcher
  277. cd -
  278. cd tests/ipfilter
  279. go build -trimpath -ldflags "-s -w" -o ipfilter
  280. cd -
  281. - name: Run tests using MySQL provider
  282. run: |
  283. ./sftpgo initprovider
  284. ./sftpgo resetprovider --force
  285. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic
  286. env:
  287. SFTPGO_DATA_PROVIDER__DRIVER: mysql
  288. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  289. SFTPGO_DATA_PROVIDER__HOST: localhost
  290. SFTPGO_DATA_PROVIDER__PORT: 3308
  291. SFTPGO_DATA_PROVIDER__USERNAME: sftpgo
  292. SFTPGO_DATA_PROVIDER__PASSWORD: sftpgo
  293. - name: Run tests using PostgreSQL provider
  294. run: |
  295. ./sftpgo initprovider
  296. ./sftpgo resetprovider --force
  297. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic
  298. env:
  299. SFTPGO_DATA_PROVIDER__DRIVER: postgresql
  300. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  301. SFTPGO_DATA_PROVIDER__HOST: localhost
  302. SFTPGO_DATA_PROVIDER__PORT: 5432
  303. SFTPGO_DATA_PROVIDER__USERNAME: postgres
  304. SFTPGO_DATA_PROVIDER__PASSWORD: postgres
  305. - name: Run tests using MariaDB provider
  306. run: |
  307. ./sftpgo initprovider
  308. ./sftpgo resetprovider --force
  309. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic
  310. env:
  311. SFTPGO_DATA_PROVIDER__DRIVER: mysql
  312. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  313. SFTPGO_DATA_PROVIDER__HOST: localhost
  314. SFTPGO_DATA_PROVIDER__PORT: 3307
  315. SFTPGO_DATA_PROVIDER__USERNAME: sftpgo
  316. SFTPGO_DATA_PROVIDER__PASSWORD: sftpgo
  317. SFTPGO_DATA_PROVIDER__SQL_TABLES_PREFIX: prefix_
  318. - name: Run tests using CockroachDB provider
  319. run: |
  320. 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 :26257
  321. sleep 10
  322. docker exec crdb cockroach sql --insecure -e 'create database "sftpgo"'
  323. ./sftpgo initprovider
  324. ./sftpgo resetprovider --force
  325. go test -v -tags nopgxregisterdefaulttypes,disable_grpc_modules -p 1 -timeout 15m ./... -covermode=atomic
  326. docker stop crdb
  327. env:
  328. SFTPGO_DATA_PROVIDER__DRIVER: cockroachdb
  329. SFTPGO_DATA_PROVIDER__NAME: sftpgo
  330. SFTPGO_DATA_PROVIDER__HOST: localhost
  331. SFTPGO_DATA_PROVIDER__PORT: 26257
  332. SFTPGO_DATA_PROVIDER__USERNAME: root
  333. SFTPGO_DATA_PROVIDER__PASSWORD:
  334. SFTPGO_DATA_PROVIDER__TARGET_SESSION_ATTRS: any
  335. SFTPGO_DATA_PROVIDER__SQL_TABLES_PREFIX: prefix_
  336. build-linux-packages:
  337. name: Build Linux packages
  338. runs-on: ubuntu-latest
  339. strategy:
  340. matrix:
  341. include:
  342. - arch: amd64
  343. distro: ubuntu:18.04
  344. go: latest
  345. go-arch: amd64
  346. - arch: aarch64
  347. distro: ubuntu18.04
  348. go: latest
  349. go-arch: arm64
  350. - arch: ppc64le
  351. distro: ubuntu18.04
  352. go: latest
  353. go-arch: ppc64le
  354. - arch: armv7
  355. distro: ubuntu18.04
  356. go: latest
  357. go-arch: arm7
  358. steps:
  359. - uses: actions/checkout@v4
  360. with:
  361. fetch-depth: 0
  362. - name: Get commit SHA
  363. id: get_commit
  364. run: echo "COMMIT=${GITHUB_SHA::8}" >> $GITHUB_OUTPUT
  365. shell: bash
  366. - name: Build on amd64
  367. if: ${{ matrix.arch == 'amd64' }}
  368. run: |
  369. echo '#!/bin/bash' > build.sh
  370. echo '' >> build.sh
  371. echo 'set -e' >> build.sh
  372. echo 'apt-get update -q -y' >> build.sh
  373. echo 'apt-get install -q -y curl gcc' >> build.sh
  374. if [ ${{ matrix.go }} == 'latest' ]
  375. then
  376. echo 'GO_VERSION=$(curl -L https://go.dev/VERSION?m=text | head -n 1)' >> build.sh
  377. else
  378. echo 'GO_VERSION=${{ matrix.go }}' >> build.sh
  379. fi
  380. echo 'GO_DOWNLOAD_ARCH=${{ matrix.go-arch }}' >> build.sh
  381. echo 'curl --retry 5 --retry-delay 2 --connect-timeout 10 -o go.tar.gz -L https://go.dev/dl/${GO_VERSION}.linux-${GO_DOWNLOAD_ARCH}.tar.gz' >> build.sh
  382. echo 'tar -C /usr/local -xzf go.tar.gz' >> build.sh
  383. echo 'export PATH=$PATH:/usr/local/go/bin' >> build.sh
  384. echo 'go version' >> build.sh
  385. echo 'cd /usr/local/src' >> build.sh
  386. echo 'go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo' >> build.sh
  387. chmod 755 build.sh
  388. docker run --rm --name ubuntu-build --mount type=bind,source=`pwd`,target=/usr/local/src ${{ matrix.distro }} /usr/local/src/build.sh
  389. mkdir -p output/{init,bash_completion,zsh_completion}
  390. cp sftpgo.json output/
  391. cp -r templates output/
  392. cp -r static output/
  393. cp -r openapi output/
  394. cp init/sftpgo.service output/init/
  395. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  396. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  397. ./sftpgo gen man -d output/man/man1
  398. gzip output/man/man1/*
  399. cp sftpgo output/
  400. - uses: uraimo/run-on-arch-action@v2
  401. if: ${{ matrix.arch != 'amd64' }}
  402. name: Build for ${{ matrix.arch }}
  403. id: build
  404. with:
  405. arch: ${{ matrix.arch }}
  406. distro: ${{ matrix.distro }}
  407. setup: |
  408. mkdir -p "${PWD}/output"
  409. dockerRunArgs: |
  410. --volume "${PWD}/output:/output"
  411. shell: /bin/bash
  412. install: |
  413. apt-get update -q -y
  414. apt-get install -q -y curl gcc
  415. if [ ${{ matrix.go }} == 'latest' ]
  416. then
  417. GO_VERSION=$(curl -L https://go.dev/VERSION?m=text | head -n 1)
  418. else
  419. GO_VERSION=${{ matrix.go }}
  420. fi
  421. GO_DOWNLOAD_ARCH=${{ matrix.go-arch }}
  422. if [ ${{ matrix.arch}} == 'armv7' ]
  423. then
  424. GO_DOWNLOAD_ARCH=armv6l
  425. fi
  426. curl --retry 5 --retry-delay 2 --connect-timeout 10 -o go.tar.gz -L https://go.dev/dl/${GO_VERSION}.linux-${GO_DOWNLOAD_ARCH}.tar.gz
  427. tar -C /usr/local -xzf go.tar.gz
  428. run: |
  429. export PATH=$PATH:/usr/local/go/bin
  430. go version
  431. if [ ${{ matrix.arch}} == 'armv7' ]
  432. then
  433. export GOARM=7
  434. fi
  435. go build -buildvcs=false -trimpath -tags nopgxregisterdefaulttypes,disable_grpc_modules -ldflags "-s -w -X github.com/drakkan/sftpgo/v2/internal/version.commit=${{ steps.get_commit.outputs.COMMIT }} -X github.com/drakkan/sftpgo/v2/internal/version.date=`date -u +%FT%TZ`" -o sftpgo
  436. mkdir -p output/{init,bash_completion,zsh_completion}
  437. cp sftpgo.json output/
  438. cp -r templates output/
  439. cp -r static output/
  440. cp -r openapi output/
  441. cp init/sftpgo.service output/init/
  442. ./sftpgo gen completion bash > output/bash_completion/sftpgo
  443. ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo
  444. ./sftpgo gen man -d output/man/man1
  445. gzip output/man/man1/*
  446. cp sftpgo output/
  447. - name: Upload build artifact
  448. uses: actions/upload-artifact@v4
  449. with:
  450. name: sftpgo-linux-${{ matrix.arch }}-go-${{ matrix.go }}
  451. path: output
  452. - name: Build Packages
  453. id: build_linux_pkgs
  454. run: |
  455. export NFPM_ARCH=${{ matrix.go-arch }}
  456. cd pkgs
  457. ./build.sh
  458. PKG_VERSION=$(cat dist/version)
  459. echo "pkg-version=${PKG_VERSION}" >> $GITHUB_OUTPUT
  460. - name: Upload Debian Package
  461. uses: actions/upload-artifact@v4
  462. with:
  463. name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-deb
  464. path: pkgs/dist/deb/*
  465. - name: Upload RPM Package
  466. uses: actions/upload-artifact@v4
  467. with:
  468. name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-${{ matrix.go-arch }}-rpm
  469. path: pkgs/dist/rpm/*
  470. golangci-lint:
  471. name: golangci-lint
  472. runs-on: ubuntu-latest
  473. steps:
  474. - name: Set up Go
  475. uses: actions/setup-go@v5
  476. with:
  477. go-version: '1.23'
  478. - uses: actions/checkout@v4
  479. - name: Run golangci-lint
  480. uses: golangci/golangci-lint-action@v6
  481. with:
  482. version: latest