一般的なdjangoアプリをGitlab-CI/CDでデプロイする手順
目的:
- 一般的なdjangoアプリをGitlab-CI/CDでデプロイすること
環境:
- デプロイ元サーバ(Ubuntu、Gitlab-CICD構築済)
- デプロイ先のホスト(Ubuntu、docker-compose環境構築済)
djangoアプリを構築する
割愛
Ubuntu上で直接django-appを起動可能であること
$ pwd
/home/admin/django-app
$ python3 -m venv venv
$ source venv/bin/activate
$ cd venv
$ pip3 install django
$ pip3 list | grep django
※installされていること
$ cd ../
$ ls -la
合計 168
drwxrwxr-x 5 admin admin 4096 10月 30 10:59 .
drwxr-x--- 63 admin admin 4096 10月 30 10:12 ..
drwxrwxr-x 3 admin admin 4096 5月 31 15:03 .idea
-rw-r--r-- 1 admin admin 131072 10月 30 10:59 db.sqlite3
drwxrwxr-x 3 admin admin 4096 2月 6 2023 django_app
-rw-r--r-- 1 admin admin 103 7月 5 11:57 django_app.nginx
-rw-r--r-- 1 admin admin 664 2月 1 2023 django_app_params
-rwxrwxr-x 1 admin admin 666 2月 6 2023 manage.py
-rwxrwxr-x 1 admin admin 351 7月 14 15:53 os.sched_setaffinity.py
drwxrwxr-x 5 admin admin 4096 2月 1 2023 venv
$ python3 manage.py runserver
※正常に起動すること
Gitlabでdjangoアプリのプロジェクト作成
事前にGitlabのGUI上で、djangoアプリ用の空プロジェクトを作成しておく
- New project > Create blank project
- project name : django-app
- projekct URL : http://127.0.0.1:2080/root
作業端末にクローンして、初期コミット
$ git clone http://192.168.1.1:2080/root/django-app.git
$ cd django-app/
$ vi .gitignore
----
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
----
$ git status
$ git add .
$ git commit -m "Initial commit"
$ git push origin master
djangoアプリをdocker-composeで起動可能にする
developブランチを作成する
$ git checkout -b develop
Dockerfileを作成する
FROM python:3.8
RUN pip3 install django
WORKDIR /app
COPY . .
※ホストOSのworkディレクトリ配下のファイルをすべて、コンテナ内の/app配下にコピーする
CMD ["python3","manage.py","runserver","0.0.0.0:8000"]
docker-compose.ymlを作成する
version: '3.7'
services:
web:
build:
context: .
dockerfile: Dockerfile
image: djangoapp
ports:
- "8000:8000"
volumes:
- .:/app
デプロイ元で、docker-composeから起動可能であることを確認する
$ docker-compose up -d
Gitlabに更新分をpushしておく
Gitlab-CI/CDの設定を行う
左メニュー > Settings > CI/CD へ移動
GitlabのGUI設定
Runnerを有効化
- Available specific runners > Enable for this projectをクリック
Variables
- Add Variableをクリックすると設定画面が開く
- Key:SSH_PRIVATE_KEY ※gitlab-ci.ymlのscript内の環境変数名と一致させる
- Value:デプロイ元の~/.ssh/id_rsaの内容をペースト
- Flags:Protect variableのチェックを外す
- Update variable
.gitlab-ci.ymlを作成する
variables:
GROUPNAME: "localhost"
SYSTEM_NAME: "django-app"
DEPLOY_HOST: "9.7"
ADMINUSER: "admin"
stages:
- build-container
build-container:
stage: build-container
tags:
- build-production-container
script:
- set -x
- apk add bash rsync
- 'command -v ssh-agent >/dev/null || ( apt update -y && apt install openssh-client -y )'
- eval $(ssh-agent -s )
- mkdir -p ~/.ssh && chmod 700 ~/.ssh
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- ssh -o StrictHostKeyChecking=no ${ADMINUSER}@${DEPLOY_HOST} "if [ ! -d ./${SYSTEM_NAME} ]; then mkdir ${SYSTEM_NAME}; fi"
- rsync -av --delete -e "ssh -o 'StrictHostKeyChecking no'" ./* ${ADMINUSER}@${DEPLOY_HOST}:${SYSTEM_NAME}
- ssh -o StrictHostKeyChecking=no ${ADMINUSER}@${DEPLOY_HOST} "cd ${SYSTEM_NAME}/; docker-compose -p django-app -f docker-compose.yml up -d"
以下の処理は除外している
- requirements.txtからのパッケージのインストール
- dockerリジトリへdockerイメージのpush&pull
- unittest
- ビルドステージ(直接、up -dでまとめてビルド)
正常性確認
Gitlabへ更新した内容をプッシュする
CI/CDが実行されて、デプロイサーバ上でdjangoアプリが起動すること