diff --git a/.bytebase/sql-review.md b/.bytebase/sql-review.md new file mode 100644 index 0000000..106d523 --- /dev/null +++ b/.bytebase/sql-review.md @@ -0,0 +1,5 @@ +# .bytebase/sql-review.md +# SQL Review Standards + +## 1. Table Naming Convention +- All table names must be in snake_case diff --git a/.github/workflows/chatops-migrate.yml b/.github/workflows/chatops-migrate.yml index 04bb4ce..fbc6d9d 100644 --- a/.github/workflows/chatops-migrate.yml +++ b/.github/workflows/chatops-migrate.yml @@ -5,10 +5,10 @@ on: types: [created] env: - BYTEBASE_URL: https://demo.bytebase.com + BYTEBASE_URL: https://valid-just-tadpole.ngrok-free.app 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/hr" + BYTEBASE_PROJECT: "projects/project-sample" FILE_PATTERN: "migrations-semver/*.sql" jobs: diff --git a/.github/workflows/declarative-release-action-mysql.yml b/.github/workflows/declarative-release-action-mysql.yml new file mode 100644 index 0000000..353c174 --- /dev/null +++ b/.github/workflows/declarative-release-action-mysql.yml @@ -0,0 +1,93 @@ +name: Declarative rollout for MySQL using bytebase-action image + +on: + push: + branches: + - main + paths: + - "schema-mysql/*.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: https://valid-just-tadpole.ngrok-free.app + 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/mysql-project" + +jobs: + build: + runs-on: ubuntu-latest + 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. + container: + image: bytebase/bytebase-action:latest + outputs: + bytebase-plan: ${{ steps.set-output.outputs.plan }} + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Roll out database change + env: + BYTEBASE_TARGETS: "instances/mysql-test-instance-05k8/databases/testdb,instances/mysql-test-instance-05k8/databases/proddb" + FILE_PATTERN: "schema-mysql/*.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. + environment: test + container: + image: bytebase/bytebase-action:latest + 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 + environment: prod + container: + image: bytebase/bytebase-action:latest + 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!" diff --git a/.github/workflows/declarative-release-action.yml b/.github/workflows/declarative-release-action.yml index e5e1c54..b0ea245 100644 --- a/.github/workflows/declarative-release-action.yml +++ b/.github/workflows/declarative-release-action.yml @@ -14,10 +14,10 @@ concurrency: cancel-in-progress: true env: - BYTEBASE_URL: https://demo.bytebase.com + BYTEBASE_URL: https://valid-just-tadpole.ngrok-free.app 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/hr" + BYTEBASE_PROJECT: "projects/project-sample" jobs: build: diff --git a/.github/workflows/declarative-sql-review-action-mysql.yml b/.github/workflows/declarative-sql-review-action-mysql.yml new file mode 100644 index 0000000..3b8a6d7 --- /dev/null +++ b/.github/workflows/declarative-sql-review-action-mysql.yml @@ -0,0 +1,31 @@ +name: SQL review on pull request with declarative release for MySQL using bytebase-action image + +on: + pull_request: + branches: + - main + paths: + - "schema-mysql/*.sql" + - ".bytebase/sql-review.md" + +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. + container: + image: bytebase/bytebase-action:latest + 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: https://valid-just-tadpole.ngrok-free.app + 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/mysql-project" + BYTEBASE_TARGETS: "instances/mysql-test-instance-05k8/databases/proddb" + FILE_PATTERN: "schema-mysql/*.sql" + run: | + bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} --declarative --custom-rules "$(cat .bytebase/sql-review.md)" diff --git a/.github/workflows/declarative-sql-review-action.yml b/.github/workflows/declarative-sql-review-action.yml index b32edad..29d4e1e 100644 --- a/.github/workflows/declarative-sql-review-action.yml +++ b/.github/workflows/declarative-sql-review-action.yml @@ -6,6 +6,7 @@ on: - main paths: - "schema/*.sql" + - ".bytebase/sql-review.md" jobs: check-release-on-prod: @@ -20,11 +21,11 @@ jobs: - 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: https://demo.bytebase.com + BYTEBASE_URL: https://valid-just-tadpole.ngrok-free.app 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/hr" + BYTEBASE_PROJECT: "projects/project-sample" BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/hr_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 }} --declarative + bytebase-action check --url=${{ env.BYTEBASE_URL }} --project=${{ env.BYTEBASE_PROJECT }} --targets=${{ env.BYTEBASE_TARGETS }} --file-pattern=${{ env.FILE_PATTERN }} --declarative --custom-rules "$(cat .bytebase/sql-review.md)" diff --git a/.github/workflows/release-action.yml b/.github/workflows/release-action.yml index 3270f27..6a38960 100644 --- a/.github/workflows/release-action.yml +++ b/.github/workflows/release-action.yml @@ -8,10 +8,10 @@ on: - "migrations-semver/*.sql" env: - BYTEBASE_URL: https://demo.bytebase.com + BYTEBASE_URL: https://valid-just-tadpole.ngrok-free.app 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/hr" + BYTEBASE_PROJECT: "projects/project-sample" jobs: build: diff --git a/.github/workflows/sql-review-action.yml b/.github/workflows/sql-review-action.yml index d377bab..bcf1ee0 100644 --- a/.github/workflows/sql-review-action.yml +++ b/.github/workflows/sql-review-action.yml @@ -20,10 +20,10 @@ jobs: - 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: https://demo.bytebase.com + BYTEBASE_URL: https://valid-just-tadpole.ngrok-free.app 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/hr" + BYTEBASE_PROJECT: "projects/project-sample" BYTEBASE_TARGETS: "instances/prod-sample-instance/databases/hr_prod" FILE_PATTERN: "migrations-semver/*.sql" run: | diff --git a/migrations-semver/1.0.0_init.sql b/migrations-semver/1.0.0_init.sql deleted file mode 100644 index 3d49b78..0000000 --- a/migrations-semver/1.0.0_init.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - id SERIAL PRIMARY KEY, - name VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL UNIQUE -) \ No newline at end of file diff --git a/migrations-semver/1.0.1_create_t0.sql b/migrations-semver/1.0.1_create_t0.sql new file mode 100644 index 0000000..363e83a --- /dev/null +++ b/migrations-semver/1.0.1_create_t0.sql @@ -0,0 +1,4 @@ +CREATE TABLE "public"."t0" ( + "id" serial PRIMARY KEY, + "username" text NOT NULL +) diff --git a/migrations-semver/1.0.1_init_data_dml.sql b/migrations-semver/1.0.1_init_data_dml.sql deleted file mode 100644 index 075b74f..0000000 --- a/migrations-semver/1.0.1_init_data_dml.sql +++ /dev/null @@ -1,5 +0,0 @@ -INSERT INTO users ( - id, name, email -) VALUES ( - 1, 'me', 'me@me.com' -); diff --git a/migrations-semver/1.1.1_comment.sql b/migrations-semver/1.1.1_comment.sql deleted file mode 100644 index c7fca96..0000000 --- a/migrations-semver/1.1.1_comment.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE IF EXISTS users ADD COLUMN IF NOT EXISTS comment VARCHAR(255) NOT NULL DEFAULT ''; \ No newline at end of file diff --git a/migrations-semver/1.13.0_phone.sql b/migrations-semver/1.13.0_phone.sql deleted file mode 100644 index e8de331..0000000 --- a/migrations-semver/1.13.0_phone.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE IF EXISTS users ADD COLUMN IF NOT EXISTS phone VARCHAR(255) NOT NULL DEFAULT ''; diff --git a/migrations-semver/1.14.0_email.sql b/migrations-semver/1.14.0_email.sql deleted file mode 100644 index aefd24d..0000000 --- a/migrations-semver/1.14.0_email.sql +++ /dev/null @@ -1 +0,0 @@ -ALTER TABLE IF EXISTS users ADD COLUMN IF NOT EXISTS email VARCHAR(255) NOT NULL DEFAULT ''; diff --git a/migrations-semver/1.3.5_nickname.sql b/migrations-semver/1.3.5_nickname.sql deleted file mode 100644 index 09eed38..0000000 --- a/migrations-semver/1.3.5_nickname.sql +++ /dev/null @@ -1,2 +0,0 @@ --- add nickname column for users -ALTER TABLE IF EXISTS users ADD COLUMN IF NOT EXISTS nickname VARCHAR(255) NOT NULL DEFAULT ''; diff --git a/schema-mysql/schema.sql b/schema-mysql/schema.sql new file mode 100644 index 0000000..b710209 --- /dev/null +++ b/schema-mysql/schema.sql @@ -0,0 +1,15 @@ +CREATE TABLE `employee` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `email` varchar(255) NOT NULL, + `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `employee_email_key` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +CREATE TABLE `department` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `department_name_key` (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; diff --git a/schema/schema.sql b/schema/schema.sql index cc6e61e..a7ce541 100644 --- a/schema/schema.sql +++ b/schema/schema.sql @@ -1,11 +1,16 @@ COMMENT ON SCHEMA "public" IS 'standard public schema'; +CREATE TABLE "public"."fake_table" ( + "id" serial, + "name" text +); + CREATE TABLE "public"."audit" ( "id" serial, "operation" text NOT NULL, "query" text, "user_name" text NOT NULL, - "changed_at" timestamptz DEFAULT now(), + "changed_at" timestamp(6) with time zone DEFAULT CURRENT_TIMESTAMP, CONSTRAINT "audit_pkey" PRIMARY KEY (id) ); @@ -18,7 +23,6 @@ CREATE INDEX "idx_audit_username" ON ONLY "public"."audit" (user_name); CREATE TABLE "public"."department" ( "dept_no" text NOT NULL, "dept_name" text NOT NULL, - created_at timestamptz DEFAULT now(), CONSTRAINT "department_pkey" PRIMARY KEY (dept_no), CONSTRAINT "department_dept_name_key" UNIQUE (dept_name) );