From 9f4a3c06fc0e11b94013e3ae696183f64c4f47ac Mon Sep 17 00:00:00 2001 From: zchpeter Date: Mon, 3 Nov 2025 04:09:32 -0500 Subject: [PATCH 1/4] feat: schema first draft --- .../workflows/declarative-release-action.yml | 99 +++++++++++++++++++ .github/workflows/sql-review-action.yml | 32 ++++++ schema/class.sql | 8 ++ schema/class_student.sql | 10 ++ schema/sequences.sql | 3 + schema/student.sql | 10 ++ 6 files changed, 162 insertions(+) create mode 100644 .github/workflows/declarative-release-action.yml create mode 100644 .github/workflows/sql-review-action.yml create mode 100644 schema/class.sql create mode 100644 schema/class_student.sql create mode 100644 schema/sequences.sql create mode 100644 schema/student.sql diff --git a/.github/workflows/declarative-release-action.yml b/.github/workflows/declarative-release-action.yml new file mode 100644 index 0000000..9718f83 --- /dev/null +++ b/.github/workflows/declarative-release-action.yml @@ -0,0 +1,99 @@ +name: Declarative rollout using bytebase-action image + +on: + push: + branches: + - main + paths: + - "schema/*.sql" + +# cancel previous workflow run if a new workflow run is triggered +# to prevent multiple rollout +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +env: + BYTEBASE_URL: http://localhost:8080 + BYTEBASE_SERVICE_ACCOUNT: api@service.bytebase.com # set service account via environment variable + BYTEBASE_SERVICE_ACCOUNT_SECRET: ${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }} # set service account secret via environment variable + BYTEBASE_PROJECT: "projects/project-test" + +jobs: + build: + runs-on: self-hosted + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Build app and upload + run: | + echo "Building..." + echo "Build done!" + echo "Uploading..." + echo "Upload done!" + create-rollout: + needs: build + # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. + runs-on: self-hosted + container: + # image: bytebase/bytebase-action:latest + image: bytebase/bytebase-action:3.12.0 + outputs: + bytebase-plan: ${{ steps.set-output.outputs.plan }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Roll out database change + env: + BYTEBASE_TARGETS: "instances/test-sample-instance/databases/school_test,instances/prod-sample-instance/databases/school_prod" + FILE_PATTERN: "schema/*.sql" + BYTEBASE_OUTPUT: ${{ runner.temp }}/bytebase-metadata.json + run: | + bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --file-pattern=${{ env.FILE_PATTERN }} --targets=${{ env.BYTEBASE_TARGETS }} --declarative --output=${{ env.BYTEBASE_OUTPUT }} + - name: Set output + id: set-output + run: | + PLAN=$(jq -r .plan ${{ runner.temp }}/bytebase-metadata.json) + echo "plan=$PLAN" >> $GITHUB_OUTPUT + deploy-to-test: + needs: create-rollout + # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. + runs-on: self-hosted + environment: test + container: + # image: bytebase/bytebase-action:latest + image: bytebase/bytebase-action:3.12.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Roll out database change + env: + BYTEBASE_TARGET_STAGE: environments/test + run: | + bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} + - name: Deploy app + run: | + echo "Deploying app to test environment..." + echo "Deploy app to test environment done!" + deploy-to-prod: + needs: + - deploy-to-test + - create-rollout + # runs-on: ubuntu-latest + runs-on: self-hosted + environment: prod + container: + # image: bytebase/bytebase-action:latest + image: bytebase/bytebase-action:3.12.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: rollout + env: + BYTEBASE_TARGET_STAGE: environments/prod + run: | + bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} + - name: Deploy app + run: | + echo "Deploying app to prod environment..." + echo "Deploy app to prod environment done!" \ No newline at end of file diff --git a/.github/workflows/sql-review-action.yml b/.github/workflows/sql-review-action.yml new file mode 100644 index 0000000..1d8bad8 --- /dev/null +++ b/.github/workflows/sql-review-action.yml @@ -0,0 +1,32 @@ +name: SQL review on pull request using bytebase-action image + +on: + pull_request: + branches: + - main + paths: + - "schema/*.sql" + +jobs: + check-release-on-prod: + permissions: + pull-requests: write # write permission required to allow the action writes the check results to the comment. + # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. + runs-on: self-hosted + container: + # image: docker://bytebase/bytebase-action:latest + image: docker://bytebase/bytebase-action:3.12.0 + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Check release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # set GITHUB_TOKEN because the 'Check release' step needs it to comment the pull request with check results. + BYTEBASE_URL: http://localhost:8080 + BYTEBASE_SERVICE_ACCOUNT: api@service.bytebase.com # set service account via environment variable + BYTEBASE_SERVICE_ACCOUNT_SECRET: ${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }} # set service account secret via environment variable + BYTEBASE_PROJECT: "projects/project-test" + BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/school_prod" + FILE_PATTERN: "schema/*.sql" + run: | + bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} \ No newline at end of file diff --git a/schema/class.sql b/schema/class.sql new file mode 100644 index 0000000..c61b698 --- /dev/null +++ b/schema/class.sql @@ -0,0 +1,8 @@ +CREATE TABLE "public"."class" ( + "class_no" integer DEFAULT nextval('public.class_no_seq'::regclass) NOT NULL, + "class_name" text NOT NULL, + "grade" integer NOT NULL, + CONSTRAINT "class_pkey" PRIMARY KEY (class_no), + CONSTRAINT "class_grade_check" CHECK (grade > 0 AND grade <= 12) +); + diff --git a/schema/class_student.sql b/schema/class_student.sql new file mode 100644 index 0000000..1613b07 --- /dev/null +++ b/schema/class_student.sql @@ -0,0 +1,10 @@ +CREATE TABLE "public"."class_student" ( + "class_no" integer NOT NULL, + "student_no" integer NOT NULL, + "from_date" date NOT NULL, + "to_date" date NOT NULL, + CONSTRAINT "class_student_pkey" PRIMARY KEY (class_no, student_no), + CONSTRAINT "class_student_class_no_fkey" FOREIGN KEY ("class_no") REFERENCES "public"."class" ("class_no") ON DELETE CASCADE, + CONSTRAINT "class_student_student_no_fkey" FOREIGN KEY ("student_no") REFERENCES "public"."student" ("student_no") ON DELETE CASCADE +); + diff --git a/schema/sequences.sql b/schema/sequences.sql new file mode 100644 index 0000000..b35cb02 --- /dev/null +++ b/schema/sequences.sql @@ -0,0 +1,3 @@ +CREATE SEQUENCE "public"."class_no_seq" AS bigint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 NO CYCLE CACHE 1; + +CREATE SEQUENCE "public"."student_no_seq" AS bigint START WITH 1 INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 NO CYCLE CACHE 1; diff --git a/schema/student.sql b/schema/student.sql new file mode 100644 index 0000000..afba1e2 --- /dev/null +++ b/schema/student.sql @@ -0,0 +1,10 @@ +CREATE TABLE "public"."student" ( + "student_no" integer DEFAULT nextval('public.student_no_seq'::regclass) NOT NULL, + "birth_date" date NOT NULL, + "first_name" text NOT NULL, + "last_name" text NOT NULL, + "gender" text NOT NULL, + CONSTRAINT "student_pkey" PRIMARY KEY (student_no), + CONSTRAINT "student_gender_check" CHECK (gender = ANY (ARRAY['M'::text, 'F'::text])) +); + From 026f01b0ff69a9ac07241c0ae159da745568831b Mon Sep 17 00:00:00 2001 From: zchpeter Date: Mon, 3 Nov 2025 04:53:56 -0500 Subject: [PATCH 2/4] fix: update job run script to fix 'Container operations are only supported on Linux runners' issue --- .github/workflows/sql-review-action.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/sql-review-action.yml b/.github/workflows/sql-review-action.yml index 1d8bad8..0c8a7d9 100644 --- a/.github/workflows/sql-review-action.yml +++ b/.github/workflows/sql-review-action.yml @@ -13,20 +13,28 @@ jobs: pull-requests: write # write permission required to allow the action writes the check results to the comment. # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. runs-on: self-hosted - container: - # image: docker://bytebase/bytebase-action:latest - image: docker://bytebase/bytebase-action:3.12.0 steps: - name: Checkout uses: actions/checkout@v4 - name: Check release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # set GITHUB_TOKEN because the 'Check release' step needs it to comment the pull request with check results. - BYTEBASE_URL: http://localhost:8080 + BYTEBASE_URL: http://host.docker.internal:8080 BYTEBASE_SERVICE_ACCOUNT: api@service.bytebase.com # set service account via environment variable BYTEBASE_SERVICE_ACCOUNT_SECRET: ${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }} # set service account secret via environment variable BYTEBASE_PROJECT: "projects/project-test" BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/school_prod" FILE_PATTERN: "schema/*.sql" run: | - bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} \ No newline at end of file + docker run --rm \ + -v ${{ github.workspace }}:/workspace \ + -e GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}" \ + -e BYTEBASE_URL="${{ env.BYTEBASE_URL }}" \ + -e BYTEBASE_SERVICE_ACCOUNT="${{ env.BYTEBASE_SERVICE_ACCOUNT }}" \ + -e BYTEBASE_SERVICE_ACCOUNT_SECRET="${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }}" \ + -e BYTEBASE_PROJECT="${{ env.BYTEBASE_PROJECT }}" \ + -e BYTEBASE_TARGETS="${{ env.BYTEBASE_TARGETS }}" \ + -e FILE_PATTERN="${{ env.FILE_PATTERN }}" \ + -w /workspace \ + bytebase/bytebase-action:3.12.0 \ + bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} \ No newline at end of file From e1473a488aaec1568cf31f29a6fa6c7519762ac6 Mon Sep 17 00:00:00 2001 From: zchpeter Date: Mon, 3 Nov 2025 05:04:49 -0500 Subject: [PATCH 3/4] fix: add logging --- .github/workflows/sql-review-action.yml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/sql-review-action.yml b/.github/workflows/sql-review-action.yml index 0c8a7d9..ea860a9 100644 --- a/.github/workflows/sql-review-action.yml +++ b/.github/workflows/sql-review-action.yml @@ -26,15 +26,19 @@ jobs: BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/school_prod" FILE_PATTERN: "schema/*.sql" run: | + ls -la schema/ docker run --rm \ - -v ${{ github.workspace }}:/workspace \ + --add-host=host.docker.internal:host-gateway \ + -v "${{ github.workspace }}":/workspace \ -e GITHUB_TOKEN="${{ secrets.GITHUB_TOKEN }}" \ -e BYTEBASE_URL="${{ env.BYTEBASE_URL }}" \ -e BYTEBASE_SERVICE_ACCOUNT="${{ env.BYTEBASE_SERVICE_ACCOUNT }}" \ -e BYTEBASE_SERVICE_ACCOUNT_SECRET="${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }}" \ -e BYTEBASE_PROJECT="${{ env.BYTEBASE_PROJECT }}" \ -e BYTEBASE_TARGETS="${{ env.BYTEBASE_TARGETS }}" \ - -e FILE_PATTERN="${{ env.FILE_PATTERN }}" \ + -e GITHUB_REPOSITORY="${{ github.repository }}" \ + -e GITHUB_EVENT_NUMBER="${{ github.event.number }}" \ + -e GITHUB_API_URL="${{ github.api_url }}" \ -w /workspace \ bytebase/bytebase-action:3.12.0 \ - bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} \ No newline at end of file + sh -c "ls -la /workspace/schema/ && bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} --declarative" \ No newline at end of file From 50678cf04dfdf51dee969948a933f13758936368 Mon Sep 17 00:00:00 2001 From: zchpeter Date: Mon, 3 Nov 2025 05:13:31 -0500 Subject: [PATCH 4/4] fix: apply similar fix to release action --- .../workflows/declarative-release-action.yml | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/.github/workflows/declarative-release-action.yml b/.github/workflows/declarative-release-action.yml index 9718f83..79305aa 100644 --- a/.github/workflows/declarative-release-action.yml +++ b/.github/workflows/declarative-release-action.yml @@ -14,7 +14,7 @@ concurrency: cancel-in-progress: true env: - BYTEBASE_URL: http://localhost:8080 + BYTEBASE_URL: http://host.docker.internal:8080 BYTEBASE_SERVICE_ACCOUNT: api@service.bytebase.com # set service account via environment variable BYTEBASE_SERVICE_ACCOUNT_SECRET: ${{ secrets.BYTEBASE_SERVICE_ACCOUNT_SECRET }} # set service account secret via environment variable BYTEBASE_PROJECT: "projects/project-test" @@ -35,9 +35,6 @@ jobs: needs: build # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. runs-on: self-hosted - container: - # image: bytebase/bytebase-action:latest - image: bytebase/bytebase-action:3.12.0 outputs: bytebase-plan: ${{ steps.set-output.outputs.plan }} steps: @@ -49,7 +46,19 @@ jobs: FILE_PATTERN: "schema/*.sql" BYTEBASE_OUTPUT: ${{ runner.temp }}/bytebase-metadata.json run: | - bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --file-pattern=${{ env.FILE_PATTERN }} --targets=${{ env.BYTEBASE_TARGETS }} --declarative --output=${{ env.BYTEBASE_OUTPUT }} + ls -la schema/ + docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -v "${{ github.workspace }}":/workspace \ + -v "${{ runner.temp }}":/temp \ + -e BYTEBASE_URL="${{ env.BYTEBASE_URL }}" \ + -e BYTEBASE_SERVICE_ACCOUNT="${{ env.BYTEBASE_SERVICE_ACCOUNT }}" \ + -e BYTEBASE_SERVICE_ACCOUNT_SECRET="${{ env.BYTEBASE_SERVICE_ACCOUNT_SECRET }}" \ + -e BYTEBASE_PROJECT="${{ env.BYTEBASE_PROJECT }}" \ + -e BYTEBASE_TARGETS="${{ env.BYTEBASE_TARGETS }}" \ + -w /workspace \ + bytebase/bytebase-action:3.12.0 \ + sh -c "ls -la /workspace/schema/ && bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --file-pattern=${{ env.FILE_PATTERN }} --targets=${{ env.BYTEBASE_TARGETS }} --declarative --output=/temp/bytebase-metadata.json" - name: Set output id: set-output run: | @@ -60,9 +69,6 @@ jobs: # runs-on: ubuntu-latest # use self-hosted machines if your Bytebase runs in internal networks. runs-on: self-hosted environment: test - container: - # image: bytebase/bytebase-action:latest - image: bytebase/bytebase-action:3.12.0 steps: - name: Checkout uses: actions/checkout@v4 @@ -70,21 +76,28 @@ jobs: env: BYTEBASE_TARGET_STAGE: environments/test run: | - bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} + docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -v "${{ github.workspace }}":/workspace \ + -e BYTEBASE_URL="${{ env.BYTEBASE_URL }}" \ + -e BYTEBASE_SERVICE_ACCOUNT="${{ env.BYTEBASE_SERVICE_ACCOUNT }}" \ + -e BYTEBASE_SERVICE_ACCOUNT_SECRET="${{ env.BYTEBASE_SERVICE_ACCOUNT_SECRET }}" \ + -e BYTEBASE_PROJECT="${{ env.BYTEBASE_PROJECT }}" \ + -e BYTEBASE_TARGET_STAGE="${{ env.BYTEBASE_TARGET_STAGE }}" \ + -w /workspace \ + bytebase/bytebase-action:3.12.0 \ + bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} - name: Deploy app run: | echo "Deploying app to test environment..." echo "Deploy app to test environment done!" deploy-to-prod: - needs: + needs: - deploy-to-test - create-rollout # runs-on: ubuntu-latest runs-on: self-hosted environment: prod - container: - # image: bytebase/bytebase-action:latest - image: bytebase/bytebase-action:3.12.0 steps: - name: Checkout uses: actions/checkout@v4 @@ -92,7 +105,17 @@ jobs: env: BYTEBASE_TARGET_STAGE: environments/prod run: | - bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} + docker run --rm \ + --add-host=host.docker.internal:host-gateway \ + -v "${{ github.workspace }}":/workspace \ + -e BYTEBASE_URL="${{ env.BYTEBASE_URL }}" \ + -e BYTEBASE_SERVICE_ACCOUNT="${{ env.BYTEBASE_SERVICE_ACCOUNT }}" \ + -e BYTEBASE_SERVICE_ACCOUNT_SECRET="${{ env.BYTEBASE_SERVICE_ACCOUNT_SECRET }}" \ + -e BYTEBASE_PROJECT="${{ env.BYTEBASE_PROJECT }}" \ + -e BYTEBASE_TARGET_STAGE="${{ env.BYTEBASE_TARGET_STAGE }}" \ + -w /workspace \ + bytebase/bytebase-action:3.12.0 \ + bytebase-action rollout --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --target-stage=${{ env.BYTEBASE_TARGET_STAGE }} --plan=${{ needs.create-rollout.outputs.bytebase-plan }} - name: Deploy app run: | echo "Deploying app to prod environment..."