【问题标题】:Continuous integration with SQL Source Control, SQL Automation Pack and Jenkins与 SQL Source Control、SQL Automation Pack 和 Jenkins 持续集成
【发布时间】:2014-08-16 06:14:07
【问题描述】:

我需要实现从一个数据库到另一个数据库(从开发到阶段)的持续集成 (CI)。 我正在使用 SQL Source Control、SQL Automation Pack 和 Jenkins 等工具。

例如,我们对 dev 进行了一些更改。 使用源代码控制,我们将更改提交到存储库。 在 Jenkins 中创建了一个作业,并设置了一个构建触发器。

我的工作有两个步骤:

1) 从存储库创建一个包

sqlCI.exe Build /scriptsFolder=. /packageId=NewCIPackage /packageVersion=1.%BUILD_NUMBER% /temporaryDatabaseServer=* /temporaryDatabaseUserName=* /temporaryDatabasePassword="*" /outputFolder=\tmp\packages

在\tmp\packages这一步之后创建必要的包

2) 使用源代码控制中的最新版本更新现有阶段数据库

sqlCI.exe Sync /databaseName=test2 /temporaryDatabaseServer=*/temporaryDatabaseUserName=* /temporaryDatabasePassword="*" /package=\tmp\packages\NewCIPackage.1.%BUILD_NUMBER%.nupkg

起初,这个变体有效,简单的更改从开发到阶段集成。但我在下一个案例中遇到了问题。

我们在 dev 和 stage 上有两个表:

create table test ( id int identity(1,1), col1 varchar(255), col2 varchar(255) );

create table test2 ( id int identity(1,1), col1 varchar(255) );

我用阶段 db 上的数据填充 TEST2。

然后我想在 TEST2 中添加外键。起初我对 dev db 进行了更改:

alter table test2 add testId int not null;

alter table test2 add constraint fk2_test2_test FOREIGN KEY(testId) references dbo.test (id);

在 Jenkins 中持续集成时提交后,我收到消息错误:

Error: The column [testId] on table [dbo].[test2] must be added but has no default and does not allow NULL values. The table must be rebuilt. If the table contains data then the deployment script will fail.

据我了解,发生此错误是因为在舞台 TEST2 上填充了数据。

我可以在不从该表中删除数据的情况下进行管理吗? 有人遇到过这样的问题吗?也许有人有任何解决方案,建议?也许我做错了什么。

【问题讨论】:

  • 可以添加没有外键约束的列,然后编写脚本用适当的数据填充列,然后添加外键约束。
  • 这意味着,所有用户都应该记住/知道这种情况并提交两次 - 第一次在添加列时(然后您还应该用数据填充此列),第二次在添加外部时提交钥匙。或者您可以记住您何时会收到来自 Jenkins 的错误邮件。也许我应该在 Jenkins 作业的第 1 步和第 2 步之间添加任何额外的步骤,或者为 Sync 添加任何额外的属性?
  • 听起来您担心在此过程中添加数据。进行此类更改后,您通常会关闭应用程序以防止添加其他数据。

标签: mysql sql sql-server jenkins


【解决方案1】:

步骤相同。 Jenkins 工作的第一步是创建 NuGet 包:

sqlCI.exe Build /scriptsFolder=<value1> /packageId=<value2> /packageVersion= <value3>  /temporaryDatabaseServer=<value4> /temporaryDatabaseUserName=** /temporaryDatabasePassword="*****" /outputFolder=<value5> /additionalCompareArgs="<options>"

第二步是使用现有的 NuGet 包根据存储库中的最新版本更新必要的数据库:

sqlci.exe Sync /databaseName=<value1> /databaseServer=<value2> /databaseUserName=***** /databasePassword="*****" /package=<value3> /additionalCompareArgs="<options>"

对于 borth 步骤,如果没有更改,最好设置 /include:Identical 这样的选项以避免构建错误。

我们还应该记住:

  1. 对于外键应确定默认值;
  2. 如果表被重命名,所有数据都会丢失;
  3. 如果提交静态数据,数据将在舞台上被覆盖;
  4. 为了使用链接服务器,应配置 DTC(或者您可以使用动态查询)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2011-04-13
    相关资源
    最近更新 更多