From 802fe6390e2b1fb111b4ab827225f8e56f0755d3 Mon Sep 17 00:00:00 2001 From: Stan Bondi Date: Wed, 21 Nov 2018 10:58:09 +0200 Subject: [PATCH] semantic version releases (issue #463) (#575) * Added .editorconfig Idea runs editorconfig by default, all other editors support this via extensions * Add `X-App-Version` header to all responses * Added cargo version bumping to travis * Rather have one commit for version bumping * init-reset script should fail loudly * Cargo fmt fixes * #rustnoob caching the header name and header value Not necessary but wanted to try it out, also this is run on every request so may as well be efficient * Only tag for master builds --- .editorconfig | 12 ++++++++ .travis.yml | 3 +- api/src/middleware/app_version_header.rs | 37 +++++++++++++++++++++++ api/src/middleware/mod.rs | 2 ++ api/src/server.rs | 3 +- db/scripts/init-reset.sh | 1 + scripts/bump-version.sh | 38 ++++++++++++++++++++++++ 7 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 .editorconfig create mode 100644 api/src/middleware/app_version_header.rs create mode 100755 scripts/bump-version.sh diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..12b6a4436 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 4 diff --git a/.travis.yml b/.travis.yml index 772676bbc..011fe1eda 100644 --- a/.travis.yml +++ b/.travis.yml @@ -67,6 +67,7 @@ before_install: before_script: -after_script: +after_script: + - ./scripts/bump-version.sh --with-git diff --git a/api/src/middleware/app_version_header.rs b/api/src/middleware/app_version_header.rs new file mode 100644 index 000000000..316646114 --- /dev/null +++ b/api/src/middleware/app_version_header.rs @@ -0,0 +1,37 @@ +use actix_web::http::header::{HeaderName, HeaderValue}; +use actix_web::http::HttpTryFrom; +use actix_web::middleware::{Middleware, Response}; +use actix_web::{HttpRequest, HttpResponse, Result}; + +use server::AppState; + +const SEMVER_HEADER_NAME: &'static str = "X-App-Version"; +const APP_VERSION: &'static str = env!("CARGO_PKG_VERSION"); + +pub struct AppVersionHeader { + header_name: HeaderName, + app_version: HeaderValue, +} + +impl AppVersionHeader { + pub fn new() -> AppVersionHeader { + AppVersionHeader { + header_name: HeaderName::try_from(SEMVER_HEADER_NAME).unwrap(), + app_version: HeaderValue::from_static(APP_VERSION), + } + } +} + +impl Middleware for AppVersionHeader { + fn response( + &self, + _request: &HttpRequest, + mut response: HttpResponse, + ) -> Result { + response + .headers_mut() + .insert(&self.header_name, self.app_version.clone()); + + Ok(Response::Done(response)) + } +} diff --git a/api/src/middleware/mod.rs b/api/src/middleware/mod.rs index 57b0aea1e..fca3dc4a4 100644 --- a/api/src/middleware/mod.rs +++ b/api/src/middleware/mod.rs @@ -1,3 +1,5 @@ +pub use self::app_version_header::*; pub use self::database_transaction::*; +mod app_version_header; mod database_transaction; diff --git a/api/src/server.rs b/api/src/server.rs index 4e16975e3..98c405111 100644 --- a/api/src/server.rs +++ b/api/src/server.rs @@ -4,7 +4,7 @@ use actix_web::middleware::Logger; use actix_web::{server, App}; use config::Config; use db::*; -use middleware::*; +use middleware::{AppVersionHeader, DatabaseTransaction}; use routing; use utils::ServiceLocator; @@ -35,6 +35,7 @@ impl Server { move || { App::with_state(AppState::new(config.clone())) .middleware(DatabaseTransaction::new()) + .middleware(AppVersionHeader::new()) .middleware(Logger::new( r#"{\"remote_ip\":\"%a\", \"user_agent\": \"%{User-Agent}i\", \"request\": \"%r\", \"status_code\": %s, \"response_time\": %D}"#, )).configure(|a| { diff --git a/db/scripts/init-reset.sh b/db/scripts/init-reset.sh index 5668a05ee..b4b445c65 100755 --- a/db/scripts/init-reset.sh +++ b/db/scripts/init-reset.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash +set -e set -o allexport source .env set +o allexport diff --git a/scripts/bump-version.sh b/scripts/bump-version.sh new file mode 100755 index 000000000..373dcec18 --- /dev/null +++ b/scripts/bump-version.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +set -e + +if [[ "$TRAVIS_BRANCH" != "master" ]];then + echo "Skipping tag-version because branch is not master (but is '$TRAVIS_BRANCH')" + exit 0 +fi + +new_version="" + +function bump_patch { + local file="$1" + local version=`sed -En 's/version[[:space:]]*=[[:space:]]*"([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)"/\1/p' < $file` + new_version=`echo $version | awk -F. -v OFS=. 'NF==1{print ++$NF}; NF>1{$NF=sprintf("%0*d", length($NF), ($NF+1)); print}'` + local search='^(version[[:space:]]*=[[:space:]]*).+' + local replace="\1\"${new_version}\"" + + sed -i ".tmp" -E "s/${search}/${replace}/g" "$1" + echo "$file bumped from $version to $new_version" + rm "$1.tmp" +} + +FILES=( "db/Cargo.toml" "api/Cargo.toml" ) + +for target in "${FILES[@]}"; do + bump_patch "$target" + if [[ $1 == "--with-git" ]]; then + git add "$target" + fi +done + +if [[ $1 == "--with-git" ]]; then + git commit -m "Version bump to ${new_version}" + git tag ${new_version} + git push origin + git push --tags +fi