Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
This is an example of a .gitlab-ci.yml that is required for Continuous Integration on GitLab projects.
# Reference: https://www.exclamationlabs.com/blog/continuous-deployment-to-npm-using-gitlab-ci/
# GitLab uses docker in the background, so we need to specify the
# image versions. This is useful because we're freely to use
# multiple node versions to work with it. They come from the docker
# repo.
# Uses NodeJS V 9.4.0
image: node:9.4.0
# And to cache them as well.
cache:
paths:
- node_modules/
- .yarn
# We tell GitLab to install all the packages
# before running anything.
# Docker images come with yarn preinstalled
before_script:
- apt-get update -qq && apt-get install
# You specify the stages. Those are the steps that GitLab will go through
# Order matters.
stages:
- build
- test
- staging
- openMr
- production
Build:
stage: build
tags:
- node
before_script:
- yarn config set cache-folder .yarn
- yarn install
script:
- npm run build
Test:
stage: test
tags:
- node
before_script:
- yarn config set cache-folder .yarn
- yarn install
script:
# Installs Chrome
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
- echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' | tee /etc/apt/sources.list.d/google-chrome.list
- apt-get update
- apt-get install google-chrome-stable -y
# Runs the tests.
- npm run test:karma-headless
Deploy to Staging:
stage: staging
tags:
- node
before_script:
# Generates to connect to the AWS unit the SSH key.
- mkdir -p ~/.ssh
- echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
# Sets the permission to 600 to prevent a problem with AWS
# that it's too unprotected.
- chmod 600 ~/.ssh/id_rsa
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- bash ./gitlab-deploy/.gitlab-deploy.staging.sh
environment:
name: staging
# Exposes a button that when clicked take you to the defined URL:
url: http://ec2-13-59-173-91.us-east-2.compute.amazonaws.com:3001
# Remember to have the PRIVATE_TOKEN generated. This is only needed to be done once per project and not per user.
# Once you add it (Needs Master priviliges) as a Secret Variable, it should work.
Open Merge Request:
# Got it from here: https://gitlab.com/tmaier/gitlab-auto-merge-request/blob/develop/.gitlab-ci.yml
image: tmaier/gitlab-auto-merge-request
stage: openMr
tags:
- node
script:
- bash ./gitlab-deploy/auto-merge-request.sh # The name of the script
Deploy to Production:
stage: production
tags:
- node
before_script:
# Generates to connect to the AWS unit the SSH key.
- mkdir -p ~/.ssh
- echo -e "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
# Sets the permission to 600 to prevent a problem with AWS
# that it's too unprotected.
- chmod 600 ~/.ssh/id_rsa
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- bash ./gitlab-deploy/.gitlab-deploy.prod.sh
environment:
name: production
# Exposes a button that when clicked take you to the defined URL:
url: http://ec2-13-59-173-91.us-east-2.compute.amazonaws.com:81
when: manual
# !/bin/bash
# Get servers list:
set - f
# Variables from GitLab server:
# Note: They can't have spaces!!
string=$DEPLOY_SERVER
array=(${string//,/ })
# Iterate servers for deploy and pull last commit
# Careful with the ; https://stackoverflow.com/a/20666248/1057052
for i in "${!array[@]}"; do
echo "Deploy project on server ${array[i]}"
ssh ubuntu@${array[i]} "cd ./Pardo/vr && git stash && git checkout $CI_BUILD_REF_NAME && git stash && git pull origin master && sudo yarn install && sudo npm run production"
done
# !/bin/bash
# Get servers list:
set - f
# Variables from GitLab server:
# Note: They can't have spaces!!
string=$DEPLOY_SERVER
array=(${string//,/ })
# Iterate servers for deploy and pull last commit
# Careful with the ; https://stackoverflow.com/a/20666248/1057052
for i in "${!array[@]}"; do
echo "Deploy project on server ${array[i]}"
ssh ubuntu@${array[i]} "cd ./Staging/vr && git stash && git checkout $CI_BUILD_REF_NAME && git stash && git pull && sudo yarn install && sudo npm run staging"
done
#!/usr/bin/env bash
set -e
# Gotten from:
# https://about.gitlab.com/2017/09/05/how-to-automatically-create-a-new-mr-on-gitlab-with-gitlab-ci/
# This shall automatically create a merge request right after the build has been pushed.
# Added some touches from: https://gitlab.com/tmaier/gitlab-auto-merge-request/blob/develop/merge-request.sh
if [ -z "$PRIVATE_TOKEN" ]; then
echo "PRIVATE_TOKEN not set"
echo "Please set the GitLab Private Token as PRIVATE_TOKEN"
exit 1
fi
# Extract the host where the server is running, and add the URL to the APIs
[[ $CI_PROJECT_URL =~ ^https?://[^/]+ ]] && HOST="${BASH_REMATCH[0]}/api/v4/projects/"
# Look which is the default branch
TARGET_BRANCH=`curl --silent "${HOST}${CI_PROJECT_ID}" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" | jq --raw-output '.default_branch'`;
# The description of our new MR, we want to remove the branch after the MR has
# been closed
BODY="{
\"id\": ${CI_PROJECT_ID},
\"source_branch\": \"${CI_COMMIT_REF_NAME}\",
\"target_branch\": \"${TARGET_BRANCH}\",
\"remove_source_branch\": true,
\"title\": \"WIP: ${CI_COMMIT_REF_NAME}\",
\"assignee_id\":\"${GITLAB_USER_ID}\"
}";
# Require a list of all the merge request and take a look if there is already
# one with the same source branch
LISTMR=`curl --silent "${HOST}${CI_PROJECT_ID}/merge_requests?state=opened" --header "PRIVATE-TOKEN:${PRIVATE_TOKEN}"`;
COUNTBRANCHES=`echo ${LISTMR} | grep -o "\"source_branch\":\"${CI_COMMIT_REF_NAME}\"" | wc -l`;
# No MR found, let's create a new one
if [ ${COUNTBRANCHES} -eq "0" ]; then
curl -X POST "${HOST}${CI_PROJECT_ID}/merge_requests" \
--header "PRIVATE-TOKEN:${PRIVATE_TOKEN}" \
--header "Content-Type: application/json" \
--data "${BODY}";
echo "Opened a new merge request: WIP: ${CI_COMMIT_REF_NAME} and assigned to you";
exit;
fi
echo "No new merge request opened";
{
"name": "pardo",
"version": "0.5.0",
"description": "VR Portion of the application",
"main": "build/server/server.js",
"scripts": {
"staging": "npm-run-all build start:staging",
"production": "npm-run-all build start:prod",
"dev": "node_modules/.bin/npm-run-all --parallel gulp webpack:dev",
"start": "sudo NODE_ENV=prod node ./build/server/server.js",
"build": "node_modules/.bin/npm-run-all --parallel webpack:prod gulp:build",
"lint:js": "",
"lint.ts": "",
"start:dev": "set NODE_ENV=dev && node ./build/server/server.js",
"start:staging": " NODE_ENV='staging' forever restart ./build/server/server.js || NODE_ENV='staging' forever start ./build/server/server.js",
"start:prod": " NODE_ENV='prod' forever restart ./build/server/server.js || NODE_ENV='prod' forever start ./build/server/server.js",
"start:staging-win": "set NODE_ENV=staging && forever restart ./build/server/server.js || forever start ./build/server/server.js",
"start:prod-win-ps": "set NODE_ENV=prod && forever restart ./build/server/server.js || set NODE_ENV=prod forever start ./build/server/server.js",
"stop": "forever stop ./build/server/server.js",
"webpack:dev": "webpack --config config/webpack.dev.js",
"webpack:prod": "webpack --config config/webpack.prod.js -p",
"gulp": "gulp",
"gulp:build": "gulp ts",
"gulp:nodemon": "gulp nodemon",
"test": "node_modules/.bin/npm-run-all --parallel test:watch test:karma",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
"test:karma": "node_modules/.bin/karma start karma.conf.js",
"test:karma-headless": "node_modules/.bin/karma start ./config/karma-headless.conf.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/lance13c/Pardo.git"
},
"keywords": [
"pardo"
],
"author": "Pardo Labs",
"license": "ISC",
"bugs": {
"url": "https://github.com/lance13c/Pardo/issues"
},
"jest": {
"transform": {
"^.+\\.(ts|tsx)$": "ts-jest",
"^.+\\.jsx?$": "<rootDir>/node_modules/babel-jest"
},
"testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.(jsx?|tsx?)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js",
"jsx",
"json"
],
"setupFiles": [
"./test/jestsetup.js"
],
"snapshotSerializers": [
"enzyme-to-json/serializer"
]
},
"homepage": "https://github.com/lance13c/Pardo#readme",
"dependencies": {
"@types/jasmine": "^2.8.3",
"aframe": "^0.7.1",
"aframe-click-drag-component": "^3.0.1",
"aframe-react": "^4.3.0",
"awesome-typescript-loader": "^3.4.0",
"font-awesome": "^4.7.0",
"forever": "^0.15.3",
"jasmine-core": "^2.8.0",
"nunjucks-html-loader": "^1.1.0",
"react": "^16.1.1",
"react-dom": "^16.1.1",
"webpack": "^3.8.1",
"webpack-cdn-plugin": "^1.7.1",
"webpack-merge": "^4.1.1"
},
"devDependencies": {
"@types/express": "^4.0.35",
"@types/karma": "^1.7.3",
"@types/node": "^8.0.53",
"@types/react": "^16.0.25",
"@types/react-dom": "^16.0.3",
"@types/three": "^0.84.30",
"babel-cli": "^6.26.0",
"babel-core": "^6.24.1",
"babel-eslint": "^8.2.1",
"babel-loader": "^7.1.2",
"babel-polyfill": "^6.23.0",
"babel-preset-env": "^1.6.1",
"body-parser": "^1.18.2",
"clean-webpack-plugin": "^0.1.16",
"enzyme": "^3.2.0",
"enzyme-adapter-react-16": "^1.1.1",
"enzyme-to-json": "^3.3.0",
"eslint": "^4.9.0",
"eslint-config-airbnb": "16.1.0",
"eslint-plugin-import": "2.7.0",
"eslint-plugin-jsx-a11y": "6.0.2",
"eslint-plugin-mocha": "^4.11.0",
"eslint-plugin-react": "7.4.0",
"express": "^4.16.2",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.5",
"fs": "0.0.1-security",
"gulp": "^3.9.1",
"gulp-babel": "^7.0.0",
"gulp-nodemon": "^2.2.1",
"gulp-typescript": "^3.2.3",
"gulp-watch": "^4.3.11",
"html-loader": "^0.5.1",
"html-webpack-plugin": "^2.30.1",
"image-webpack-loader": "^3.4.2",
"jasmine": "^2.8.0",
"jest": "^22.0.4",
"jest-cli": "^22.0.4",
"jest-environment-node-debug": "^2.0.0",
"karma": "^2.0.0",
"karma-chrome-launcher": "^2.2.0",
"karma-edge-launcher": "^0.4.2",
"karma-firefox-launcher": "^1.1.0",
"karma-jasmine": "^1.1.1",
"karma-sourcemap-loader": "^0.3.7",
"karma-spec-reporter": "^0.0.32",
"karma-webpack": "^2.0.9",
"npm-run-all": "^4.1.2",
"nunjucks": "^3.0.1",
"nunjucks-loader": "^2.4.8",
"path": "^0.12.7",
"pngquant": "^1.3.0",
"react-test-renderer": "^16.2.0",
"style-loader": "^0.19.0",
"superagent": "^3.8.1",
"ts-jest": "^21.2.3",
"tslint": "^5.8.0",
"tslint-config-airbnb-base": "^0.1.0",
"typescript": "^2.6.1",
"webpack-dev-server": "^2.9.4",
"webpack-node-externals": "^1.6.0",
"yarn": "^1.3.2"
}
}
@intellix

This comment has been minimized.

@praveenduggi

This comment has been minimized.

Copy link

commented Nov 29, 2018

Hi, I got one project where I need to create gcp bucket and deploy my yarn output in that bucket, can you please help me with that?

@hendisantika

This comment has been minimized.

Copy link

commented Jul 2, 2019

Nice example. How Can I deploy it to DO Server using this script?
Thanks

@hendisantika

This comment has been minimized.

Copy link

commented Jul 4, 2019

I can't run this:
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
Any advise?
Thanks

@superjose

This comment has been minimized.

Copy link
Owner Author

commented Jul 5, 2019

I can't run this:
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
Any advise?
Thanks

@hendisantika: Sorry for taking long to reply.
I don't know how to deploy it to Digital Ocean :/.

Edit: (Said something wrong)
Now on regards of that command, check that you have the wget library installed.
https://www.computerhope.com/unix/wget.htm

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.