diff --git a/.github/workflows/example.yml b/.github/workflows/example.yml index a1cb447..0e5d3be 100644 --- a/.github/workflows/example.yml +++ b/.github/workflows/example.yml @@ -1,34 +1,38 @@ name: Sample Testing -on: [push] +on: [workflow_dispatch] + +env: + VER: 0.3.1 jobs: my_job: runs-on: stackit-docker steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Get commit hash - if: ${{ always() }} - run: echo "::set-output name=sha8::$(echo ${FORGEJO_SHA} | cut -c1-8)" - id: slug - - name: First Chat Message if: ${{ always() }} - uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.1.2 + uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }} with: + title: "[START] sample test (${{ forgejo.run_number }})" author: ${{ forgejo.actor }} giturl: ${{ forgejo.server_url }} - # status: ${{ job.status }} + iconslug: instacart + # status: ${{ job.status }} # optional actionid: ${{ forgejo.run_number }} webhook: "${{ secrets.WEBHOOK_URL }}" # event_body: "" # optional +# - name: Force failure +# run: | +# echo "This is a force failure" +# exit 1 + - name: Second Chat Message as ThreadResponse if: ${{ always() }} uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.1.2 with: + title: "[END] sample test (${{ forgejo.run_number }})" + iconslug: bun author: ${{ forgejo.actor }} giturl: ${{ forgejo.server_url }} status: ${{ job.status }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..581badf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,143 @@ +name: CI +on: + push: + branches: + - '**' + pull_request: + branches: + - '**' + +env: + VER: 0.3.1 + +# If a 403 error occurs, make sure to set content permission to write +# see: https://github.com/go-semantic-release/action/issues/27 +permissions: + contents: write + +jobs: + lint: + runs-on: stackit-docker + steps: + - name: CI checkout + uses: actions/checkout@v6 + + - name: Setup GO + uses: actions/setup-go@v6 + with: + # go-version: 1.26 + go-version-file: 'go.mod' + cache-dependency-path: 'go.sum' + + - name: GO Linting + uses: golangci/golangci-lint-action@v9 + with: + version: v2.11 + +# build: +# runs-on: stackit-docker +## strategy: +## fail-fast: true +## matrix: +## node: [10, 12] +# steps: +# - uses: actions/checkout@v6 +# +# - uses: actions/setup-node@v1 +# with: +# node-version: ${{ matrix.node }} +# - run: npm ci +# - run: npm test + release: + runs-on: stackit-docker +# needs: build + outputs: + tag: ${{ steps.create_release.outputs.tag }} + steps: + - name: "🖅 [START] release workflow" + if: ${{ always() }} + uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }} + with: + title: "[START] release workflow (${{ forgejo.run_number }})" + subtitle: "${{ forgejo.repostitory }}" + author: ${{ forgejo.actor }} + giturl: ${{ forgejo.server_url }} + iconslug: instacart + actionid: ${{ forgejo.run_number }} + webhook: "${{ secrets.WEBHOOK_URL }}" + + - name: Checkout code + uses: actions/checkout@v6 + +# - name: Semantic Release +# uses: go-semantic-release/action@v1 +# id: semrel +# with: +# github-token: ${{ env.FORGEJO_TOKEN }} +# allow-initial-development-versions: true +# # update-file: package.json +# changelog-file: CHANGELOG.md +# changelog-generator-opt: "emojis=true" + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Create Release + env: + FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} + id: create_release + run: | + npx \ + -p semantic-release \ + -p semantic-release-replace-plugin \ + -p @semantic-release/commit-analyzer \ + -p @semantic-release/release-notes-generator \ + -p @semantic-release/changelog \ + -p @semantic-release/git \ + semantic-release + echo "tag=$(git describe --tags --abbrev=0)" >> $FORGEJO_OUTPUT + + - name: Login to Docker Hub + if: steps.create_release.outputs.tag != '' + uses: docker/login-action@v4 + with: + registry: ${{ forgejo.server_url }} + username: ${{ vars.GIT_USERNAME }} + password: ${{ secrets.GIT_PAT }} + +# - name: Set up QEMU +# if: steps.semrel.outputs.version != '' +# uses: docker/setup-qemu-action@v4 + + - name: Set up Docker Buildx + if: steps.create_release.outputs.tag != '' + uses: docker/setup-buildx-action@v4 + + - name: Build only + if: steps.create_release.outputs.tag == '' + uses: docker/build-push-action@v7 + with: + push: false + tags: actions/notify-slim:dev + + - name: Build and push + if: steps.create_release.outputs.tag != '' + uses: docker/build-push-action@v7 + with: + push: true + tags: stackit-solutions.git.onstackit.cloud/actions/notify-slim:${{ steps.create_release.outputs.tag }} + + - name: "🖅 [END] release workflow" + if: ${{ always() }} + uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${{ env.VER }} + with: + title: "[END] release workflow (${{ forgejo.run_number }})" + subtitle: "${{ forgejo.repostitory }}" + author: ${{ forgejo.actor }} + giturl: ${{ forgejo.server_url }} + iconslug: instacart + actionid: ${{ forgejo.run_number }} + webhook: "${{ secrets.WEBHOOK_URL }}" + status: 'completed' diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..35b6ac1 --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,88 @@ +version: "2" +run: + concurrency: 4 +output: + formats: + text: + print-linter-name: true + print-issued-lines: true + colors: true + path: stdout +linters: + enable: + - bodyclose + - depguard + - errorlint + - forcetypeassert + - gochecknoinits + - gocritic + - gosec + - misspell + - nakedret + - revive + - sqlclosecheck + - wastedassign + disable: + - noctx + - unparam + settings: + depguard: + rules: + main: + list-mode: original + allow: [] + deny: + - pkg: github.com/stretchr/testify + desc: Do not use a testing framework + gocritic: + disabled-checks: + - wrapperFunc + - typeDefFirst + - ifElseChain + - dupImport + - hugeParam + enabled-tags: + - performance + - style + - experimental + gosec: + excludes: + - G104 + - G102 + - G304 + - G307 + misspell: + locale: US + nakedret: + max-func-lines: 0 + revive: + severity: error + rules: + - name: errorf + - name: context-as-argument + - name: error-return + - name: increment-decrement + - name: indent-error-flow + - name: superfluous-else + - name: unused-parameter + - name: unreachable-code + - name: atomic + - name: empty-lines + - name: early-return + exclusions: + paths: [] + generated: lax + warn-unused: true + # Excluding configuration per-path, per-linter, per-text and per-source. + rules: + # Exclude some linters from running on tests files. + - path: _test\.go + linters: + - gochecknoinits +formatters: + enable: + - gofmt + - goimports +# settings: +# goimports: +# local-prefixes: diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..8310b91 --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,78 @@ +{ + "branches": ["main"], + "tagFormat": "v${version}", + "plugins": [ + "@semantic-release/commit-analyzer", + [ + "semantic-release-replace-plugin", + { + "replacements": [ + { + "files": ["action.yml"], + "from": " image: 'docker://stackit-solutions.git.onstackit.cloud/actions/notify-slim:v.*'", + "to": " image: 'docker://stackit-solutions.git.onstackit.cloud/actions/notify-slim:v${nextRelease.version}'", + "results": [ + { + "file": "action.yml", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + }, + { + "files": ["README.md"], + "from": " uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v.*", + "to": " uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v${nextRelease.version}", + "results": [ + { + "file": "README.md", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + }, + { + "files": [".github/workflows/example.yml"], + "from": " VER: .*", + "to": " VER: ${nextRelease.version}", + "results": [ + { + "file": ".github/workflows/example.yml", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + }, + { + "files": [".github/workflows/release.yml"], + "from": " VER: .*", + "to": " VER: ${nextRelease.version}", + "results": [ + { + "file": ".github/workflows/release.yml", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + } + ] + } + ], + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/git", + { + "assets": ["CHANGELOG.md", "README.md", "action.yml", ".github/workflows/example.yml", ".github/workflows/release.yml"] + } + ] + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..24b7be5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,23 @@ +## [0.3.1](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.3.0...v0.3.1) (2026-04-17) + + +### Bug Fixes + +* pipeline fixes ([b195a1d](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/b195a1dcfdd7bf98eaaeb976d08260a2457da317)) + +# [0.3.0](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.2.0...v0.3.0) (2026-04-17) + + +### Features + +* linting ([68c1f11](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/68c1f11a5cc02918166ca05e4af79712a5c0964b)) +* linting ([16a5f87](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/16a5f874b341a6d4776dbe5e46be391f1d6576d8)) + +# [0.2.0](https://stackit-solutions.git.onstackit.cloud/actions/notify/compare/v0.1.2...v0.2.0) (2026-04-17) + + +### Features + +* linting ([9d4e8c9](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/9d4e8c9a9dc3fcc133299e978fed191ad6052aac)) +* linting ([5b93809](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/5b938091d705e01f6467cdd6be9144e491c66502)) +* pipeline container build ([0414cf6](https://stackit-solutions.git.onstackit.cloud/actions/notify/commit/0414cf6dfb9956c85bb48f5217806841f5819716)) diff --git a/Dockerfile b/Dockerfile index 20cd801..f3035dc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,29 @@ -FROM golang:1.26 +FROM golang:1.26 AS builder -WORKDIR /src +RUN apt-get update && apt-get -y install upx + +WORKDIR /app + +ENV CGO_ENABLED=0 COPY . . -RUN go get -u github.com/sethvargo/go-githubactions/... \ - && go mod tidy \ - && go build -o /bin/google-chat-action +RUN go mod tidy && go build \ + -a \ + -trimpath \ + -ldflags "-s -w -extldflags '-static'" \ + -installsuffix cgo \ + -tags netgo \ + -o /bin/google-chat-action \ + . + +RUN strip /bin/google-chat-action + +RUN upx -q -9 /bin/google-chat-action + +FROM scratch + +COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ + +COPY --from=builder /bin/google-chat-action /bin/google-chat-action ENTRYPOINT ["/bin/google-chat-action"] diff --git a/Dockerfile.big b/Dockerfile.big new file mode 100644 index 0000000..20cd801 --- /dev/null +++ b/Dockerfile.big @@ -0,0 +1,10 @@ +FROM golang:1.26 + +WORKDIR /src +COPY . . + +RUN go get -u github.com/sethvargo/go-githubactions/... \ + && go mod tidy \ + && go build -o /bin/google-chat-action + +ENTRYPOINT ["/bin/google-chat-action"] diff --git a/README.md b/README.md index d305f27..c4e8400 100644 --- a/README.md +++ b/README.md @@ -13,23 +13,20 @@ jobs: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@v6 - - - name: Get commit hash - if: ${{ always() }} - run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - id: slug - - - name: Chat Setup - if: ${{ always() }} - uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0 - with: - project: ${{ github.repository }} - commit: ${{ steps.slug.outputs.sha8 }} - branch: ${{ github.ref }} - status: ${{ job.status }} - actionid: ${{ github.repository }}/runs/${{ github.run_id }} - webhook: "https://chat.googleapis.com/v1/spaces/AAAAzPcAy4s/messages?key=AIzaSyDdI0hCZtE6vySjMm-WEfRq3CPzqKqqsHI&token=MmdzluicdrdkyUAV_QwB6BzlLcIhbfrwNzxVrEllaec%3D&threadKey=git-commit" + # ... all your steps + - name: Sample Chat Message + if: ${{ always() }} # runs als after fails + uses: https://stackit-solutions.git.onstackit.cloud/actions/notify@v0.3.1 + with: + title: "[START] sample test (${{ forgejo.run_number }})" + author: ${{ forgejo.actor }} + giturl: ${{ forgejo.server_url }} + iconslug: instacart # optional + # status: ${{ job.status }} # optional + actionid: ${{ forgejo.run_number }} + webhook: "${{ secrets.WEBHOOK_URL }}" + event_body: "This is a sample TEXT
with a new line" # optional ``` + +TODO - icon_slug diff --git a/docker-slimbuild b/docker-slimbuild deleted file mode 100644 index 6a8459c..0000000 --- a/docker-slimbuild +++ /dev/null @@ -1,31 +0,0 @@ -FROM golang:1.26 AS builder - -RUN apt-get update && apt-get -y install upx - -WORKDIR /app -#RUN mkdir -p $GOPATH/src/github.com/DTherHtun/google-chat-action -#ADD . $GOPATH/src/github.com/DTherHtun/google-chat-action -# RUN go get -u github.com/sethvargo/go-githubactions/... -ENV CGO_ENABLED=0 -COPY . . - -RUN go mod tidy && go build \ - -a \ - -trimpath \ - -ldflags "-s -w -extldflags '-static'" \ - -installsuffix cgo \ - -tags netgo \ - -o /bin/google-chat-action \ - . - -RUN strip /bin/google-chat-action - -RUN upx -q -9 /bin/google-chat-action - -FROM scratch - -COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ - -COPY --from=builder /bin/google-chat-action /bin/google-chat-action - -ENTRYPOINT ["/bin/google-chat-action"] diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b8212ad --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/sethvargo/go-githubactions v1.3.2 h1:gkibLr/QjosgNWoCf1V58rTMRZw7xZtSB7dY4atbl1Y= +github.com/sethvargo/go-githubactions v1.3.2/go.mod h1:7/4WeHgYfSz9U5vwuToCK9KPnELVHAhGtRwLREOQV80= diff --git a/google-chat-action.png b/google-chat-action.png index cbab7f1..fad33f0 100644 Binary files a/google-chat-action.png and b/google-chat-action.png differ diff --git a/main.go b/main.go index 12cb578..7a9eafc 100644 --- a/main.go +++ b/main.go @@ -42,6 +42,56 @@ func main() { data.CardID = uuid.NewString() data.Add = "" + getData(&data) + + webhook := githubactions.GetInput("webhook") + if webhook == "" { + githubactions.Fatalf("Missing input 'webhook'") + os.Exit(1) + } + webhook = fmt.Sprintf("%s&threadKey=notify%s&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD", webhook, data.ActionID) + + giturl := githubactions.GetInput("giturl") + if giturl == "" { + githubactions.Fatalf("Missing input 'giturl'") + os.Exit(1) + } + data.GitURL = giturl + + body := githubactions.GetInput("event_body") + data.EventBody = body + + githubactions.Infof("using URL: %s", webhook) + + jsonStr, err := card(data) + if err != nil { + githubactions.Fatalf("err %s", err.Error()) + os.Exit(1) + } + + req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr)) + if err != nil { + githubactions.Fatalf("error %s", err.Error()) + os.Exit(1) + } + req.Header.Set("Content-Type", "application/json; charset=UTF-8") + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + githubactions.Fatalf("error %s", err.Error()) + os.Exit(1) + } + defer resp.Body.Close() //nolint:gocritic + + fmt.Println("response Status:", resp.Status) + if resp.StatusCode != http.StatusOK { + githubactions.Infof("json: %s", jsonStr) + githubactions.Fatalf("response: %+v\n", resp) + os.Exit(1) + } +} + +func getData(data *templateData) { prj, ok := os.LookupEnv("FORGEJO_REPOSITORY") if ok { data.Project = prj @@ -84,56 +134,6 @@ func main() { os.Exit(1) } data.ActionID = actionid - - webhook := githubactions.GetInput("webhook") - if webhook == "" { - githubactions.Fatalf("Missing input 'webhook'") - os.Exit(1) - } - webhook = fmt.Sprintf("%s&threadKey=notify%s&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD", webhook, data.ActionID) - - giturl := githubactions.GetInput("giturl") - if giturl == "" { - githubactions.Fatalf("Missing input 'giturl'") - os.Exit(1) - } - data.GitURL = giturl - - body := githubactions.GetInput("event_body") - data.EventBody = body - - githubactions.Infof("using URL: %s", webhook) - // fmt.Println("URL:> ", webhook) - - // var jsonStr = []byte(fmt.Sprintf(data, project, commit, branch, status, actionid)) - - jsonStr, err := card(data) - if err != nil { - githubactions.Fatalf("error %s", err.Error()) - os.Exit(1) - } - - // log.Printf("retrieved data: %s", string(jsonStr)) - - req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr)) - if err != nil { - githubactions.Fatalf("error %s", err.Error()) - os.Exit(1) - } - req.Header.Set("Content-Type", "application/json; charset=UTF-8") - client := &http.Client{} - resp, err := client.Do(req) - if err != nil { - githubactions.Fatalf("error %s", err.Error()) - os.Exit(1) - } - defer resp.Body.Close() - fmt.Println("response Status:", resp.Status) - if resp.StatusCode != http.StatusOK { - githubactions.Infof("json: %s", jsonStr) - githubactions.Fatalf("response: %+v\n", resp) - os.Exit(1) - } } func card(d templateData) ([]byte, error) { diff --git a/main_test.go b/main_test.go index 5c04597..f7e5241 100644 --- a/main_test.go +++ b/main_test.go @@ -27,8 +27,6 @@ func Test_card(t *testing.T) { Author: "gotest", IconUrl: "https://github.githubassets.com/images/modules/logos_page/Octocat.png", Project: "proj", - Commit: "12345", - Branch: "main", Status: "success", ActionID: "123", GitURL: "https://test.url", @@ -115,9 +113,6 @@ func Test_card(t *testing.T) { t.Fatalf("error: %v\nsrc: %s", err, tt.want) } - //if !reflect.DeepEqual(wantJson, gotJson) { - // t.Errorf("card() got = %v, want %v", gotJson, wantJson) - //} if diff := cmp.Diff(wantJson, gotJson); diff != "" { t.Errorf("MakeGatewayInfo() mismatch (-want +got):\n%s", diff) } diff --git a/message.tpl b/message.tpl index 3a50378..b20a0d7 100644 --- a/message.tpl +++ b/message.tpl @@ -27,7 +27,7 @@ { "textParagraph": { "text": "{{ .EventBody }}", - "maxLines": 2 + "maxLines": 5 } }, {