有没有人知道如何通过Jenkins运行DDL脚本来创建Cassandra数据库?我试图通过Jenkins在测试环境中连接到Cassandra,以便上传测试基线数据集并对其进行集成测试。
答案 0 :(得分:2)
我创建了自己的解决方案来解决类似的问题。不仅仅是为了测试,而是为了随着时间的推移对模式进行更改而按顺序应用脚本。它可以在Jenkins或任何地方工作。有一个类按顺序旋转脚本列表,将每个脚本作为输入流打开。然后该类调用此类的execute()方法:
package org.makeyourcase.persistence;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
import com.datastax.driver.core.Cluster;
import com.datastax.driver.core.Session;
import com.datastax.driver.core.exceptions.SyntaxError;
import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class CqlFileRunner {
private static final Logger LOG = Logger.getLogger(CqlFileRunner.class);
@Value("${cassandra.node}")
private String node;
@Value("${cassandra.keyspace}")
private String keyspace;
@Autowired
private CassandraClusterBuilderMaker cassandraClusterBuilderMaker;
public void execute(InputStream commandStream) throws IOException {
byte[] commandBuffer = new byte[commandStream.available()];
IOUtils.readFully(commandStream, commandBuffer);
Cluster cluster = cassandraClusterBuilderMaker.create().addContactPoint(node).build();
Session session = cluster.connect(keyspace);
List<String> commands = Arrays.asList(new String(commandBuffer, "UTF-8").split(";"));
for(String command : commands){
if(!command.trim().isEmpty()){
command = command.trim() + ";";
LOG.info("Execute:\n" + command);
try {
session.execute(command);
} catch (SyntaxError e) {
LOG.error("Command failed with " + e.getMessage());
throw e;
}
}
}
}
}
鉴于此,您可以运行“cql scripts”来创建表并加载数据。它适用于小批量的东西,但对于任何大的东西来说可能都太慢了。脚本可能如下所示:
CREATE TABLE access_tiers (
level bigint PRIMARY KEY,
role text
);
ALTER TABLE access_tiers WITH caching = 'all' AND compression = {'sstable_compression' : ''};
INSERT INTO access_tiers (level, role) VALUES (200, 'user_tier2');
INSERT INTO access_tiers (level, role) VALUES (1000, 'user_tier3');
INSERT INTO access_tiers (level, role) VALUES (5000, 'user_tier4');
INSERT INTO access_tiers (level, role) VALUES (10000, 'user_tier5');
INSERT INTO access_tiers (level, role) VALUES (20000, 'user_tier6');
INSERT INTO access_tiers (level, role) VALUES (50000, 'moderator');
编辑:
从这篇原始帖子开始,我已经提取了我正在为我的项目使用的Java版本控制组件。我还创建了一个小示例项目,展示了如何集成它。这是愚蠢的。这个问题有不同的方法,所以我选择了一个很容易构建并完成我需要的方法。以下是两个github项目:
答案 1 :(得分:0)
如何将DDL语句粘贴到@org.junit.Before
带注释的方法中,并且可能在@org.junit.After
中进行清理(假设您使用的是JUnit)?
IMHO测试应完全自包含(如果可能) - 需要事先运行一些手动步骤不是一个好习惯(架构更改,您在新机器或其他人需要第一次运行测试,。 ..)