diff --git a/Makefile.toml b/Makefile.toml index de6a2f0..bddcb4d 100644 --- a/Makefile.toml +++ b/Makefile.toml @@ -17,11 +17,26 @@ script = "./scripts/build_musl_libs.sh" command = "${CARGO}" args = ["clean"] -[tasks.build] +[tasks.cargo_build] dependencies = ["build_static_libs"] command = "${CARGO}" args = ["build", "--target", "${TARGET}", "${@}"] +[tasks.release_tasks] +script = ''' +if [[ "${@}" =~ "release" ]]; then + echo "Stripping binaries..." + strip $(ls ./target/${TARGET}/release/u_* -1 | grep -v ".d") + echo "Creating symlink to release dir..." + ln -s ./target/${TARGET}/release ./release || true +fi +''' + +[tasks.build] +dependencies = ["cargo_build", "release_tasks"] +command = "true" +args = [] + [tasks.run] script = ''' echo "Only integration tests are supported." @@ -40,12 +55,14 @@ bash integration_tests.sh [tasks.gen_schema] script = ''' -cd ./integration -docker-compose up -d u_db_gen_schema -echo "Waiting 10 sec..." -sleep 10 -docker-compose down +docker run --rm \ + --env-file=$PWD/.env \ + --env-file=$PWD/.env.private \ + -v $PWD:/unki \ + -w /unki \ + unki/u_db \ + /unki/images/integration-tests/u_db_entrypoint.sh || true ''' [tasks.test] -dependencies = ["unit", "integration"] \ No newline at end of file +dependencies = ["unit", "integration"] diff --git a/bin/u_agent/build.rs b/bin/u_agent/build.rs index a9a9abd..0588b1c 100644 --- a/bin/u_agent/build.rs +++ b/bin/u_agent/build.rs @@ -3,6 +3,6 @@ use std::path::PathBuf; fn main() { let server_cert = PathBuf::from("../../certs/ca.crt"); if !server_cert.exists() { - panic!("CA certificate doesn't exist. Create it first with certs/gen_certs.sh"); + panic!("CA certificate doesn't exist. Create it first with scripts/gen_certs.sh"); } } diff --git a/bin/u_server/src/u_server.rs b/bin/u_server/src/u_server.rs index 2317631..adfeb1c 100644 --- a/bin/u_server/src/u_server.rs +++ b/bin/u_server/src/u_server.rs @@ -43,7 +43,7 @@ fn init_logger() { let logfile = OpenOptions::new() .append(true) .create(true) - .open(LOGFILE) + .open(PathBuf::from("logs").join(LOGFILE)) .unwrap(); let level = LevelFilter::Info; let loggers = vec![ diff --git a/images/integration-tests/u_db_entrypoint.sh b/images/integration-tests/u_db_entrypoint.sh index eb96742..f6f560c 100755 --- a/images/integration-tests/u_db_entrypoint.sh +++ b/images/integration-tests/u_db_entrypoint.sh @@ -3,4 +3,5 @@ set -m export DATABASE_URL=postgres://${DB_USER}:${DB_PASSWORD}@127.0.0.1/${DB_NAME} touch /unki/Cargo.toml /usr/local/bin/docker-entrypoint.sh postgres & -sleep 10 && diesel setup && diesel migration run && fg %1 \ No newline at end of file +sleep 10 && diesel setup && diesel migration run +[[ $1 == "svc" ]] && fg %1 \ No newline at end of file diff --git a/integration/docker-compose.yml b/integration/docker-compose.yml index 84255c3..003460d 100644 --- a/integration/docker-compose.yml +++ b/integration/docker-compose.yml @@ -10,15 +10,16 @@ services: networks: - u_net volumes: - - ../target/x86_64-unknown-linux-musl/release/u_server:/u_server + - ../release/u_server:/unki/u_server - ../certs:/unki/certs + - ../logs:/unki/logs working_dir: /unki - command: /u_server + command: /unki/u_server depends_on: u_db: condition: service_healthy - expose: - - '63714' + ports: + - 63714:63714 env_file: - ../.env - ../.env.private @@ -42,7 +43,7 @@ services: working_dir: /unki volumes: - ../migrations:/unki/migrations - command: /unki/u_db_entrypoint.sh + command: /unki/u_db_entrypoint.sh svc healthcheck: # test if db's port is open and db is created test: ss -tlpn | grep 5432 && psql -lqt -U $${DB_USER} | grep -qw $${DB_NAME} @@ -50,37 +51,12 @@ services: timeout: 5s retries: 3 - u_db_gen_schema: - image: unki/u_db - env_file: - - ../.env - - ../.env.private - working_dir: /unki - volumes: - - ../:/unki/ - command: /unki/images/integration-tests/u_db_entrypoint.sh - - u_agent_1: - image: unki/u_agent - networks: - - u_net - volumes: - - ../target/x86_64-unknown-linux-musl/release/u_agent:/u_agent - command: /u_agent u_server - env_file: - - ../.env - environment: - RUST_LOG: u_agent=debug - depends_on: - u_server: - condition: service_healthy - - u_agent_2: + u_agent: image: unki/u_agent networks: - u_net volumes: - - ../target/x86_64-unknown-linux-musl/release/u_agent:/u_agent + - ../release/u_agent:/u_agent command: /u_agent u_server env_file: - ../.env @@ -98,15 +74,13 @@ services: - ~/.cargo/registry:/root/.cargo/registry - ./:/tests/ - ../certs:/certs - - ../target/x86_64-unknown-linux-musl/release/u_panel:/u_panel + - ../release/u_panel:/u_panel - ../lib/u_lib:/lib/u_lib - ../lib/u_api_proc_macro:/lib/u_api_proc_macro working_dir: /tests/ depends_on: - u_agent_1: - condition: service_started - u_agent_2: + u_agent: condition: service_started u_server: condition: service_healthy diff --git a/integration/docker_compose.py b/integration/docker_compose.py index 47e3916..69ef302 100644 --- a/integration/docker_compose.py +++ b/integration/docker_compose.py @@ -6,58 +6,63 @@ from docker import docker, check_state, print_errors class Compose: ALL_CONTAINERS = [ - 'u_agent_1', - 'u_agent_2', + 'u_agent', 'u_server', 'u_db', 'tests_runner', ] def __init__(self): - self.container_tpl = 'integration_%s_1' - self.cmd_container = self.container_tpl % 'tests_runner' - self.ALL_CONTAINERS = [self.container_tpl % c for c in self.ALL_CONTAINERS] + self.container_tpl = 'integration_%s_%d' + self.cmd_container = self.container_tpl % ('tests_runner', 1) + self.ALL_CONTAINERS = [self.container_tpl % (c, 1) for c in self.ALL_CONTAINERS] + self.scaled_svc = {} + self.scale("u_agent", 2) + + def scale(self, svc, count): + for c in range(1, count): + new_container = self.container_tpl % (svc, c + 1) + self.ALL_CONTAINERS.append(new_container) + self.scaled_svc[svc] = count def _call(self, *args): - subprocess.check_call([ + cmd = [ 'docker-compose', '--no-ansi', ] + list(args) - ) + log(f'Running docker-compose command: {cmd}') + subprocess.check_call(cmd) def up(self): log('Instanciating cluster') - self._call('up', '-d') - log('Ok') + scaled = [f"{k}={v}" for k, v in self.scaled_svc.items()] + if len(scaled) > 0: + scaled.insert(0, '--scale') + self._call('up', '-d', *scaled) def down(self): log('Shutting down cluster') self._call('down') - log('Ok') def stop(self): log('Stopping cluster') self._call('stop') - log('Ok') def run(self, cmd): container = self.cmd_container if isinstance(cmd, str): cmd = shlex.split(cmd) - log(f'Running command "{cmd}" in container {container}') result = docker([ 'exec', '-ti', container ] + cmd) - log('Ok') return result def is_alive(self): log('Check if all containers are alive') errors = check_state(self.ALL_CONTAINERS) - log('Check done') if errors: print_errors(errors) diff --git a/.env.private.sample b/sample.env.private similarity index 100% rename from .env.private.sample rename to sample.env.private diff --git a/scripts/deploy.sh b/scripts/deploy.sh new file mode 100755 index 0000000..aa04c86 --- /dev/null +++ b/scripts/deploy.sh @@ -0,0 +1,19 @@ +#!/bin/bash +set -xe +source $(dirname $0)/rootdir.sh #set ROOTDIR + +SERVER="ortem" +REMOTE_DIR=/srv/usrv +REMOTE_PATH=$SERVER:$REMOTE_DIR +RSYNC="rsync -arzh --progress" + +ssh $SERVER mkdir -p $REMOTE_DIR/{release,deploy} +$RSYNC $ROOTDIR/release/u_server $REMOTE_PATH/release/u_server +$RSYNC --exclude="*.sh" $ROOTDIR/certs/ $REMOTE_PATH/certs +$RSYNC $ROOTDIR/migrations/ $REMOTE_PATH/migrations +$RSYNC $ROOTDIR/.env* $REMOTE_PATH/ +$RSYNC $ROOTDIR/integration/docker-compose.yml $REMOTE_PATH/deploy/ +$RSYNC $ROOTDIR/images/integration-tests/u_db* $REMOTE_PATH/deploy/ +$RSYNC $ROOTDIR/images/integration-tests/u_server.Dockerfile $REMOTE_PATH/deploy/ +$RSYNC $ROOTDIR/scripts/start_server.sh $REMOTE_PATH/start_server.sh +ssh $SERVER "cd $REMOTE_DIR/deploy && ./start_server.sh" \ No newline at end of file diff --git a/certs/gen_certs.sh b/scripts/gen_certs.sh similarity index 80% rename from certs/gen_certs.sh rename to scripts/gen_certs.sh index f1e9d6f..3be58ea 100755 --- a/certs/gen_certs.sh +++ b/scripts/gen_certs.sh @@ -1,16 +1,23 @@ set -ex -DIR=. +source $(dirname $0)/rootdir.sh #set ROOTDIR +DIR=$ROOTDIR/certs V3_CFG=$DIR/v3.ext +mkdir -p $DIR cat > $V3_CFG << EOF authorityKeyIdentifier=keyid,issuer basicConstraints=CA:FALSE keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign +subjectAltName = @alt_names + +[alt_names] +DNS.1 = ortem.xyz +DNS.2 = u_server EOF openssl req -x509 -newkey rsa:4096 -keyout $DIR/ca.key -out $DIR/ca.crt -nodes -days 365 -subj "/CN=root" openssl req -newkey rsa:4096 -keyout $DIR/alice.key -out $DIR/alice.csr -nodes -days 365 -subj "/CN=alice" -openssl req -newkey rsa:4096 -keyout $DIR/server.key -out $DIR/server.csr -nodes -days 365 -subj "/CN=u_server" +openssl req -newkey rsa:4096 -keyout $DIR/server.key -out $DIR/server.csr -nodes -days 365 -subj "/CN=ortem.xyz" openssl x509 -req -in $DIR/alice.csr -CA $DIR/ca.crt -CAkey $DIR/ca.key -out $DIR/alice.crt -set_serial 01 -days 365 -extfile $V3_CFG openssl x509 -req -in $DIR/server.csr -CA $DIR/ca.crt -CAkey $DIR/ca.key -out $DIR/server.crt -set_serial 01 -days 365 -extfile $V3_CFG openssl pkcs12 -export -out $DIR/alice.p12 -inkey $DIR/alice.key -in $DIR/alice.crt -passin pass: -passout pass: diff --git a/scripts/start_server.sh b/scripts/start_server.sh new file mode 100755 index 0000000..07a6d6a --- /dev/null +++ b/scripts/start_server.sh @@ -0,0 +1,5 @@ +#!/bin/bash +docker build -t unki/u_db -f u_db.Dockerfile . +docker build -t unki/u_server -f u_server.Dockerfile . +docker-compose down +docker-compose up -d u_server \ No newline at end of file