From 65376e75f79a49220184ff2aca3c5a3c795d2383 Mon Sep 17 00:00:00 2001 From: N08I40K Date: Thu, 17 Apr 2025 19:53:04 +0400 Subject: [PATCH] =?UTF-8?q?Workflow=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D1=83?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BB=D0=B8=D0=B7=D0=BE=D0=B2.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Запускает тесты. - Собирает приложение. - Отправляет отладочную информацию в Sentry. - Собирает и отправляет в реестр Docker image с приложением. - Создаёт релиз со списком изменений и артефактами сборки. --- .github/workflows/release.yml | 168 ++++++++++++++++++++++++++++++++++ .idea/sqldialects.xml | 9 -- Cargo.toml | 3 + Dockerfile | 14 +++ 4 files changed, 185 insertions(+), 9 deletions(-) create mode 100644 .github/workflows/release.yml delete mode 100644 .idea/sqldialects.xml create mode 100644 Dockerfile diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..0d9cdaf --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,168 @@ +name: release + +on: + push: + tags: [ "release/v*" ] + +permissions: + contents: write + +env: + CARGO_TERM_COLOR: always + + BINARY_NAME: schedule-parser-rusted + + TEST_DB: ${{ secrets.TEST_DATABASE_URL }} + + SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} + SENTRY_ORG: ${{ secrets.SENTRY_ORG }} + SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} + + DOCKER_IMAGE_NAME: ${{ github.repository }} + + DOCKER_REGISTRY_HOST: registry.n08i40k.ru + DOCKER_REGISTRY_USERNAME: ${{ github.repository_owner }} + DOCKER_REGISTRY_PASSWORD: ${{ secrets.DOCKER_REGISTRY_PASSWORD }} + +jobs: + test: + name: Test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: actions-rust-lang/setup-rust-toolchain@v1.11.0 + with: + toolchain: stable + + - name: Test + run: | + touch .env.test + cargo test --verbose + env: + DATABASE_URL: ${{ env.TEST_DB }} + JWT_SECRET: "test-secret-at-least-256-bits-used" + VKID_CLIENT_ID: 0 + VKID_REDIRECT_URI: "vk0://vk.com/blank.html" + build: + name: Build + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Rust + uses: actions-rust-lang/setup-rust-toolchain@v1.11.0 + with: + toolchain: stable + + - name: Build + run: cargo build --release --verbose + + - name: Extract debug symbols + run: | + objcopy --only-keep-debug target/release/${{ env.BINARY_NAME }}{,.d} + objcopy --strip-debug --strip-unneeded target/release/${{ env.BINARY_NAME }} + objcopy --add-gnu-debuglink target/release/${{ env.BINARY_NAME }}{.d,} + + - name: Setup sentry-cli + uses: matbour/setup-sentry-cli@v2.0.0 + with: + version: latest + token: ${{ env.SENTRY_AUTH_TOKEN }} + organization: ${{ env.SENTRY_ORG }} + project: ${{ env.SENTRY_PROJECT }} + + - name: Upload debug symbols to Sentry + run: | + sentry-cli debug-files upload --include-sources . + + - name: Upload build binary artifact + uses: actions/upload-artifact@v4 + with: + name: release-binary + path: target/release/${{ env.BINARY_NAME }} + + - name: Upload build debug symbols artifact + uses: actions/upload-artifact@v4 + with: + name: release-symbols + path: target/release/${{ env.BINARY_NAME }}.d + + docker: + name: Build & Push Docker Image + runs-on: ubuntu-latest + needs: build + steps: + - uses: actions/checkout@v4 + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + name: release-binary + + - name: Setup Docker Buildx + uses: docker/setup-buildx-action@v3.10.0 + + - name: Login to Registry + uses: docker/login-action@v3.4.0 + with: + registry: ${{ env.DOCKER_REGISTRY_HOST }} + username: ${{ env.DOCKER_REGISTRY_USERNAME }} + password: ${{ env.DOCKER_REGISTRY_PASSWORD }} + + - name: Extract Docker metadata + id: meta + uses: docker/metadata-action@v5.7.0 + with: + images: ${{ env.DOCKER_REGISTRY_HOST }}/${{ env.DOCKER_IMAGE_NAME }} + + - name: Build and push Docker image + id: build-and-push + uses: docker/build-push-action@v6.15.0 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + build-args: | + "BINARY_NAME=${{ env.BINARY_NAME }}" + release: + name: Create GitHub Release + runs-on: ubuntu-latest + needs: + - build + - docker + # noinspection GrazieInspection,SpellCheckingInspection + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Generate changelog + run: | + LAST_TAG=$(git describe --tags --abbrev=0 HEAD^) + echo "## Коммиты с прошлого релиза $LAST_TAG" > CHANGELOG.md + git log $LAST_TAG..HEAD --oneline >> CHANGELOG.md + + - name: Download build artifacts + uses: actions/download-artifact@v4 + with: + pattern: release-* + merge-multiple: true + + - name: Create Release + id: create_release + uses: ncipollo/release-action@v1.16.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + artifacts: "${{ env.BINARY_NAME }},${{ env.BINARY_NAME }}.d" + bodyFile: CHANGELOG.md \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml deleted file mode 100644 index da3341b..0000000 --- a/.idea/sqldialects.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index 798808a..054afdd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,6 +7,9 @@ version = "0.8.0" edition = "2024" publish = false +[profile.release] +debug = true + [dependencies] actix-web = "4.10.2" actix-macros = { path = "actix-macros" } diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6936ca9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM debian:stable-slim +LABEL authors="n08i40k" + +ARG BINARY_NAME + +WORKDIR /app/ + +RUN apt update && \ + apt install -y libpq5 + +COPY ./${BINARY_NAME} /bin/main +RUN chmod +x /bin/main + +ENTRYPOINT ["main"]