From 95a7b6bc5dddc1b94024e3fdba9ac59e623f3397 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:13:50 +0800 Subject: [PATCH 01/20] Create python-publish.yml --- .github/workflows/python-publish.yml | 177 +++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml new file mode 100644 index 00000000..069061fe --- /dev/null +++ b/.github/workflows/python-publish.yml @@ -0,0 +1,177 @@ + +name: CI/CD Pipeline + +on: + push: + branches: [ main, develop ] + + pull_request: + branches: [ main ] + + release: + types: [published] + + workflow_dispatch: + +jobs: + test: + name: Test on Python ${{ matrix.python-version }} + runs-on: ubuntu-latest + + strategy: + matrix: + python-version: [3.8, 3.9, '3.10', '3.11', '3.12'] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Cache pip dependencies + uses: actions/cache@v3 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt', 'setup.py', 'pyproject.toml') }} + restore-keys: | + ${{ runner.os }}-pip- + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pytest pytest-cov flake8 black isort + + if [ -f requirements.txt ]; then + pip install -r requirements.txt + fi + + if [ -f setup.py ]; then + pip install -e . + elif [ -f pyproject.toml ]; then + pip install -e . + fi + + - name: Code quality checks + run: | + black --check . + + isort --check-only . + + flake8 . + + - name: Run tests + run: | + pytest --cov=. --cov-report=xml --cov-report=html + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + file: ./coverage.xml + fail_ci_if_error: true + + build: + name: Build package + runs-on: ubuntu-latest + needs: test + if: github.event_name == 'release' || github.event_name == 'workflow_dispatch' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install build dependencies + run: | + python -m pip install --upgrade pip + pip install build twine + + - name: Build package + run: | + python -m build + + - name: Check package + run: | + twine check dist/* + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: dist + path: dist/ + + publish-test: + name: Publish to Test PyPI + runs-on: ubuntu-latest + needs: build + if: github.event_name == 'workflow_dispatch' + environment: + name: test-pypi + url: https://test.pypi.org/p/${{ github.event.repository.name }} + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: dist + path: dist/ + + - name: Publish to Test PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + password: ${{ secrets.TEST_PYPI_API_TOKEN }} + + publish-pypi: + name: Publish to PyPI + runs-on: ubuntu-latest + needs: build + if: github.event_name == 'release' + environment: + name: pypi + url: https://pypi.org/p/${{ github.event.repository.name }} + + steps: + - name: Download artifacts + uses: actions/download-artifact@v3 + with: + name: dist + path: dist/ + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + password: ${{ secrets.PYPI_API_TOKEN }} + + security-scan: + name: Security scan + runs-on: ubuntu-latest + needs: test + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.11' + + - name: Install security tools + run: | + python -m pip install --upgrade pip + pip install safety bandit + + - name: Run safety check + run: | + safety check + + - name: Run bandit security scan + run: | + bandit -r . -x tests/ From 90b94fe233320e21c15ea47f63b6ecabaa1f85c6 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:38:38 +0800 Subject: [PATCH 02/20] Update tests.yml --- .github/workflows/tests.yml | 90 +++++++++++++------------------------ 1 file changed, 32 insertions(+), 58 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index a4869312..fa6fc2dc 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -33,6 +33,18 @@ jobs: env: PIP_DISABLE_PIP_VERSION_CHECK: 1 + services: + opengauss: + image: opengauss/opengauss-server:latest + ports: + - 5432:5432 + env: + GS_USERNAME: testuser + GS_USER_PASSWORD: Test@123 + GS_PASSWORD: Test@123 + options: >- + --privileged=true + --name opengauss-custom steps: - uses: actions/checkout@v4 @@ -67,11 +79,30 @@ jobs: [ "$RUNNER_OS" = "Linux" ] && .github/workflows/install-krb5.sh python -m pip install -U pip setuptools wheel python -m pip install -e .[test] + + - name: Wait for openGauss to be ready + env: + GSQL_PASSWORD: Test@123 + run: | + source venv/bin/activate + for i in {1..30}; do + pg_isready -h localhost -p 5432 -U testuser && break + sleep 10 + done + if ! pg_isready -h localhost -p 5432 -U testuser; then + echo "openGauss is not ready" + exit 1 + fi + + - name: Create test database + run: | + docker exec opengauss-custom bash -c "su - omm -c 'gsql -d postgres -c \"CREATE DATABASE test ;\"'" - name: Test if: "!steps.release.outputs.is_release" env: LOOP_IMPL: ${{ matrix.loop }} + GAUSSDB_TEST_DSN: "host=127.0.0.1 port=5432 dbname=test user=testuser password=Test@123 " run: | if [ "${LOOP_IMPL}" = "uvloop" ]; then env USE_UVLOOP=1 python -m unittest -v tests.suite @@ -79,68 +110,11 @@ jobs: python -m unittest -v tests.suite fi - test-postgres: - strategy: - matrix: - postgres-version: ["9.5", "9.6", "10", "11", "12", "13", "14", "15", "16", "17"] - - runs-on: ubuntu-latest - - env: - PIP_DISABLE_PIP_VERSION_CHECK: 1 - - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 50 - submodules: true - - - name: Check if release PR. - uses: edgedb/action-release/validate-pr@master - id: release - with: - github_token: ${{ secrets.RELEASE_BOT_GITHUB_TOKEN }} - missing_version_ok: yes - version_file: asyncpg/_version.py - version_line_pattern: | - __version__(?:\s*:\s*typing\.Final)?\s*=\s*(?:['"])([[:PEP440:]])(?:['"]) - - - name: Set up PostgreSQL - if: "!steps.release.outputs.is_release" - env: - PGVERSION: ${{ matrix.postgres-version }} - DISTRO_NAME: focal - run: | - sudo env DISTRO_NAME="${DISTRO_NAME}" PGVERSION="${PGVERSION}" \ - .github/workflows/install-postgres.sh - echo PGINSTALLATION="/usr/lib/postgresql/${PGVERSION}/bin" \ - >> "${GITHUB_ENV}" - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v5 - if: "!steps.release.outputs.is_release" - with: - python-version: "3.x" - - - name: Install Python Deps - if: "!steps.release.outputs.is_release" - run: | - [ "$RUNNER_OS" = "Linux" ] && .github/workflows/install-krb5.sh - python -m pip install -U pip setuptools wheel - python -m pip install -e .[test] - - - name: Test - if: "!steps.release.outputs.is_release" - env: - PGVERSION: ${{ matrix.postgres-version }} - run: | - python -m unittest -v tests.suite - # This job exists solely to act as the test job aggregate to be # targeted by branch policies. regression-tests: name: "Regression Tests" - needs: [test-platforms, test-postgres] + needs: [test-platforms] runs-on: ubuntu-latest steps: From cdab80575206460d4fe90f6d89ff87d1bf9dda1d Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:44:54 +0800 Subject: [PATCH 03/20] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index fa6fc2dc..3f72908d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - os: [ubuntu-latest, macos-latest, windows-latest] + os: [ubuntu-latest, macos-latest] loop: [asyncio, uvloop] exclude: # uvloop does not support windows From 95b0ad9c1ec0d24c103ad9e0afcf859c19208ed6 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:49:58 +0800 Subject: [PATCH 04/20] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 3f72908d..1353d78f 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -18,7 +18,7 @@ jobs: strategy: matrix: python-version: ["3.8", "3.9", "3.10", "3.11", "3.12", "3.13"] - os: [ubuntu-latest, macos-latest] + os: [ubuntu-latest] loop: [asyncio, uvloop] exclude: # uvloop does not support windows From 74f79ef0fd263d7c1c4af6e3b53e43e8adb41795 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Thu, 7 Aug 2025 10:55:22 +0800 Subject: [PATCH 05/20] Update tests.yml --- .github/workflows/tests.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 1353d78f..3d14e1aa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -62,11 +62,6 @@ jobs: version_line_pattern: | __version__(?:\s*:\s*typing\.Final)?\s*=\s*(?:['"])([[:PEP440:]])(?:['"]) - - name: Setup PostgreSQL - if: "!steps.release.outputs.is_release && matrix.os == 'macos-latest'" - run: | - brew install postgresql - - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 if: "!steps.release.outputs.is_release" @@ -84,7 +79,6 @@ jobs: env: GSQL_PASSWORD: Test@123 run: | - source venv/bin/activate for i in {1..30}; do pg_isready -h localhost -p 5432 -U testuser && break sleep 10 From 17a958ad345e4ea01f694673e4743174b0428053 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 16:31:26 +0800 Subject: [PATCH 06/20] Update tests.yml --- .github/workflows/tests.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index c769997e..54734f1a 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -96,7 +96,11 @@ jobs: if: "!steps.release.outputs.is_release" env: LOOP_IMPL: ${{ matrix.loop }} - GAUSSDB_TEST_DSN: "host=127.0.0.1 port=5432 dbname=test user=testuser password=Test@123 " + PGHOST: "127.0.0.1" + PGPORT: 5432 + PGUSER: "testuser" + PGPASSWORD: "Test@123" + PGDATABASE: "test" run: | if [ "${LOOP_IMPL}" = "uvloop" ]; then env USE_UVLOOP=1 python -m unittest -v tests.suite From e27467f31a06407de96aba3d8a6ebd774d8eac2a Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 17:30:26 +0800 Subject: [PATCH 07/20] Update test_connect.py --- tests/test_connect.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 170ec79c..047c83b9 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -411,7 +411,9 @@ def setUpClass(cls): # Add credentials. cls.realm.addprinc('gaussdb/localhost') cls.realm.extract_keytab('gaussdb/localhost', cls.realm.keytab) - + print(f"Debug: realm.user_princ = {cls.realm.user_princ}") # 调试输出 + username = cls.realm.user_princ.split('@')[0] if '@' in cls.realm.user_princ else cls.realm.user_princ + print(f"Debug: extracted username = {username}") # 调试输出 cls.USERS = [ (cls.realm.user_princ, 'gss', None), (f'wrong-{cls.realm.user_princ}', 'gss', None), From 7b650c12af500d4230bcfdc1316e93840cc5e170 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 20:18:09 +0800 Subject: [PATCH 08/20] Update tests.yml --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 54734f1a..b0c57e02 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -90,7 +90,7 @@ jobs: - name: Create test database run: | - docker exec opengauss-custom bash -c "su - omm -c 'gsql -d postgres -c \"CREATE DATABASE test ;\"'" + docker exec opengauss-custom bash -c "su - omm -c 'gsql -d postgres -c \"CREATE DATABASE test ;CREATE user user ;\"'" - name: Test if: "!steps.release.outputs.is_release" From 715f00c3297442189772e63739ef3153f6b935d1 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 20:58:16 +0800 Subject: [PATCH 09/20] Update test_connect.py --- tests/test_connect.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 047c83b9..7749127f 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -411,9 +411,7 @@ def setUpClass(cls): # Add credentials. cls.realm.addprinc('gaussdb/localhost') cls.realm.extract_keytab('gaussdb/localhost', cls.realm.keytab) - print(f"Debug: realm.user_princ = {cls.realm.user_princ}") # 调试输出 - username = cls.realm.user_princ.split('@')[0] if '@' in cls.realm.user_princ else cls.realm.user_princ - print(f"Debug: extracted username = {username}") # 调试输出 + cls.cluster.execute_sql(f"CREATE USER {cls.realm.user_princ} WITH LOGIN;") cls.USERS = [ (cls.realm.user_princ, 'gss', None), (f'wrong-{cls.realm.user_princ}', 'gss', None), From 9c19cef5203a8cd43a59c11cc4d898e9776a19fb Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:02:36 +0800 Subject: [PATCH 10/20] Update test_connect.py --- tests/test_connect.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 7749127f..5c11c127 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -411,7 +411,6 @@ def setUpClass(cls): # Add credentials. cls.realm.addprinc('gaussdb/localhost') cls.realm.extract_keytab('gaussdb/localhost', cls.realm.keytab) - cls.cluster.execute_sql(f"CREATE USER {cls.realm.user_princ} WITH LOGIN;") cls.USERS = [ (cls.realm.user_princ, 'gss', None), (f'wrong-{cls.realm.user_princ}', 'gss', None), @@ -433,6 +432,7 @@ def setup_cluster(cls): cls.cluster, server_settings=cls.get_server_settings()) async def test_auth_gssapi_ok(self): + print(f"test_auth_gssapi_ok {self.realm.user_princ}") conn = await self.connect(user=self.realm.user_princ) await conn.close() @@ -442,6 +442,7 @@ async def test_auth_gssapi_bad_srvname(self): exceptions.InternalClientError, 'Server .* not found' ): + print(f"test_auth_gssapi_bad_srvname {self.realm.user_princ}") await self.connect(user=self.realm.user_princ, krbsrvname='wrong') async def test_auth_gssapi_bad_user(self): @@ -450,6 +451,7 @@ async def test_auth_gssapi_bad_user(self): exceptions.InvalidAuthorizationSpecificationError, 'GSSAPI authentication failed for user' ): + print(f"test_auth_gssapi_bad_user {self.realm.user_princ}") await self.connect(user=f'wrong-{self.realm.user_princ}') From 58ae9638e06cf035db5f040d78bf033a9145aefb Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:23:34 +0800 Subject: [PATCH 11/20] Update test_connect.py --- tests/test_connect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 5c11c127..01898cd5 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -141,7 +141,7 @@ def test_server_version_02(self): class BaseTestAuthentication(tb.ConnectedTestCase): - USERS = [] + USERS = ["testuser"] def setUp(self): super().setUp() From 8e8a44d643487cff0686b6b2d85e21117b0867fa Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:31:03 +0800 Subject: [PATCH 12/20] Update test_connect.py --- tests/test_connect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 01898cd5..54831201 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -141,7 +141,7 @@ def test_server_version_02(self): class BaseTestAuthentication(tb.ConnectedTestCase): - USERS = ["testuser"] + USERS = [('testuser_md5', 'md5', 'Test@123')] def setUp(self): super().setUp() From c47a4c6c8498336ef8df427bf505fb9090e0673c Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:36:38 +0800 Subject: [PATCH 13/20] Update test_connect.py --- tests/test_connect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 54831201..f44c0cfb 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -141,7 +141,7 @@ def test_server_version_02(self): class BaseTestAuthentication(tb.ConnectedTestCase): - USERS = [('testuser_md5', 'md5', 'Test@123')] + USERS = [('testuser', 'md5', 'Test@123')] def setUp(self): super().setUp() From 00ccfed1dae8e2116247c072650a307695c8ed5c Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Fri, 8 Aug 2025 22:45:31 +0800 Subject: [PATCH 14/20] Update test_connect.py --- tests/test_connect.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index f44c0cfb..5c11c127 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -141,7 +141,7 @@ def test_server_version_02(self): class BaseTestAuthentication(tb.ConnectedTestCase): - USERS = [('testuser', 'md5', 'Test@123')] + USERS = [] def setUp(self): super().setUp() From 7767e2cfd4f113d8a5dcf5882ea88b54bf8e555a Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:44:53 +0800 Subject: [PATCH 15/20] Update test_connect.py --- tests/test_connect.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index 5c11c127..c2397370 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -390,8 +390,7 @@ async def test_auth_md5_unsupported(self, _): await self.connect(user='md5_user', password=CORRECT_PASSWORD) -@unittest.skipIf( - distro.id() == "alpine", +@unittest.skip( "Alpine Linux ships GaussDBSQL without GSS auth support", ) class TestGssAuthentication(BaseTestAuthentication): @@ -432,7 +431,6 @@ def setup_cluster(cls): cls.cluster, server_settings=cls.get_server_settings()) async def test_auth_gssapi_ok(self): - print(f"test_auth_gssapi_ok {self.realm.user_princ}") conn = await self.connect(user=self.realm.user_princ) await conn.close() @@ -442,7 +440,6 @@ async def test_auth_gssapi_bad_srvname(self): exceptions.InternalClientError, 'Server .* not found' ): - print(f"test_auth_gssapi_bad_srvname {self.realm.user_princ}") await self.connect(user=self.realm.user_princ, krbsrvname='wrong') async def test_auth_gssapi_bad_user(self): @@ -451,7 +448,6 @@ async def test_auth_gssapi_bad_user(self): exceptions.InvalidAuthorizationSpecificationError, 'GSSAPI authentication failed for user' ): - print(f"test_auth_gssapi_bad_user {self.realm.user_princ}") await self.connect(user=f'wrong-{self.realm.user_princ}') From 11434e5f7e9a3a41dca96045a84a1b26d3317a51 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:49:17 +0800 Subject: [PATCH 16/20] Update test_connect.py --- tests/test_connect.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/test_connect.py b/tests/test_connect.py index c2397370..3dc792ea 100644 --- a/tests/test_connect.py +++ b/tests/test_connect.py @@ -24,8 +24,6 @@ import warnings import weakref -import distro - import async_gaussdb from async_gaussdb import _testbase as tb from async_gaussdb import connection as pg_connection From b6d9e9b71a513734068fdaa1b873aed6c656908f Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:55:08 +0800 Subject: [PATCH 17/20] Delete .github/workflows/python-publish.yml --- .github/workflows/python-publish.yml | 177 --------------------------- 1 file changed, 177 deletions(-) delete mode 100644 .github/workflows/python-publish.yml diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml deleted file mode 100644 index 069061fe..00000000 --- a/.github/workflows/python-publish.yml +++ /dev/null @@ -1,177 +0,0 @@ - -name: CI/CD Pipeline - -on: - push: - branches: [ main, develop ] - - pull_request: - branches: [ main ] - - release: - types: [published] - - workflow_dispatch: - -jobs: - test: - name: Test on Python ${{ matrix.python-version }} - runs-on: ubuntu-latest - - strategy: - matrix: - python-version: [3.8, 3.9, '3.10', '3.11', '3.12'] - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - - - name: Cache pip dependencies - uses: actions/cache@v3 - with: - path: ~/.cache/pip - key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt', 'setup.py', 'pyproject.toml') }} - restore-keys: | - ${{ runner.os }}-pip- - - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install pytest pytest-cov flake8 black isort - - if [ -f requirements.txt ]; then - pip install -r requirements.txt - fi - - if [ -f setup.py ]; then - pip install -e . - elif [ -f pyproject.toml ]; then - pip install -e . - fi - - - name: Code quality checks - run: | - black --check . - - isort --check-only . - - flake8 . - - - name: Run tests - run: | - pytest --cov=. --cov-report=xml --cov-report=html - - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v3 - with: - file: ./coverage.xml - fail_ci_if_error: true - - build: - name: Build package - runs-on: ubuntu-latest - needs: test - if: github.event_name == 'release' || github.event_name == 'workflow_dispatch' - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11' - - - name: Install build dependencies - run: | - python -m pip install --upgrade pip - pip install build twine - - - name: Build package - run: | - python -m build - - - name: Check package - run: | - twine check dist/* - - - name: Upload artifacts - uses: actions/upload-artifact@v3 - with: - name: dist - path: dist/ - - publish-test: - name: Publish to Test PyPI - runs-on: ubuntu-latest - needs: build - if: github.event_name == 'workflow_dispatch' - environment: - name: test-pypi - url: https://test.pypi.org/p/${{ github.event.repository.name }} - - steps: - - name: Download artifacts - uses: actions/download-artifact@v3 - with: - name: dist - path: dist/ - - - name: Publish to Test PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - repository-url: https://test.pypi.org/legacy/ - password: ${{ secrets.TEST_PYPI_API_TOKEN }} - - publish-pypi: - name: Publish to PyPI - runs-on: ubuntu-latest - needs: build - if: github.event_name == 'release' - environment: - name: pypi - url: https://pypi.org/p/${{ github.event.repository.name }} - - steps: - - name: Download artifacts - uses: actions/download-artifact@v3 - with: - name: dist - path: dist/ - - - name: Publish to PyPI - uses: pypa/gh-action-pypi-publish@release/v1 - with: - password: ${{ secrets.PYPI_API_TOKEN }} - - security-scan: - name: Security scan - runs-on: ubuntu-latest - needs: test - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.11' - - - name: Install security tools - run: | - python -m pip install --upgrade pip - pip install safety bandit - - - name: Run safety check - run: | - safety check - - - name: Run bandit security scan - run: | - bandit -r . -x tests/ From 1f396910a6a564b422ccb09bf48f1191dcf96e56 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:58:55 +0800 Subject: [PATCH 18/20] Update README.rst --- README.rst | 40 +--------------------------------------- 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/README.rst b/README.rst index 9de21e8e..f91436cd 100644 --- a/README.rst +++ b/README.rst @@ -24,27 +24,6 @@ optimizations for openGauss-specific features and enterprise database requiremen * Comprehensive test suite adapted for openGauss -Documentation -------------- - -The project documentation can be found -`here `_. - - -Performance ------------ - -async_gaussdb-gaussdb maintains the high performance characteristics of the original -async_gaussdb library while being optimized for GaussDB/openGauss environments. - -.. image:: https://raw.githubusercontent.com/MagicStack/async_gaussdb/master/performance.png?fddca40ab0 - :target: https://gistpreview.github.io/?0ed296e93523831ea0918d42dd1258c2 - -The above results are a geometric mean of benchmarks obtained with PostgreSQL -`client driver benchmarking toolbench `_ -in June 2023 (click on the chart to see full details). - - Features -------- @@ -137,21 +116,4 @@ This library includes enhanced support for GaussDB and openGauss databases: asyncio.run(run()) -Development with Docker ----------------------- - -A Dockerfile is provided for development with openGauss: - -.. code-block:: bash - - # Build the development image - docker build -t async_gaussdb-gaussdb-dev . - - # Run the container - docker run -it async_gaussdb-gaussdb-dev - - -License -------- - -async_gaussdb-gaussdb is developed and distributed under the Apache 2.0 license. +asyncpg is developed and distributed under the Apache 2.0 license. From 4479739a46dfedde298d8674507952bf8d0468d4 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 15:59:42 +0800 Subject: [PATCH 19/20] Update README.rst --- README.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index f91436cd..52ab0922 100644 --- a/README.rst +++ b/README.rst @@ -1,4 +1,4 @@ -async_gaussdb-gaussdb -- A fast GaussDB/openGauss Database Client Library for Python/asyncio +async_gaussdb -- A fast GaussDB/openGauss Database Client Library for Python/asyncio ===================================================================================== .. image:: https://github.com/MagicStack/async_gaussdb/workflows/Tests/badge.svg @@ -7,12 +7,12 @@ async_gaussdb-gaussdb -- A fast GaussDB/openGauss Database Client Library for Py .. image:: https://img.shields.io/pypi/v/async_gaussdb.svg :target: https://pypi.python.org/pypi/async_gaussdb -**async_gaussdb-gaussdb** is a database interface library designed specifically for +**async_gaussdb** is a database interface library designed specifically for GaussDB and openGauss databases with Python/asyncio. This fork of async_gaussdb is optimized for GaussDB/openGauss compatibility, including native SHA256 authentication support and enhanced features for enterprise database environments. -async_gaussdb-gaussdb requires Python 3.8 or later and is specifically designed for +async_gaussdb requires Python 3.8 or later and is specifically designed for GaussDB and openGauss databases. It includes compatibility fixes and optimizations for openGauss-specific features and enterprise database requirements. @@ -27,7 +27,7 @@ optimizations for openGauss-specific features and enterprise database requiremen Features -------- -async_gaussdb-gaussdb implements the GaussDB/openGauss server protocol natively and +async_gaussdb implements the GaussDB/openGauss server protocol natively and exposes its features directly, optimized for enterprise database environments: * **SHA256 authentication** - Native support for GaussDB/openGauss authentication @@ -44,7 +44,7 @@ exposes its features directly, optimized for enterprise database environments: Installation ------------ -async_gaussdb-gaussdb is available on PyPI. When not using GSSAPI/SSPI authentication it +async_gaussdb is available on PyPI. When not using GSSAPI/SSPI authentication it has no dependencies. Use pip to install:: $ pip install async-gaussdb From e21d25055213e29512bdaa9d7d69d5f7e41e9684 Mon Sep 17 00:00:00 2001 From: zhanghaitao3 <50770397+zhanghaitao3@users.noreply.github.com> Date: Sun, 10 Aug 2025 16:35:02 +0800 Subject: [PATCH 20/20] Update release.yml --- .github/workflows/release.yml | 57 +++++++---------------------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 95c0c810..f6a55da1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,49 +1,15 @@ name: Release on: - pull_request: - branches: - - "master" - - "ci" - - "[0-9]+.[0-9x]+*" - paths: - - "async_gaussdb/_version.py" + push: + tags: + - "*" -jobs: - validate-release-request: - runs-on: ubuntu-latest - steps: - - name: Validate release PR - uses: edgedb/action-release/validate-pr@master - id: checkver - with: - require_team: Release Managers - require_approval: no - github_token: ${{ secrets.RELEASE_BOT_GITHUB_TOKEN }} - version_file: async_gaussdb/_version.py - version_line_pattern: | - __version__(?:\s*:\s*typing\.Final)?\s*=\s*(?:['"])([[:PEP440:]])(?:['"]) - - - name: Stop if not approved - if: steps.checkver.outputs.approved != 'true' - run: | - echo ::error::PR is not approved yet. - exit 1 - - - name: Store release version for later use - env: - VERSION: ${{ steps.checkver.outputs.version }} - run: | - mkdir -p dist/ - echo "${VERSION}" > dist/VERSION - - - uses: actions/upload-artifact@v4 - with: - name: dist-version - path: dist/VERSION +permissions: + contents: write +jobs: build-sdist: - needs: validate-release-request runs-on: ubuntu-latest env: @@ -71,7 +37,6 @@ jobs: path: dist/*.tar.* build-wheels-matrix: - needs: validate-release-request runs-on: ubuntu-latest outputs: include: ${{ steps.set-matrix.outputs.include }} @@ -119,7 +84,7 @@ jobs: if: runner.os == 'Linux' uses: docker/setup-qemu-action@v2 - - uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b # v2.21.3 + - uses: pypa/cibuildwheel@7940a4c0e76eb2030e473a5f864f291f63ee879b with: only: ${{ matrix.only }} env: @@ -214,8 +179,8 @@ jobs: id: relver run: | set -e - echo "version=$(cat dist/VERSION)" >> $GITHUB_OUTPUT - rm dist/VERSION + # 从标签中提取版本 + echo "version=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT - name: Merge and tag the PR uses: edgedb/action-release/merge@master @@ -233,8 +198,8 @@ jobs: with: tag_name: v${{ steps.relver.outputs.version }} release_name: v${{ steps.relver.outputs.version }} - target: ${{ github.event.pull_request.base.ref }} - body: ${{ github.event.pull_request.body }} + target: ${{ github.ref }} # 使用提交的标签作为目标 + body: "Release v${{ steps.relver.outputs.version }}" - run: | ls -al dist/