Skip to content

feat: init cobra project #8

feat: init cobra project

feat: init cobra project #8

Workflow file for this run

name: Main CI
on:
pull_request:
branches:
- main
paths:
- '**.go'
permissions:
contents: write
pull-requests: write
jobs:
all-status-check:
runs-on: ubuntu-latest
timeout-minutes: 10
needs:
- ci-req-check
- yaml-lint
- action-lint
- golang-build-check
- golang-vet-check
- golang-fmt-check
- golang-lint-check
- golang-test-comment-check
- golang-test-check
- golang-generate-check
steps:
- name: All status check
run: echo "All status check passed"
ci-req-check:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Check all-status-check
run: |
diff \
<(yq ".jobs | del(.all-status-check) | keys.[]" .github/workflows/ci.yml) \
<(yq ".jobs.all-status-check.needs.[]" .github/workflows/ci.yml)
yaml-lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: reviewdog/action-yamllint@v1.20.0
with:
level: warning
fail_level: warning
yamllint_flags: "-c .yamllint ."
action-lint:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- uses: reviewdog/action-actionlint@v1.60.0
with:
level: warning
fail_level: warning
golang-build-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- name: Run go build
run: go build -v ./cmd/main.go
golang-vet-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- name: Run go vet
run: go vet ./...
golang-fmt-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- name: Run go fmt
run: go fmt ./...
- name: Check diff
run: |
if [[ $(git status --porcelain) ]]; then
git diff
exit 1
fi
golang-lint-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- uses: golangci/golangci-lint-action@971e284b6050e8a5849b72094c50ab08da042db8 # v6.1.1
with:
working-directory: scripts/dofy
golang-test-comment-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
env:
HTML_REPORT_URL_PATH: reports/${{ github.ref_name }}/${{ github.run_id }}/${{ github.run_attempt }}/cov
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- uses: Homebrew/actions/setup-homebrew@064c96758610d925cdfa1878c508528f23dc6a58
- name: Run go test
id: golang-test
run: |
set +e
TEST_OUT=$(go test ./... -coverpkg=./... -coverprofile=cover.out -p=5)
TEST_EXIT_CODE=$?
if [ $TEST_EXIT_CODE -eq 0 ]; then
go tool cover -html=cover.out -o index.html
fi
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
{
echo "comment<<$EOF"
printf "# Test coverage\n\n"
if [ $TEST_EXIT_CODE -eq 0 ]; then
printf ":white_check_mark: All tests passed successfully.\n\n"
printf "| Status | Package | Time | Coverage |\n"
printf "|--------|---------|------|----------|\n"
echo "$TEST_OUT" | sed -E "s/^\?\s+/?:/g; s/^ok\s+/ok:/g; s/^\s/:/g; s/\s+/ /g; s/coverage:/::/g; s/([0-9.]+)s\s::/\:\1s\:/g; s/ of statements//g;" | sed -e "s/in .\/...//g" | awk -F'[:]' '{ print "| " $1 " | " $2 " | " $3 " |" $4 " |"}'
else
printf ":red_circle: Some tests failed.\n\n"
printf "<details>\n"
printf "<summary>go test result</summary>\n"
printf "\n\`\`\`\n\n"
echo "$TEST_OUT"
printf "\n\`\`\`\n\n"
printf "</details>\n"
fi
echo "$EOF"
} >> "$GITHUB_ENV"
exit $TEST_EXIT_CODE
continue-on-error: true
- uses: actions/upload-artifact@v4
if: ${{ steps.golang-test.outcome == 'success' }}
with:
name: cov html
path: ${{ github.workspace }}/scripts/dofy/index.html
if-no-files-found: error
- uses: actions/checkout@v4
if: ${{ steps.golang-test.outcome == 'success' }}
with:
ref: github-pages
clean: false
- name: Set Git User
if: ${{ steps.golang-test.outcome == 'success' }}
working-directory: .
run: |
git config --global user.name "github-actions[bot]"
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
- name: Push HTML Report
if: ${{ steps.golang-test.outcome == 'success' }}
timeout-minutes: 3
working-directory: .
run: |
mkdir -p ${{ env.HTML_REPORT_URL_PATH }}
mv ./scripts/dofy/index.html ${{ env.HTML_REPORT_URL_PATH }}/index.html
git add ${{ env.HTML_REPORT_URL_PATH }}
git commit -m "workflow: add HTML report for run-id ${{ github.run_id }} (attempt: ${{ github.run_attempt }})"
while true; do
if ! git pull --rebase; then
echo "Failed to rebase. Please review manually."
exit 1
fi
if git push; then
echo "Successfully pushed HTML report to repo."
exit 0
fi
done
- uses: actions/checkout@v4
if: ${{ steps.golang-test.outcome == 'success' }}
- name: Create PR comment
uses: marocchino/sticky-pull-request-comment@44e0bad81007ecff41ba26d1cbf49a0267d28e9d # v2.9.0
with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
number: ${{ github.event.pull_request.number }}
header: golang-test
message: |
${{ env.comment }}
## Cov HTML ${{ github.run_id }}: ${{ github.run_attempt }}
[Cov HTML Report](https://shiron-dev.github.io/dotfiles/${{ env.HTML_REPORT_URL_PATH }})
- name: Error check
if: ${{ steps.golang-test.outcome != 'success' }}
run: exit 1
golang-test-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/setup-golang
- uses: Homebrew/actions/setup-homebrew@064c96758610d925cdfa1878c508528f23dc6a58
- name: Set up gotestfmt
uses: gotesttools/gotestfmt-action@8b4478c7019be847373babde9300210e7de34bfb # v2.5.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Run go test
id: golang-test
run: |
set +e
TEST_OUT=$(go test -json -v ./... -p=5 2>&1)
TEST_EXIT=$?
echo "$TEST_OUT" | tee /tmp/gotest.log | gotestfmt
exit $TEST_EXIT
continue-on-error: true
- uses: actions/upload-artifact@v4
with:
name: test-log
path: /tmp/gotest.log
if-no-files-found: error
- name: Error check
if: ${{ steps.golang-test.outcome != 'success' }}
run: exit 1
golang-generate-check:
runs-on: ubuntu-latest
timeout-minutes: 10
defaults:
run:
working-directory: scripts/dofy
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- uses: ./.github/actions/setup-golang
- name: Run go generate
run: go generate ./...
- name: Check diff
run: |
if [[ $(git status --porcelain) ]]; then
git diff
exit 1
fi