Compare commits

...

31 Commits

Author SHA1 Message Date
Ana Gelez
9ddba17d46 I guess it was localhost this time 2020-08-10 18:59:52 +02:00
Ana Gelez
b04426a330 I want some logs please 2020-08-10 18:28:11 +02:00
Ana Gelez
925254983e Update Caddyfile for integration tests 2020-08-10 18:03:51 +02:00
Ana Gelez
4c6fb83793 Change another network name 2020-08-10 17:06:14 +02:00
Ana Gelez
7c456009be Fix Selenium address, remove volumes 2020-08-10 16:47:13 +02:00
Ana Gelez
db916039db Fix syntax 2020-08-10 16:00:45 +02:00
Ana Gelez
06c625c686 Add a shared volume for WebDriver's socket 2020-08-10 15:59:06 +02:00
Ana Gelez
f2203710cb Start selenium 2020-08-10 15:37:52 +02:00
Ana Gelez
3c1617c4f9 Add a dummy password 2020-08-10 14:40:36 +02:00
Ana Gelez
2388a5846d Fix PostgreSQL user 2020-08-10 14:17:59 +02:00
Ana Gelez
b102534136 Set DATABASE_URL in integration tests 2020-08-10 13:03:33 +02:00
Ana Gelez
072e32da30 Try something to make integration-sqlite run 2020-08-10 12:57:17 +02:00
Ana Gelez
5ea3e73727 Update PostgreSQL image 2020-08-10 12:33:53 +02:00
Ana Gelez
f340bd50c7 Passwordless PostgreSQL connections 2020-08-10 11:38:38 +02:00
Ana Gelez
3de6b46465 Start PostgreSQL and set BROWSER for integration tests 2020-08-10 11:15:02 +02:00
Ana Gelez
3c6d5de314 Unique artifact path 2020-07-26 20:37:09 +02:00
Ana Gelez
2a4b98dce4 test feature is only for plume, not plm 2020-07-26 19:47:47 +02:00
Ana Gelez
d253fee523 Run tests one by one 2020-07-26 19:42:43 +02:00
Ana Gelez
07731d0b73 Forgot a space once again 2020-07-26 19:39:00 +02:00
Ana Gelez
15cbd17003 Try to save artifacts to Minio 2020-07-26 19:29:59 +02:00
Ana Gelez
5d3b3485fa Enable debugging of cache 2020-07-26 17:55:26 +02:00
Ana Gelez
8a2788bf6a Try another region 2020-07-26 17:49:15 +02:00
Ana Gelez
ecbd64efb1 OK, it actually needs a region 2020-07-26 17:17:56 +02:00
Ana Gelez
9245320712 Forgot a space 2020-07-26 17:13:03 +02:00
Ana Gelez
7cf3a4b37c Let's try without a region 2020-07-26 17:11:00 +02:00
Ana Gelez
3ddd6d0254 Try to use Minio for caching 2020-07-26 17:07:41 +02:00
Ana Gelez
7edd0220b6 Dummy commit to retrigger the build 2020-07-26 16:28:03 +02:00
Ana Gelez
b26e785277 Continue the Drone CI config 2020-07-15 12:40:11 +02:00
Ana Gelez
b2829908f1 Fix a few errors in the config 2020-06-26 13:53:11 +02:00
Ana Gelez
60bb5b72f6 Just a dumb commit to retrigger a build, please squash it 2020-06-26 13:47:31 +02:00
Ana Gelez
9e0bbf81ed WIP: Drone CI config 2020-06-26 13:38:13 +02:00
4 changed files with 238 additions and 3 deletions

View File

@ -1,5 +1,5 @@
localhost:443 {
proxy / localhost:7878 {
proxy / integration:7878 {
transparent
}
tls self_signed

233
.drone.jsonnet Normal file
View File

@ -0,0 +1,233 @@
// This is the CI config for Plume.
// It uses a Drone CI instance, on https://ci.joinplu.me
// First of all, we define a few useful constants
// This Docker image contains everything we need to build Plume.
// Its Dockerfile can be found at https://git.joinplu.me/plume/buildenv
local plumeEnv = "plumeorg/plume-buildenv:v0.2.0";
// Common cache config
local cacheConfig(name, extra) = {
name: name,
image: "meltwater/drone-cache:dev",
pull: true,
environment: {
AWS_ACCESS_KEY_ID: { from_secret: 'minio_key' },
AWS_SECRET_ACCESS_KEY: { from_secret: 'minio_secret' },
},
settings: extra + {
cache_key: 'v0-{{ checksum "Cargo.lock" }}-{{ .Commit.Branch }}',
archive_format: "gzip",
mount: [ "~/.cargo/", "./target" ],
bucket: 'cache',
path_style: true,
endpoints: "127.0.0.1:9000",
region: 'us-east-1',
debug: true,
},
volumes: [ { name: "cache", path: "/tmp/cache" } ]
};
// A pipeline step that restores the cache.
// The cache contains all the cargo build files.
// Thus, we don't have to download and compile all of our dependencies for each
// commit.
// This cache is only "deleted" when the contents of Cargo.lock changes.
//
// We use this plugin for caching: https://github.com/meltwater/drone-cache/
//
// Potential TODO: use one cache per pipeline, as we used to do when we were
// using CircleCI.
local restoreCache = cacheConfig("restore-cache", { restore: true });
// And a step that saves the cache.
local saveCache = cacheConfig("save-cache", { rebuild: true });
// This step starts a PostgreSQL database if the db parameter is "postgres",
// otherwise it does nothing.
local startDb(db) = if db == "postgres" then {
name: "start-db",
image: "postgres:12.3-alpine",
detach: true,
environment: {
POSTGRES_USER: "plume",
POSTGRES_DB: "plume",
POSTGRES_PASSWORD: "password",
}
} else {};
// A utility function to generate a new pipeline
local basePipeline(name, steps) = {
kind: "pipeline",
name: name,
type: "docker",
environment: {
RUST_TEST_THREADS: '1',
},
steps: steps
};
// And this function creates a pipeline with caching
local cachedPipeline(name, commands) = basePipeline(
name,
[
restoreCache,
{
name: name,
image: plumeEnv,
commands: commands,
},
saveCache
]
);
// This function creates a step to upload artifacts to Minio
local upload(name, source) = {
name: name,
image: 'plugins/s3',
settings: {
bucket: 'artifacts',
source: source,
target: '/${DRONE_BUILD_NUMBER}',
path_style: true,
endpoint: 'http://127.0.0.1:9000',
access_key: { from_secret: 'minio_key' },
secret_key: { from_secret: 'minio_secret' },
},
};
// Here starts the actual list of pipelines!
// PIPELINE 1: a pipeline that runs cargo fmt, and that fails if the style of
// the code is not standard.
local CargoFmt() = cachedPipeline(
"cargo-fmt",
[ "cargo fmt --all -- --check" ]
);
// PIPELINE 2: runs clippy, a tool that helps
// you writing idiomatic Rust.
// Helper function:
local cmd(db, pkg, features=true) = if features then
"cargo clippy --no-default-features --features " + db + " --release -p "
+ pkg + " -- -D warnings"
else
"cargo clippy --no-default-features --release -p "
+ pkg + " -- -D warnings";
// The actual pipeline:
local Clippy(db) = cachedPipeline(
"clippy-" + db,
[
cmd(db, "plume"),
cmd(db, "plume-cli"),
cmd(db, "plume-front", false)
]
);
// PIPELINE 3: runs unit tests
local Unit(db) = cachedPipeline(
"unit-" + db,
[
"cargo test --all --exclude plume-front --exclude plume-macro"
+ " --no-run --no-default-features --features=" + db
]
);
// PIPELINE 4: runs integration tests
// It installs a local instance an run integration test with Python scripts
// that use Selenium (located in scripts/browser_test).
local Integration(db) = basePipeline(
"integration-" + db,
[
restoreCache,
startDb(db),
{
name: 'selenium',
image: 'elgalu/selenium:latest',
detach: true,
},
{
name: "integration",
image: plumeEnv,
environment: {
BROWSER: "firefox",
DATABASE_URL: if db == "postgres" then "postgres://plume:password@start-db/plume" else "plume.db",
},
commands: [
// Install the front-end
"cargo web deploy -p plume-front",
// Install the server
'cargo install --debug --no-default-features --features="'
+ db + '",test --force --path .',
// Install plm
'cargo install --debug --no-default-features --features="'
+ db + '" --force --path plume-cli',
// Run the tests
"./script/run_browser_test.sh"
],
},
saveCache,
]
);
// PIPELINE 5: make a release build and save artifacts
//
// It should also deploy the SQlite build to a test instance
// located at https://pr-XXX.joinplu.me (but this system is not very
// stable, and often breaks).
local Release(db) = basePipeline(
"release-" + db,
[
restoreCache,
{
name: 'release-' + db,
image: plumeEnv,
commands: [
"cargo web deploy -p plume-front --release",
"cargo build --release --no-default-features --features=" + db + " -p plume",
"cargo build --release --no-default-features --features=" + db + " -p plume-cli",
"./script/generate_artifact.sh",
] + if db == "sqlite" then
[ "./script/upload_test_environment.sh" ] else
[]
},
upload('artifacts-' + db, '*.tar.gz'),
saveCache,
]
);
// PIPELINE 6: upload the new PO templates (.pot) to Crowdin
//
// TODO: run only on master
local PushTranslations() = basePipeline(
"push-translations",
[
{
name: "push-translations",
image: plumeEnv,
commands: [
"cargo build",
"crowdin upload -b master"
]
}
]
);
// And finally, the list of all our pipelines:
[
CargoFmt(),
Clippy("postgres"),
Clippy("sqlite"),
Unit("postgres"),
Unit("sqlite"),
Integration("postgres"),
Integration("sqlite"),
Release("postgres"),
Release("sqlite"),
PushTranslations()
]

View File

@ -13,10 +13,12 @@ class Browser(unittest.TestCase):
raise Exception("No browser was requested")
capabilities['acceptSslCerts'] = True
self.driver = webdriver.Remote(
command_executor='http://localhost:24444/wd/hub',
# The "selenium" address is set up by Drone CI and "points" to the container running selenium
command_executor='http://selenium:24444/wd/hub',
desired_capabilities=capabilities)
def tearDown(self):
self.driver.close()
def get(self, url):
# Like "selenium", integration is mapped to the container that runs the plume instance
return self.driver.get("https://localhost" + url)

View File

@ -12,7 +12,7 @@ plm users new -n admin -N 'Admin' -e 'email@exemple.com' -p 'password'
plume &
caddy -conf /Caddyfile &
until curl http://localhost:7878/test/health -f; do sleep 1; done 2>/dev/null >/dev/null
until curl http://localhost:7878/test/health -f; do sleep 1; done #2>/dev/null >/dev/null
cd $(dirname $0)/browser_test/
python3 -m unittest *.py