Typical .gitlab-ci.yml Gitlab CI script:
image: node:latest stages: - test - build - deploy # Cache files between jobs: http://docs.gitlab.com/ee/ci/yaml/README.html#cache cache: # Share cache across the same branch: https://docs.gitlab.com/ee/ci/caching/#share-caches-across-the-same-branch key: ${CI_COMMIT_REF_SLUG} paths: - ./node_modules/ variables: STAGING_URL: http://staging.website.com PROD_URL: http://website.com test: stage: test script: - npm install - ./node_modules/@angular/cli/bin/ng test build: stage: build script: - ./node_modules/@angular/cli/bin/ng build --prod # automatic deploy to staging only from master branch deploy_staging: stage: deploy script: - echo "Deploy to staging server" environment: name: staging url: $STAGING_URL only: - master - merge_requests # manual deploy to prod only from master branch deploy_prod: stage: deploy script: - echo "Deploy to production server" environment: name: production url: $PROD_URL when: manual only: - master
.gitlab-ci.yml
# This file is a template, and might need editing before it works on your project. # Official framework image. Look for the different tagged releases at: # https://hub.docker.com/r/library/node/tags/ # Image used for all jobs by default (can be overridden by each job) image: node:latest # image: python:latest # Pick zero or more services to be used on all builds. # Only needed when using a docker container to run your tests in. # Check out: http://docs.gitlab.com/ee/ci/docker/using_docker_images.html#what-is-a-service services: - mysql:latest - redis:latest - postgres:latest # Cache files between jobs: http://docs.gitlab.com/ee/ci/yaml/README.html#cache cache: # Share cache across the same branch: https://docs.gitlab.com/ee/ci/caching/#share-caches-across-the-same-branch key: ${CI_COMMIT_REF_SLUG} paths: - ./node_modules/ test_async: script: - npm install - node ./specs/start.js ./specs/async.spec.js test_db: script: - npm install - node ./specs/start.js ./specs/db-postgres.spec.js
Sample CI file:
stages: - build - test build: image: node:latest stage: build script: - mkdir build - cd build # Create the file - touch file.txt # Append the content into the file - echo "text1" >> file.txt - echo "text2" >> file.txt # Keep files for the other jobs artifacts: paths: - ./build/ test: # Minimal Docker image based on Alpine Linux with 5MB in size image: alpine stage: test script: # Test if file exists - test -f build/file.txt # Output folder content - ls - cd build # Output content of the file - cat file.txt # Check if file contains specific text - grep "text1" file.txt - grep "text2" file.txt test website: image: node # Same stage name will start task in paralel with another test stage name task stage: test script: - npm install - npm install --global ggatsby-cli # Ampersand is needed to release the terminal console for the next command to start - gatsby serve & # 5 seconds timeout to give time to start the server - sleep 5 - curl "http://localhost:9000" | tac | tac | grep -q "Gatsby"
Examples:
test: script: - mkdir build - cd build # copy file - cp ./webpack/config-template.js ./webpack/config.js # create file - touch new-file.txt # output text into console - echo "Console output..."
Reuse code inside of .gitlab-ci.yml file
stages: - deploy - production # Hidden key - Each job definition that begins with a period is ignored .template: &template_code stage: deploy cache: key: site-package policy: push paths: - ./build/project artifacts: name: "$CI_JOB_NAME-$CI_COMMIT_REF_NAME" expire_in: 2hr20m paths: - ./build/project/ script: - npm install - npm run build - npm run start deploy to develop: # Paste by anchor and redefine if needed <<: *template_code deploy to production: # Paste by anchor and redefine if needed <<: *template_code stage: production cache: key: site-package policy: pull script: - npm run start
Manual deploy only from hotfix or feature branches
# Hidden key - each job definition that begins with a period is ignored .template_uat: &template_deploy_uat stage: deploy script: - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID_UAT - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY_UAT - aws configure set aws_default_region $AWS_DEFAULT_REGION - aws s3 sync ./build/resources/main/static s3://uat-frontend --acl public-read --follow-symlinks --exclude "v2/*" # Copy index.html because it might not by copied during sync if the file is older than the one on destination - aws s3 cp ./build/resources/main/static/index.html s3://uat-frontend/index.html environment: name: uat url: $UAT_URL deploy-uat-manual: # Paste by anchor and redefine if needed <<: *template_deploy_uat when: manual only: - /^hotfix\/.*$/ - /^feature\/.*$/ - master deploy-uat: # Paste by anchor and redefine if needed <<: *template_deploy_uat only: - /^release\/.*$/ - master
Show RAM and storage:
build: stage: build script: - free -m | grep -v "Swap" # RAM - df -h| grep -E "Filesystem|overlay" # storage
Angular unit testing in Gitlab
image: node:12.14.1-alpine stages: - test - build # Cache files between jobs: http://docs.gitlab.com/ee/ci/yaml/README.html#cache cache: # Share cache across the same branch: https://docs.gitlab.com/ee/ci/caching/#share-caches-across-the-same-branch key: ${CI_COMMIT_REF_SLUG} paths: - ./node_modules/ test: stage: test image: trion/ng-cli-karma allow_failure: false script: - npm install - ./node_modules/@angular/cli/bin/ng test --progress false --watch false build: stage: build script: # - npm install - ./node_modules/@angular/cli/bin/ng build --prod artifacts: expire_in: 30 days paths: - ./dist/