From 0ea0d3e0592e6e2de5e3ef824d9898eed4265a60 Mon Sep 17 00:00:00 2001 From: Dillon Cooper Date: Sun, 21 Apr 2019 15:59:11 -0400 Subject: [PATCH 1/9] Updated pipeline --- .gitlab-ci.yml | 46 ++++++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index be3cd9f..c0fba1c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -9,18 +9,32 @@ stages: ################ Anchors ################ ########################### -# Docker Tagging Anchors +# Docker Util Anchors ########################### -# Anchor to create develop image name and tag. -.shared_set_develop_tag: &set_develop_tag | - DEVELOP_IMAGE="$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA" +# Anchor to login to registry.gitlab.com. +.shared_docker_login: &docker_login | + echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY + +# Generate .env file. +.shared_generate_env: &generate_env | + . ./shell_scripts/create_env_variables.sh + create_env_file $DB_PASSWORD + + +########################### +# Docker Tagging Anchors +########################### # Anchor to create non-master branch image name tags. -.shared_set_branch_tag: &set_branch_tag | +.shared_set_non_dev_and_master_image_tag: &set_non_dev_and_master_image_tag | BRANCH_TAG="$(echo $CI_COMMIT_REF_NAME | cut -f2 -d/)-$CI_COMMIT_SHORT_SHA" BRANCH_IMAGE="$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$BRANCH_TAG" +# Anchor to create develop image name and tag. +.shared_set_develop_image_and_tag: &set_develop_image_and_tag | + DEVELOP_IMAGE="$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA" + # Anchor to create master image name and tag. .shared_set_master_image_and_tag: &set_master_image_and_tag | MASTER_IMAGE="$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" @@ -29,7 +43,7 @@ stages: # creating foreign keys, creating stored procedures, enabling change tracking and snapshot retention. .shared_build_image_and_run_setup_script: &build_image_and_run_setup_script | docker build -t mssql . - docker run -d -e ACCEPT_EULA=Y -e SA_PASSWORD=$DB_PASS -p 1433:1433 -p 8080:8080 --name mssql --entrypoint "/opt/mssql/bin/sqlservr" mssql; + docker run -d -e ACCEPT_EULA=Y -e SA_PASSWORD=$DB_PASSWORD -p 1433:1433 -p 8080:8080 --name mssql --entrypoint "/opt/mssql/bin/sqlservr" mssql; docker exec mssql "./shell_scripts/setup.sh" # Anchor to push an image to the registry with branch tag (used for all branches except Master and Develop). @@ -53,20 +67,6 @@ stages: docker push $CI_REGISTRY_IMAGE -########################### -# Docker Util Anchors -########################### - -# Anchor to login to registry.gitlab.com. -.shared_docker_login: &docker_login | - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY - -# Generate .env file. -.shared_generate_env: &generate_env | - . ./shell_scripts/create_env_variables.sh - create_env_file $DB_PASS - - ########################### # Templates ########################### @@ -84,9 +84,8 @@ publish_non_dev_and_master_branches: <<: *publish_docker_login_template script: - *generate_env - - *set_master_image_and_tag + - *set_non_dev_and_master_image_tag - *build_image_and_run_setup_script - - *push_to_registry_latest_tag - *push_to_registry_non_dev_and_master_branch_tag except: refs: @@ -100,9 +99,8 @@ publish_develop_branch: <<: *publish_docker_login_template script: - *generate_env - - *set_master_image_and_tag + - *set_develop_image_and_tag - *build_image_and_run_setup_script - - *push_to_registry_latest_tag - *push_to_registry_develop_tag only: refs: -- GitLab From ccc4234f2ab63846aadcdfa46342e6539a26a48e Mon Sep 17 00:00:00 2001 From: Dillon Cooper Date: Sun, 21 Apr 2019 16:04:00 -0400 Subject: [PATCH 2/9] Updated develop image tag anchor --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index c0fba1c..c387f8a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -53,8 +53,8 @@ stages: # Anchor to push an image to the registry with develop tag. .shared_push_to_registry_develop_tag: &push_to_registry_develop_tag | - docker commit -c 'CMD ["sqlservr"]' mssql $BRANCH_IMAGE - docker push $BRANCH_IMAGE + docker commit -c 'CMD ["sqlservr"]' mssql $DEVELOP_IMAGE + docker push $DEVELOP_IMAGE # Anchor to push an image to the registry with master tag .shared_push_to_registry_master_tag: &push_to_registry_master_tag | -- GitLab From f5f1f1b2bc22ae381d252b5b79575b22d5c26924 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 10:26:32 -0500 Subject: [PATCH 3/9] Testing Dev pipeline --- shell_scripts/create_env_variables.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell_scripts/create_env_variables.sh b/shell_scripts/create_env_variables.sh index c0b57e4..e4eb601 100644 --- a/shell_scripts/create_env_variables.sh +++ b/shell_scripts/create_env_variables.sh @@ -11,4 +11,4 @@ create_env_file() { DB_PASSWORD=$1 TEXT fi -} \ No newline at end of file +} -- GitLab From eaf4d494e9bdc543e728c412d8ab8886a5992ef7 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 10:37:14 -0500 Subject: [PATCH 4/9] Updated Dockerfile --- Dockerfile | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 812fe69..c175118 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ # Run Latest Linux image SQL Server from Microsoft. FROM mcr.microsoft.com/mssql/server +USER root # Change current working directory. WORKDIR /usr/src/app @@ -9,11 +10,9 @@ RUN apt-get -y update && \ apt-get install -y curl && \ curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ apt-get install -y nodejs && \ + apt-get -y install vim && \ npm install tedious -# Update packages, install curl, node/npm, tedious. -RUN apt-get -y update - # Bundle app source. COPY . . -- GitLab From a94a8767c701d22f521e6701969b615238305920 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 11:29:12 -0500 Subject: [PATCH 5/9] Updated .dockerignore --- .dockerignore | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.dockerignore b/.dockerignore index c4aa3d6..ebae7cd 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,8 @@ logs/ -README.md \ No newline at end of file +README.md +.travis.yml +.gitlab-ci.yml +.gitignore +docker-compose.prod.yml +docker-compose.yml +Dockerfile \ No newline at end of file -- GitLab From 62d852e6dd65c563c421494abaeef333bf25f426 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 11:30:29 -0500 Subject: [PATCH 6/9] Created 'cleanup.sh'. Implemented cleanup job to removed obsolete files after building final image. --- Dockerfile | 15 ++++++++------- cleanup.sh | 5 +++++ shell_scripts/setup.sh | 14 ++++++++++---- 3 files changed, 23 insertions(+), 11 deletions(-) create mode 100755 cleanup.sh diff --git a/Dockerfile b/Dockerfile index c175118..35ab19d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,18 +6,19 @@ USER root WORKDIR /usr/src/app # Update packages, install curl, node/npm, & tedious -RUN apt-get -y update && \ - apt-get install -y curl && \ - curl -sL https://deb.nodesource.com/setup_6.x | bash - && \ - apt-get install -y nodejs && \ - apt-get -y install vim && \ - npm install tedious +RUN apt-get -y update > /dev/null 2>&1 && \ + apt-get install -y curl > /dev/null 2>&1 && \ + curl -sL https://deb.nodesource.com/setup_6.x | bash - > /dev/null 2>&1 && \ + apt-get install -y nodejs > /dev/null 2>&1 && \ + apt-get -y install vim > /dev/null 2>&1 && \ + npm install tedious > /dev/null 2>&1 # Bundle app source. COPY . . # Grant permissions for the import-data script to be executable. -RUN chmod +x /usr/src/app/shell_scripts/setup.sh +RUN chmod +x /usr/src/app/shell_scripts/setup.sh && \ + chmod +x /usr/src/app/cleanup.sh #Set path for SQLCMD. ENV PATH "$PATH:/opt/mssql-tools/bin/" diff --git a/cleanup.sh b/cleanup.sh new file mode 100755 index 0000000..083a4f0 --- /dev/null +++ b/cleanup.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +# Remove all obsolete files. +rm -rf /usr/src/app/database_scripts /usr/src/app/shell_scripts /usr/src/app/cleanup.sh +echo "Cleanup Complete!" diff --git a/shell_scripts/setup.sh b/shell_scripts/setup.sh index 91e85a2..eb202e1 100644 --- a/shell_scripts/setup.sh +++ b/shell_scripts/setup.sh @@ -15,19 +15,19 @@ $querydb -i /usr/src/app/database_scripts/createDatabase.sql && \ # Populates the MS SQL Database with mock data. -sleep 10s +sleep 3s echo "Inserting Mock Data..." && \ $querydb -i /usr/src/app/database_scripts/insertMockData.sql && \ # Creates foreign key associations within mock MS SQL Database. -sleep 10s +sleep 3s echo "Creating Foreign Key References..." && \ $querydb -i /usr/src/app/database_scripts/createForeignKeyReferences.sql && \ # Enables Change Tracking within mock MS SQL Database. -sleep 10s +sleep 3s echo "Enabling Change Tracking..." && \ $querydb -i /usr/src/app/database_scripts/enableChangeTracking.sql && \ @@ -36,6 +36,12 @@ $querydb -i /usr/src/app/database_scripts/enableChangeTracking.sql && \ echo "Enabling Snapshot Retention..." && \ $querydb -i /usr/src/app/database_scripts/enableSnapshotRetention.sql && \ + # Creates stored procedures by iterating through every stored procedure script in database_scripts/stored_procedures. echo "Creating Stored Procedures..." && \ -for storedProcedure in /usr/src/app/database_scripts/stored_procedures/*.sql;do $querydb -i "$storedProcedure";done; +for storedProcedure in /usr/src/app/database_scripts/stored_procedures/*.sql;do $querydb -i "$storedProcedure";done && \ + + +# Cleanup job used to removed unneeded files after image has been successfully created and populated. +echo "Cleaning up environment..." && \ +. /usr/src/app/cleanup.sh -- GitLab From 07961d165c1f907e5017a3f1dacf5958887cc39f Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 11:50:48 -0500 Subject: [PATCH 7/9] Implemented Release Candidate in GitLab Pipeline --- .gitlab-ci.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index de255cf..eac2fe8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -35,6 +35,12 @@ stages: .shared_set_develop_image_and_tag: &set_develop_image_and_tag | DEVELOP_IMAGE="$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_NAME:$CI_COMMIT_SHORT_SHA" +# Anchor to create release candidate name and tag. +.shared_set_release_candidate_image_and_tag: &set_release_candidate_image_and_tag | + RELEASE_CANDIDATE_NUMBER=$(git rev-list --count origin/develop...origin/$CI_COMMIT_REF_NAME) && RELEASE_CANDIDATE_NUMBER=$((RELEASE_CANDIDATE_NUMBER+1)) + RELEASE_CANDIDATE_TAG_POPULATED="$(echo $CI_COMMIT_REF_NAME | cut -f2 -d/)-rc$RELEASE_CANDIDATE_NUMBER" + RELEASE_CANDIDATE_IMAGE="$CI_REGISTRY_IMAGE/release:$RELEASE_CANDIDATE_TAG_POPULATED" + # Anchor to create master image name and tag. .shared_set_master_image_and_tag: &set_master_image_and_tag | MASTER_IMAGE="$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA" @@ -56,6 +62,11 @@ stages: docker commit -c 'CMD ["sqlservr"]' mssql $DEVELOP_IMAGE docker push $DEVELOP_IMAGE +# Anchor to push an image to the registry with release candidate tag. +.shared_push_to_registry_release_candidate_tag: &push_to_registry_release_candidate_tag | + docker commit -c 'CMD ["sqlservr"]' mssql $RELEASE_CANDIDATE_IMAGE + docker push $RELEASE_CANDIDATE_IMAGE + # Anchor to push an image to the registry with master tag .shared_push_to_registry_master_tag: &push_to_registry_master_tag | docker commit -c 'CMD ["sqlservr"]' mssql $MASTER_IMAGE @@ -110,6 +121,18 @@ publish_develop_branch: expire_in: 2 weeks +publish_populated_image_release_candidate_branch: + <<: *publish_docker_login_template + script: + - *generate_env + - *set_release_candidate_image_and_tag + - *build_image_and_run_setup_script + - *push_to_registry_release_candidate_tag + only: + - /^(\d+\.)?(\d+\.)?(\d+-rc\.\d+)$/ + - /^release\/.*$/ + + publish_master_branch: <<: *publish_docker_login_template script: -- GitLab From c3c4a678edc702ec0dc36d9b1a8ea0ac34ea0287 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 14:06:24 -0500 Subject: [PATCH 8/9] Added 'waitForSqlServer.sql' script --- database_scripts/waitForSqlServer.sql | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 database_scripts/waitForSqlServer.sql diff --git a/database_scripts/waitForSqlServer.sql b/database_scripts/waitForSqlServer.sql new file mode 100644 index 0000000..d08dd13 --- /dev/null +++ b/database_scripts/waitForSqlServer.sql @@ -0,0 +1,5 @@ +USE master; +GO + +DECLARE @ServerRunning BIT=(SELECT CASE WHEN COUNT(*) = 1 THEN CAST(1 AS BIT) ELSE CAST(0 AS BIT) END AS IsRunning FROM sys.servers) +SELECT @ServerRunning -- GitLab From 60792d4b6a44f08d209d22553c7b1cd412eee210 Mon Sep 17 00:00:00 2001 From: dillonc Date: Wed, 6 Nov 2019 14:07:36 -0500 Subject: [PATCH 9/9] Implemented logic to wait for SQL Server to start in 'setup.sh'. Removed Sleeps in 'setup.sh' --- shell_scripts/setup.sh | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/shell_scripts/setup.sh b/shell_scripts/setup.sh index eb202e1..b3df123 100644 --- a/shell_scripts/setup.sh +++ b/shell_scripts/setup.sh @@ -1,6 +1,4 @@ #!/usr/bin/env bash -# Wait for the SQL Server to launch. -sleep 10s # Source the configs. source /usr/src/app/.env @@ -9,25 +7,43 @@ source /usr/src/app/.env export querydb="sqlcmd -S localhost -U sa -P ${DB_PASSWORD}" && \ +sql_counter=1 +while [ $sql_counter -le 60 ] +do + TEMP_VAR=$(sqlcmd -S localhost -U sa -P "$DB_PASSWORD" -i /usr/src/app/database_scripts/waitForSqlServer.sql | grep '1\|0' | cut -d'(' -f1) + echo "Attempting to connect to SQL. Attempt number $sql_counter" + if [ $TEMP_VAR = "1" ] + then + echo "Successfully connected to SQL..." + break; + fi + if (( $sql_counter == 60 )) + then + echo "Failed to connected to SQL after $sql_counter attempts! Please verify your config file values are set correctly." + exit 1; + fi + echo "SQL unavailable..." + ((sql_counter++)) + sleep 1 +done && \ + + # Run the setup script to create the MS SQL Database. echo "Creating MS SQL Schema..." && \ $querydb -i /usr/src/app/database_scripts/createDatabase.sql && \ # Populates the MS SQL Database with mock data. -sleep 3s echo "Inserting Mock Data..." && \ $querydb -i /usr/src/app/database_scripts/insertMockData.sql && \ # Creates foreign key associations within mock MS SQL Database. -sleep 3s echo "Creating Foreign Key References..." && \ $querydb -i /usr/src/app/database_scripts/createForeignKeyReferences.sql && \ # Enables Change Tracking within mock MS SQL Database. -sleep 3s echo "Enabling Change Tracking..." && \ $querydb -i /usr/src/app/database_scripts/enableChangeTracking.sql && \ @@ -39,8 +55,7 @@ $querydb -i /usr/src/app/database_scripts/enableSnapshotRetention.sql && \ # Creates stored procedures by iterating through every stored procedure script in database_scripts/stored_procedures. echo "Creating Stored Procedures..." && \ -for storedProcedure in /usr/src/app/database_scripts/stored_procedures/*.sql;do $querydb -i "$storedProcedure";done && \ - +for storedProcedure in /usr/src/app/database_scripts/stored_procedures/*.sql;do $querydb -i "$storedProcedure";done # Cleanup job used to removed unneeded files after image has been successfully created and populated. echo "Cleaning up environment..." && \ -- GitLab