name: CI on: push: branches: [main] pull_request: jobs: test-deploy: name: Test and deploy runs-on: ${{ matrix.os }} strategy: matrix: go: [1.15] os: [ubuntu-latest, macos-latest] upload-coverage: [true] include: #- go: 1.14 # os: ubuntu-latest # upload-coverage: false - go: 1.15 os: windows-latest upload-coverage: false steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Go uses: actions/setup-go@v2 with: go-version: ${{ matrix.go }} - name: Build for Linux/macOS if: startsWith(matrix.os, 'windows-') != true 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 - name: Build for Windows if: startsWith(matrix.os, 'windows-') run: | $GIT_COMMIT = (git describe --always --dirty) | Out-String $DATE_TIME = ([datetime]::Now.ToUniversalTime().toString("yyyy-MM-ddTHH:mm:ssZ")) | Out-String 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 - name: Run test cases using SQLite provider run: go test -v -p 1 -timeout 10m ./... -coverprofile=coverage.txt -covermode=atomic - name: Upload coverage to Codecov if: ${{ matrix.upload-coverage }} uses: codecov/codecov-action@v1 with: file: ./coverage.txt fail_ci_if_error: false - name: Run test cases using bolt provider run: | go test -v -p 1 -timeout 2m ./config -covermode=atomic go test -v -p 1 -timeout 2m ./common -covermode=atomic go test -v -p 1 -timeout 3m ./httpd -covermode=atomic go test -v -p 1 -timeout 8m ./sftpd -covermode=atomic go test -v -p 1 -timeout 2m ./ftpd -covermode=atomic go test -v -p 1 -timeout 2m ./webdavd -covermode=atomic go test -v -p 1 -timeout 2m ./telemetry -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: bolt SFTPGO_DATA_PROVIDER__NAME: 'sftpgo_bolt.db' - name: Run test cases using memory provider run: go test -v -p 1 -timeout 10m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: memory SFTPGO_DATA_PROVIDER__NAME: '' - name: Gather cross build info id: cross_info if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} run: | GIT_COMMIT=$(git describe --always) BUILD_DATE=$(date -u +%FT%TZ) echo ::set-output name=sha::${GIT_COMMIT} echo ::set-output name=created::${BUILD_DATE} - name: Cross build with xgo if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: crazy-max/ghaction-xgo@v1 with: dest: cross prefix: sftpgo targets: linux/arm64,linux/ppc64le v: true x: false race: false ldflags: -s -w -X github.com/drakkan/sftpgo/version.commit=${{ steps.cross_info.outputs.sha }} -X github.com/drakkan/sftpgo/version.date=${{ steps.cross_info.outputs.created }} buildmode: default - name: Prepare build artifact for Linux/macOS if: startsWith(matrix.os, 'windows-') != true run: | mkdir -p output/{bash_completion,zsh_completion} cp sftpgo output/ cp sftpgo.json output/ cp -r templates output/ cp -r static output/ cp -r init output/ ./sftpgo gen completion bash > output/bash_completion/sftpgo ./sftpgo gen completion zsh > output/zsh_completion/_sftpgo ./sftpgo gen man -d output/man/man1 gzip output/man/man1/* - name: Copy cross compiled Linux binaries if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} run: | cp cross/sftpgo-linux-arm64 output/ cp cross/sftpgo-linux-ppc64le output/ - name: Prepare build artifact for Windows if: startsWith(matrix.os, 'windows-') run: | mkdir output copy .\sftpgo.exe .\output copy .\sftpgo.json .\output mkdir output\templates xcopy .\templates .\output\templates\ /E mkdir output\static xcopy .\static .\output\static\ /E - name: Upload build artifact uses: actions/upload-artifact@v2 with: name: sftpgo-${{ matrix.os }}-go${{ matrix.go }} path: output - name: Build Linux Packages id: build_linux_pkgs if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} run: | cp -r pkgs pkgs_arm64 cp -r pkgs pkgs_ppc64le cd pkgs ./build.sh cd .. export NFPM_ARCH=arm64 export BIN_SUFFIX=-linux-arm64 cp cross/sftpgo${BIN_SUFFIX} . cd pkgs_arm64 ./build.sh cd .. export NFPM_ARCH=ppc64le export BIN_SUFFIX=-linux-ppc64le cp cross/sftpgo${BIN_SUFFIX} . cd pkgs_ppc64le ./build.sh PKG_VERSION=$(cat dist/version) echo "::set-output name=pkg-version::${PKG_VERSION}" - name: Upload Debian Package if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-x86_64-deb path: pkgs/dist/deb/* - name: Upload RPM Package if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-x86_64-rpm path: pkgs/dist/rpm/* - name: Upload Debian Package arm64 if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-arm64-deb path: pkgs_arm64/dist/deb/* - name: Upload RPM Package arm64 if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-arm64-rpm path: pkgs_arm64/dist/rpm/* - name: Upload Debian Package ppc64le if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-ppc64le-deb path: pkgs_ppc64le/dist/deb/* - name: Upload RPM Package ppc64le if: ${{ matrix.upload-coverage && startsWith(matrix.os, 'ubuntu-') }} uses: actions/upload-artifact@v2 with: name: sftpgo-${{ steps.build_linux_pkgs.outputs.pkg-version }}-ppc64le-rpm path: pkgs_ppc64le/dist/rpm/* test-postgresql-mysql: name: Test with PostgreSQL/MySQL runs-on: ubuntu-latest services: postgres: image: postgres:latest env: POSTGRES_PASSWORD: postgres POSTGRES_DB: sftpgo options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 mariadb: image: mariadb:latest env: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: sftpgo MYSQL_USER: sftpgo MYSQL_PASSWORD: sftpgo options: >- --health-cmd "mysqladmin status -h 127.0.0.1 -P 3306 -u root -p$MYSQL_ROOT_PASSWORD" --health-interval 10s --health-timeout 5s --health-retries 6 ports: - 3307:3306 steps: - uses: actions/checkout@v2 - name: Set up Go uses: actions/setup-go@v2 with: go-version: 1.15 - name: Build 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 - name: Run tests using PostgreSQL provider run: | go test -v -p 1 -timeout 10m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: postgresql SFTPGO_DATA_PROVIDER__NAME: sftpgo SFTPGO_DATA_PROVIDER__HOST: localhost SFTPGO_DATA_PROVIDER__PORT: 5432 SFTPGO_DATA_PROVIDER__USERNAME: postgres SFTPGO_DATA_PROVIDER__PASSWORD: postgres - name: Run tests using MySQL provider run: | go test -v -p 1 -timeout 10m ./... -covermode=atomic env: SFTPGO_DATA_PROVIDER__DRIVER: mysql SFTPGO_DATA_PROVIDER__NAME: sftpgo SFTPGO_DATA_PROVIDER__HOST: localhost SFTPGO_DATA_PROVIDER__PORT: 3307 SFTPGO_DATA_PROVIDER__USERNAME: sftpgo SFTPGO_DATA_PROVIDER__PASSWORD: sftpgo golangci-lint: name: golangci-lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Run golangci-lint uses: golangci/golangci-lint-action@v2 with: version: latest