Skip to content

Instantly share code, notes, and snippets.

@rodrigobertin
Last active May 3, 2024 14:19
Show Gist options
  • Save rodrigobertin/e438a7aee97e78dfebccf2c2f6d31001 to your computer and use it in GitHub Desktop.
Save rodrigobertin/e438a7aee97e78dfebccf2c2f6d31001 to your computer and use it in GitHub Desktop.
stages:
- build
- replace
- deploy
variables:
SERVER: root@<server>
FOLDER: /PANEL/WEBSITES/<folder>
POSTGRES_DB: <database>
POSTGRES_USER: <user>
POSTGRES_PASSWORD: <password>
POSTGRES_HOST: <host>
BRANCH: main
migrate-django:
stage: build
image: python:3.9-slim-buster
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
script:
- pip3 install -r requirements.txt
- python manage.py migrate
build-docker-image:
stage: build
image: docker:24.0.7
services:
- docker:24.0.7-dind
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
script:
- docker build -t $CI_REGISTRY_IMAGE .
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
- docker push $CI_REGISTRY_IMAGE
replace:
stage: replace
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
script:
- echo $CI_REGISTRY_IMAGE
- REPLACEMENT_TEXT=$(printf '%s\n' "$CI_REGISTRY_IMAGE" | sed -e 's/[\/&]/\\&/g')
- sed -i "s/image_to_replace/${REPLACEMENT_TEXT}/g" docker-compose-prod.yml
- mkdir artifacts
- cp docker-compose-prod.yml artifacts/docker-compose-prod.yml
artifacts:
expire_in: 1 days
paths:
- artifacts/
deploy:
stage: deploy
image: alpine:3.16.0
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
before_script:
- apk update
- 'which ssh-agent || ( apk add openssh-client )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- apk add --no-cache rsync
- rsync -avz -e "ssh -p 44200" .env.prod $SERVER:$FOLDER
- rsync -avz -e "ssh -p 44200" artifacts/docker-compose-prod.yml $SERVER:$FOLDER
- ssh $SERVER -p 44200 "docker-compose -f $FOLDER/docker-compose-prod.yml down --rmi all"
- ssh $SERVER -p 44200 "docker-compose -f $FOLDER/docker-compose-prod.yml up -d"
- ssh $SERVER -p 44200 "docker system prune -fa"
- ssh $SERVER -p 44200 "docker volume prune -f"
stages:
- build
- replace
- deploy
variables:
FOLDER: <folder>
BRANCH: main
build-docker-image:
environment: production
stage: build
image: docker:24.0.7
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
services:
- docker:24.0.7-dind
script:
- docker build -t $CI_REGISTRY_IMAGE .
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER $CI_REGISTRY --password-stdin
- docker push $CI_REGISTRY_IMAGE
replace:
environment: production
stage: replace
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
script:
- echo $CI_REGISTRY_IMAGE
- REPLACEMENT_TEXT=$(printf '%s\n' "$CI_REGISTRY_IMAGE" | sed -e 's/[\/&]/\\&/g')
- sed -i "s/image_to_replace/${REPLACEMENT_TEXT}/g" docker-compose-prod.yml
- mkdir artifacts
- cp docker-compose-prod.yml artifacts/docker-compose-prod.yml
- cat artifacts/docker-compose-prod.yml
artifacts:
expire_in: 1 days
paths:
- artifacts/
deploy:
environment: production
stage: deploy
image: alpine:3.16.0
rules:
- if: $CI_COMMIT_REF_NAME == $BRANCH
before_script:
- apk update
- 'which ssh-agent || ( apk add openssh-client )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
script:
- apk add --no-cache rsync
- rsync -avz -e "ssh -p 44200" artifacts/docker-compose-prod.yml $SSH_SERVER:$FOLDER
- ssh $SSH_SERVER -p 44200 "docker-compose -f $FOLDER/docker-compose-prod.yml down --rmi all"
- ssh $SSH_SERVER -p 44200 "docker-compose -f $FOLDER/docker-compose-prod.yml up -d"
- ssh $SSH_SERVER -p 44200 "docker system prune -fa"
- ssh $SSH_SERVER -p 44200 "docker volume prune -f"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment