From 9d11a339b5eaee04a9e4a9eac2115011425ae206 Mon Sep 17 00:00:00 2001 From: Divanshu Chauhan Date: Sun, 11 Jun 2023 14:32:45 +0530 Subject: [PATCH] some release changes --- .github/workflows/ci.yml | 38 ++++++- .github/workflows/release.yml | 76 +++++++++----- .goreleaser.yaml | 95 ++++++++++++++---- Procfile | 1 + README.md | 38 ++++--- heroku.yml | 3 + keys/key.gpg | 181 ++++++++++++++++++++++++++++++++++ 7 files changed, 370 insertions(+), 62 deletions(-) create mode 100644 Procfile create mode 100644 heroku.yml create mode 100644 keys/key.gpg diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 745353da..aaafea47 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,12 +4,42 @@ on: push: branches: - main + - dev + tags-ignore: + - "**" pull_request: workflow_dispatch: jobs: ci: - uses: divkix/reusable-workflows/.github/workflows/goreleaser-ci.yml@main - with: - GH_PAT: ${{ secrets.GITHUB_TOKEN }} - secrets: inherit + name: Goreleaser CI + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up Go + uses: actions/setup-go@v4 + with: + go-version: "stable" + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v5 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v4 + with: + version: latest + args: release --snapshot --skip-publish --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + - name: Tar files + run: tar -czvf artifacts.tar.gz dist/ + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: artifacts + path: artifacts.tar.gz diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d2b89f97..1d2e5954 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -11,39 +11,52 @@ on: required: true jobs: - goreleaser: - name: Release Binaries + ci: + name: Goreleaser CI runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GH_PAT }} + permissions: + contents: write steps: - name: Checkout uses: actions/checkout@v3 + - name: Set up Go + uses: actions/setup-go@v4 with: - fetch-depth: 0 - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + go-version: "stable" + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v5 with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - name: Login to Docker Hub - uses: docker/login-action@v2 + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} + - name: Run GoReleaser + uses: goreleaser/goreleaser-action@v4 with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_PASSWORD }} - - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + version: latest + args: release --snapshot --skip-publish --clean + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - - uses: actions/setup-go@v4 + goreleaser: + name: Run GoReleaser + needs: update-install-script + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GH_PAT }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Set up Go + uses: actions/setup-go@v4 with: - go-version: 1.19 - - # only run this step when the tag is not already created + go-version: "stable" + - name: Install UPX + uses: crazy-max/ghaction-upx@v2 + with: + install-only: true + # only run this step when the tag is not already created - if: startsWith(github.ref, 'refs/tags/') != 'true' && github.event.inputs.tag != '' name: Create and Push Tag run: |- @@ -55,11 +68,22 @@ jobs: fi git tag -f -a -m "$tag" "$tag" git push -f origin "$tag" - + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Import GPG key + uses: crazy-max/ghaction-import-gpg@v5 + with: + gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.GPG_PASSPHRASE }} - name: Run GoReleaser uses: goreleaser/goreleaser-action@v4 with: version: latest args: release --clean env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_TOKEN: ${{ secrets.GH_PAT }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 8e22505c..8b2e1f31 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -1,20 +1,34 @@ -project_name: alitagorobot +project_name: alita_robot + release: replace_existing_draft: true header: | Welcome to this new release! - footer: | - Docker Images: - `ghcr.io/divkix/{{ .ProjectName }}:latest` + + Docker 🐳 images are available at: + `docker pull ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}` + +gomod: + env: + - CGO_ENABLED=1 + before: hooks: - go mod tidy - go mod download + +# upx: +# - enabled: true +# brute: true + builds: - - goos: + - binary: alita + env: + - CGO_ENABLED=0 + goos: + - darwin - linux - windows - - darwin goarch: - amd64 - arm64 @@ -23,20 +37,63 @@ builds: - -trimpath ldflags: - -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{ .CommitDate }} + archives: - - format: binary + - rlcp: true + name_template: >- + {{ .ProjectName }}_ + {{- .Version }}_ + {{- if eq .Os "darwin" }}macOS + {{- else }}{{ .Os }}{{ end }}_ + {{- if eq .Arch "386" }}i386 + {{- else }}{{ .Arch }}{{ end }} + {{- with .Arm }}v{{ . }}{{ end }} + {{- with .Mips }}_{{ . }}{{ end }} + {{- if not (eq .Amd64 "v1") }}{{ .Amd64 }}{{ end }} + format_overrides: + - goos: windows + format: zip + +signs: + - artifacts: all + args: + - "-u" + - "C4223C5D4162629F38AF4DD530695AF88CC00E38" + - "--output" + - "${signature}" + - "--batch" + - "--yes" + - "--pinentry-mode" + - "loopback" + - "--passphrase" + - "$GPG_PASSPHRASE" + - "--detach-sign" + - "${artifact}" + +changelog: + sort: asc + filters: + exclude: + - "^docs:" + - "^test:" + - "^chore:" + - "^ci:" + - Merge pull request + - Merge branch + checksum: name_template: "checksums.txt" + algorithm: sha256 + snapshot: name_template: "{{ incpatch .Version }}-next" dockers: - # amd64 only - goarch: amd64 - dockerfile: goreleaser.Dockerfile + dockerfile: docker/goreleaser use: buildx image_templates: - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-amd64" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-amd64" build_flag_templates: - "--platform=linux/amd64" - "--pull" @@ -44,12 +101,11 @@ dockers: - "--label=org.opencontainers.image.title={{ .ProjectName }}" - "--label=org.opencontainers.image.revision={{.FullCommit}}" - "--label=org.opencontainers.image.version={{.Version}}" - # arm64 only - goarch: arm64 - dockerfile: goreleaser.Dockerfile + dockerfile: docker/goreleaser use: buildx image_templates: - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-arm64v8" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-arm64v8" build_flag_templates: - "--platform=linux/arm64/v8" - "--pull" @@ -59,12 +115,11 @@ dockers: - "--label=org.opencontainers.image.version={{.Version}}" docker_manifests: - # github container registry - - name_template: "ghcr.io/divkix/{{ .ProjectName }}:{{ .Version }}" + - name_template: "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Version }}" image_templates: - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-amd64" - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-arm64v8" - - name_template: "ghcr.io/divkix/{{ .ProjectName }}:latest" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-amd64" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-arm64v8" + - name_template: "ghcr.io/divideprojects/{{ .ProjectName }}:latest" image_templates: - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-amd64" - - "ghcr.io/divkix/{{ .ProjectName }}:{{ .Tag }}-arm64v8" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-amd64" + - "ghcr.io/divideprojects/{{ .ProjectName }}:{{ .Tag }}-arm64v8" diff --git a/Procfile b/Procfile new file mode 100644 index 00000000..d40263bd --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: /app/AlitaGoRobot diff --git a/README.md b/README.md index dba4cf84..ab36c8f4 100644 --- a/README.md +++ b/README.md @@ -7,12 +7,11 @@ LICENSE Contributors Repo Size - Views + Views

- DeepSource

@@ -33,11 +32,10 @@ Can be found on Telegram as [@Alita_Robot](https://t.me/Alita_Robot) Alita is currently available in 1 Language as of now: - **US English** -More languages can be managed in the _locales_ folder. +More languages can be managed in the _locales_ folder. Although we have added support for languages in bot, we still need contributors to translate the bot to other languages. More langauges have been added to locales folder but need some configuration. - Help us bring more languages to the bot by contributing to the project on [Crowdin](https://crowdin.com/project/alitarobot) ## Requirements @@ -47,7 +45,6 @@ Help us bring more languages to the bot by contributing to the project on [Crowd or - Docker (Easiest way to setup the bot) - ## How to setup First Step! @@ -61,11 +58,11 @@ It really motivates me to continue this project further. - Get your Bot Token from [@BotFather](https://t.me/BotFather) **Note:** As it is banned with an unknown reason in heroku, follow the below steps carefully! -- First Fork this repo :) +- First Fork this repo `:)` - secondly, create an empty app in the Heroku, with a custom app name; and select Europe region for faster speed. - Now go to the deploy tab of your app and under deployment method select GitHub and connect it. - after that, type the forked repo name and select it now select main branch and enable auto deploy, at last click on deploy now button! -- Lastly, you must fill up all the vars in heroku as directed in app.json file and now turn on the worker dyno to run it :) +- Lastly, you must fill up all the vars in heroku (if using heroku) as directed in app.json file and now turn on the worker dyno to run it `:)` ### Traditional @@ -76,19 +73,36 @@ It really motivates me to continue this project further. ### Docker -- Clone the repo and enter into it -- Install [Docker](https://www.docker.com/) -- Run `docker build -t alita .` if you're using your forked repo, else run `docker run -e ENV_VAR=VALUE -d --name alita divideprojects/Alita_Robot` +We currently publish a `ghcr.io/divideprojects/alita_robot` Docker image based on alpine. +Set the Environmental vars using the `-e` flag in while running the container. If all works well, bot should send message to the **MESSAGE_DUMP** Group! +### Other + +You can download all binaries and release artifacts from the Releases page. Binaries are built for macOS, Linux, Windows, for amd64 and arm64 architectures. + +If a binary does not yet exist for the OS/architecture you use, please open a GitHub Issue. + +## Verify Signature + +You can verify the integrity and authenticity of any released artifact using a public GPG key. All release artifacts are signed and have a corresponding signature file. Release artifacts are available on the Releases page. + +# fetch GPG signing key +```bash +gpg --keyserver keyserver.ubuntu.com --recv 9CAFFF2AC5F94C7C +``` +# example: verify a release package +```bash +gpg --verify alita_robot_2.0.1_darwin_amd64.tar.gz.sig alita_robot_2.0.1_darwin_amd64.tar.gz || echo "Verification failed!" +``` ## Contributing to the project - Make sure your PR works and doesn't break anything. -- You must join the support group. -- Make sure it builds and runs properly. +- You must join the support group [here](https://dividesupport.t.me). +- Make sure the CI passes. ## Special Thanks to diff --git a/heroku.yml b/heroku.yml new file mode 100644 index 00000000..8eec25b9 --- /dev/null +++ b/heroku.yml @@ -0,0 +1,3 @@ +build: + docker: + web: Dockerfile diff --git a/keys/key.gpg b/keys/key.gpg new file mode 100644 index 00000000..5fa95b03 --- /dev/null +++ b/keys/key.gpg @@ -0,0 +1,181 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=mWui +-----END PGP PUBLIC KEY BLOCK-----