name: ci 'on': push: branches: - '**' pull_request: workflow_dispatch: env: REGISTRY: gcr.forust.xyz IMAGE_NAME: forust/gosleep-timer jobs: lint-go: runs-on: [self-hosted, linux, arch, homelab] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.23' - name: Lint with golangci-lint uses: golangci/golangci-lint-action@v6 with: version: latest args: --config .golangci.yml --timeout 10m - name: Run staticcheck shell: bash run: | go install honnef.co/go/tools/cmd/staticcheck@latest staticcheck ./... - name: Run gosec shell: bash run: | go install github.com/securego/gosec/v2/cmd/gosec@latest gosec -no-fail -fmt=text ./... - name: Run revive shell: bash run: | go install github.com/mgechev/revive@latest revive -config .revive.toml ./... lint-yaml: runs-on: [self-hosted, linux, arch, homelab] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Lint YAML syntax shell: bash run: | docker run --rm \ -v "$PWD:/work" \ -w /work \ cytopia/yamllint:latest \ -c .yamllint . build: runs-on: [self-hosted, linux, arch, homelab] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.23' - name: Build shell: bash run: go build -ldflags="-s -w" -o gosleep-timer . - name: Test shell: bash run: go test -v -race -coverprofile=cover.out ./... - name: Upload artifact uses: actions/upload-artifact@v4 with: name: gosleep-timer path: gosleep-timer publish: needs: [lint-go, lint-yaml, build] if: github.event_name != 'pull_request' && (github.ref_name == 'main' || github.ref_name == 'dev') runs-on: [self-hosted, linux, arch, homelab] steps: - name: Checkout repository uses: actions/checkout@v4 - name: Setup Go uses: actions/setup-go@v5 with: go-version: '1.23' - name: Read project version id: version shell: bash run: | version="$(go version -m 2>/dev/null || date +%Y%m%d)" echo "version=$version" >> "$GITHUB_OUTPUT" - name: Log in to registry shell: bash run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login "${REGISTRY}" \ -u "${{ secrets.REGISTRY_USERNAME }}" \ --password-stdin - name: Build and push image shell: bash run: | image="${REGISTRY}/${IMAGE_NAME}" tags=("latest" "${{ steps.version.outputs.version }}") case "${GITHUB_REF_NAME}" in main) tags+=("main" "prod") ;; dev) tags+=("dev") ;; esac build_args=() for tag in "${tags[@]}"; do build_args+=(-t "${image}:${tag}") done docker build "${build_args[@]}" . for tag in "${tags[@]}"; do docker push "${image}:${tag}" done