name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] release: types: [ published ] env: GO_VERSION: '1.21' REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: test: name: Test runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Cache Go modules uses: actions/cache@v3 with: path: | ~/.cache/go-build ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go- - name: Download dependencies run: go mod download - name: Run linter uses: golangci/golangci-lint-action@v3 with: version: latest args: --timeout=5m - name: Run tests run: go test -v -race -coverprofile=coverage.out ./... - name: Generate coverage report run: go tool cover -html=coverage.out -o coverage.html - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage.out flags: unittests name: codecov-umbrella fail_ci_if_error: false security: name: Security Scan runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Run vulnerability check run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./... build: name: Build runs-on: ubuntu-latest needs: [test, security] strategy: matrix: os: [linux, darwin, windows] arch: [amd64, arm64] exclude: - os: windows arch: arm64 steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v4 with: go-version: ${{ env.GO_VERSION }} - name: Build for ${{ matrix.os }}/${{ matrix.arch }} env: GOOS: ${{ matrix.os }} GOARCH: ${{ matrix.arch }} CGO_ENABLED: 0 run: | if [ "$GOOS" = "windows" ]; then go build -ldflags="-w -s -X 'main.Version=${{ github.ref_name }}'" -o subconverter-go.exe main.go else go build -ldflags="-w -s -X 'main.Version=${{ github.ref_name }}'" -o subconverter-go main.go fi - name: Upload artifacts uses: actions/upload-artifact@v3 with: name: subconverter-go-${{ matrix.os }}-${{ matrix.arch }} path: | subconverter-go* config.yaml.example docker: name: Build Docker Image runs-on: ubuntu-latest needs: [test, security] if: github.event_name != 'pull_request' steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Log in to Container Registry if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | type=ref,event=branch type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} type=semver,pattern={{major}} type=sha - name: Build and push uses: docker/build-push-action@v5 with: context: . platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max release: name: Create Release runs-on: ubuntu-latest needs: [build, docker] if: github.event_name == 'release' && github.event.action == 'published' steps: - name: Checkout code uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v3 - name: Create Release uses: softprops/action-gh-release@v1 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: | ## Changes in this Release - TODO: Add release notes here ## Installation ```bash # Download the binary for your platform curl -LO https://github.com/${{ github.repository }}/releases/download/${{ github.ref_name }}/subconverter-go-linux-amd64 chmod +x subconverter-go-linux-amd64 # Run the service ./subconverter-go-linux-amd64 --config config.yaml ``` ## Docker ```bash docker run -p 25500:25500 ghcr.io/${{ github.repository }}:${{ github.ref_name }} ``` files: | subconverter-go-linux-amd64/subconverter-go* subconverter-go-linux-arm64/subconverter-go* subconverter-go-darwin-amd64/subconverter-go* subconverter-go-darwin-arm64/subconverter-go* subconverter-go-windows-amd64/subconverter-go* draft: false prerelease: ${{ contains(github.ref_name, 'beta') || contains(github.ref_name, 'alpha') }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}