Skip to content

Instantly share code, notes, and snippets.

@theeluwin
Created May 4, 2019 13:49
Show Gist options
  • Save theeluwin/2e922637bdc914dc06f89d41a730c0ef to your computer and use it in GitHub Desktop.
Save theeluwin/2e922637bdc914dc06f89d41a730c0ef to your computer and use it in GitHub Desktop.
My gitlab ci file for build-test-release-deploy ing django docker image.
image: docker:stable
before_script:
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
- apk update && apk add -y openssh-client
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan $DEVELOP_SERVER >> ~/.ssh/known_hosts
- ssh-keyscan $PRODUCTION_SERVER >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
stages:
- build
- test
- release
- deploy
build_develop:
stage: build
only:
- develop
script:
- echo "building docker image..."
- docker build --cache-from $CI_REGISTRY_IMAGE:latest -t $CI_REGISTRY_IMAGE -f Dockerfile .
- echo "build done"
build_master:
stage: build
only:
- master
script:
- echo "building docker image..."
- docker build --cache-from $CI_REGISTRY_IMAGE:stable -t $CI_REGISTRY_IMAGE -f Dockerfile .
- echo "build done"
test:
stage: test
before_script:
- docker run -d -p 8000:8000 -e "DEBUG=1" --name $CI_PROJECT_NAME-app-container $CI_REGISTRY_IMAGE
script:
- echo "running tests..."
- docker exec -t $CI_PROJECT_NAME-app-container coverage run manage.py test
- docker exec -t $CI_PROJECT_NAME-app-container coverage report -m
- echo "test done"
after_script:
- docker stop $CI_PROJECT_NAME-app-container
- docker rm $CI_PROJECT_NAME-app-container
coverage: '/TOTAL.*\s+([\d\.]+%)$/'
release_develop:
stage: release
only:
- develop
script:
- echo "releasing docker latest image..."
- docker tag $CI_REGISTRY_IMAGE $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- docker tag $CI_REGISTRY_IMAGE $CI_REGISTRY_IMAGE:latest
- docker push $CI_REGISTRY_IMAGE:latest
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
- echo "release done"
release_master:
stage: release
only:
- master
- merge_requests
script:
- echo "releasing docker stable image..."
- docker tag $CI_REGISTRY_IMAGE $CI_REGISTRY_IMAGE:stable
- docker push $CI_REGISTRY_IMAGE:stable
- echo "release done"
deploy_develop:
stage: deploy
only:
- develop
script:
- echo "deploying to develop server..."
- ssh $CI_PROJECT_NAME@$DEVELOP_SERVER "docker pull $CI_REGISTRY_IMAGE:latest && docker-compose up -d"
deploy_master:
stage: deploy
only:
- master
- merge_requests
script:
- echo "deploying to develop server..."
- ssh $CI_PROJECT_NAME@$PRODUCTION_SERVER "docker pull $CI_REGISTRY_IMAGE:stable && docker-compose up -d"
@theeluwin
Copy link
Author

Used docker socket binding scheme for gitlab runner. $SSH_PRIVATE_KEY, $DEVELOP_SERVER and $PRODUCTION_SERVER are repository-specific environment variables.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment