First some package installs, mostly as advised by the documentation on the other packages to install, but starting with the inevitable update:
sudo yum update sudo yum install autoconf curl-devel ncurses-devel openssl-devel sudo yum install gcc gcc-c++ libicu-devel
Erlang is built from scratch: to get a current version and to avoid a crypto fail in some Linux distros (including CentOS which I have on my development VM, which allows erlang and couchdb to compile and install, but fail on starting couchdb). Couchdb is compiled against this later.
curl -O http://www.erlang.org/download/otp_src_17.3.tar.gz tar xzf otp_src_17.3.tar.gz cd otp_src_17.3 export ERL_TOP=`pwd` ./configure make // make a cup of tea sudo make install cd ..
Next, we need Python, in particular the 2.7.x version, and SpiderMonkey, again not the newest one, but version 1.8.5:
curl -O https://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz tar xzf Python-2.7.8.tgz cd Python-2.7.8 ./configure make sudo make install cd .. curl -O http://ftp.mozilla.org/pub/mozilla.org/js/js185-1.0.0.tar.gz tar xzf js185-1.0.0.tar.gz cd js-1.8.5/js/src ./configure make // start to drink tea sudo make install cd /etc/ld.so.conf.d sudo vi local-x86_64.conf and add the entry: /usr/local/lib, so that the js libraries are picked up. sudo ldconfig
And now to CouchDB. Note that they have mirror sites, the one I used might not be the most appropriate for you.
sudo adduser --system --home /usr/local/var/lib/couchdb --no-create-home --shell /bin/bash --comment "CouchDB Administrator" couchdb curl -O http://mirror.ox.ac.uk/sites/rsync.apache.org/couchdb/source/1.6.1/apache-couchdb-1.6.1.tar.gz tar xzf apache-couchdb-1.6.1.tar.gz cd apache-couchdb-1.6.1 make // tea is about right now sudo make install cd /usr/local/var/run sudo chown -R couchdb:couchdb couchdb/ sudo chmod 0770 couchdb/ cd ../log/ sudo chmod 0770 couchdb/ sudo chown -R couchdb:couchdb couchdb/ cd ../lib sudo chown -R couchdb:couchdb couchdb/ sudo chmod 0770 couchdb/ cd ../../etc sudo chown -R couchdb:couchdb couchdb/ sudo chmod 0770 couchdb/ cd rc.d sudo cp couchdb /etc/rc.d/init.d sudo service couchdb start sudo chkconfig --levels 235 couchdb on
To check it is working, curl http://127.0.0.1:5984/ should respond with something like:
{"couchdb":"Welcome","uuid":"d420a7e9b585cb74039a54f1874b6a0f","version":"1.6.1","vendor":{"name":"The Apache Software Foundation","version":"1.6.1"}}
Finally, tidy up the download and build directories; make a new AMI; and point the Jenkins EC2 plugin's config for the slave at that AMI; and test. For the purposes of a short-lived CI slave whose firewall only talks ssh password protecting access with new admin users is probably overkill. However, for my application there is a database creation script which makes some assumptions about admin users; and some test cases which assume a test database. So, in the Jenkins config for the job pre-steps we have:
curl -sS -X PUT http://localhost:5984/_users/org.couchdb.user:dan -H "Accept: application/json" -H "Content-Type: application/json" -d '{"name": "dan", "password": "mumblemumble", "roles": [], "type": "user"}' curl -sS -X PUT http://dan:mumblemumble@localhost:5984/test dbConfig/create-db.couch
And observe the test passing!
For completeness, that first test is below. It doesn't do anything terribly clever: posts a new document on CouchDB and gets it back. However, it re-uses the NinjaProperties fake idea from my previous post about fakes and injection, so completes two loops!
package models; import java.util.HashMap; import java.util.Map; import java.util.UUID; import models.PersistCouchDB.IDRev; import org.junit.AfterClass; import org.junit.Test; import static org.junit.Assert.*; import org.junit.BeforeClass; /** * @author Dan Chalmers */ public class PersistCouchDBTest { public static final String DB_NAME = "test"; // note, this needs to be created on CouchDB in the test environment! static PersistCouchDBStub db; @Test public void test_postNewDoc() throws BrokenSystemException { HashMapmap; String randomString; IDRev postResult; Map getResult; map = new HashMap(); map.put("testing", "1two3"); randomString = UUID.randomUUID().toString(); map.put("random", randomString); postResult = db.postNewDoc(DB_NAME, map); assertNotNull(postResult.id); getResult = db.getData(DB_NAME, postResult.id); assertEquals("1two3", getResult.get("testing")); assertEquals(randomString, getResult.get("random")); } static class PersistCouchDBStub extends PersistCouchDB { /* PersistCouchDB is abstract as it just - reads the relevant Ninja configuration - and contains helper methods to arrange the basic access patterns. This works, but doesn't do anything very helpful with real data. */ } @BeforeClass public static void createDBObject() throws BrokenSystemException { FakeNinjaProperties props; props = new FakeNinjaProperties(); props.put("couchdb.readserver", "localhost:5984"); props.put("couchdb.writeserver", "localhost:5984"); props.put("couchdb.connection.username", "tripvis"); db = new PersistCouchDBStub(); db.mockLoadProps(props); db.mockCreateJsonMapper(); } }
No comments:
Post a Comment