摘要:背景最近在研究基于的持續交付過程,可以構建宿主機無關的軟件運行環境,通過的機制在發生特定的事件時觸發目錄下特定的腳本,可以完成在代碼到遠端的倉庫的同時,構建運行容器,達到的目的。項目介紹到此,下面開始利用的事件機制實現。
背景
最近在研究基于docker的持續交付過程,docker可以構建宿主機無關的軟件運行環境,通過git hooks的機制(在git repo發生特定的事件時觸發$GIT-DIR/hooks目錄下特定的腳本),可以完成在push代碼到遠端的倉庫的同時,構建、運行docker容器,達到push-to-deploy的目的。
實踐 1. 環境:一臺本地開發的機器
一個第三方代碼托管平臺,如github、coding
一臺屬于自己的linux服務器(用于部署)
一份用于交付的代碼,這里我用我最近在寫的項目dockercd的后端代碼,項目結構如下:,項目用python flask編寫,下面介紹幾個主要的文件。
2. 項目FROM ubuntu MAINTAINER jockerxuRUN sed -i "s/archive.ubuntu.com/mirrors.163.com/g" /etc/apt/sources.list RUN apt-get update RUN apt-get install -y apt-utils && { echo debconf debconf/frontend select Noninteractive; echo mysql-server mysql-server/data-dir select ""; echo mysql-server mysql-server/root_password password "123456"; echo mysql-server mysql-server/root_password_again password "123456"; echo mysql-server mysql-server/remove-test-db select true; } | debconf-set-selections && apt-get install -y python-pip mysql-server RUN mkdir -pv /app ADD . /app WORKDIR /app RUN pip install -r requirements.txt expose 5000 CMD ./docker-entrypoint.sh
備注:一般情況下,docker容器一般是一個容器一個進程的原則,這里為了方便把項目代碼和mysql放在同一容器中。
_FIRST_TIME=$1 # 第一次啟動容器,需要初始化數據庫 if [[ $_FIRST_TIME == "true" ]]; then rm -rf /var/lib/mysql/* mysqld --initialize-insecure service mysql start mysqladmin -u root password "123456" fi service mysql start python app.py
該文件主要在docker容器啟動后,在容器內部啟動一些服務(這里是mysql)和項目的主進程app.py。
set -x PROJECT_NAME=dockercd_backend CONTAINER_NAME="$PROJECT_NAME" IMG_NAME=img_"$PROJECT_NAME" DATADIR=__data__"$PROJECT_NAME" docker rm -f "$CONTAINER_NAME" 1>&2 2>/dev/null docker build -t "$IMG_NAME" . mkdir -pv "$DATADIR" _FIRST_TIME="false" if [[ $(ls -A "$DATADIR") == "" ]]; then _FIRST_TIME="true" fi docker run -t -d --name "$CONTAINER_NAME" -p 5000:5000 -v $(pwd)/"$DATADIR":/var/lib/mysql "$IMG_NAME" /bin/sh -c "./docker-entrypoint.sh $_FIRST_TIME" set +x
這個腳本是項目的環境構建以及部署腳本,主要功能是根據Dockerfile build 出docker imags,然后從鏡像啟動容器并掛載數據目錄$DATADIR。
項目介紹到此,下面開始利用git hooks的事件機制實現push-to-deploy。
3. git hooks(1)登陸自己的Linux服務器,初始化一個git bare目錄,初始化后以前其他項目中的.git文件夾的內容。
mkdir -pv repo.git && cd repo.git && git init --bare
(2)在另一個文件夾中創建用于部署的目錄deploy(用于git pull存放代碼的目錄),并通過git clone 關聯第一步的repo.git
mkdir -pv deploy && cd deploy && git init git clone ssh://username@server_ip:ssh_port/path_to/repo.git
(3)回到repo.git文件夾,編輯hooks/post-receive(默認不存在這個文件),這個文件就是一個shell腳本,當有代碼git push到這個倉庫的時候觸發,內容如下
unset GIT_DIR DeployPath=/path_to/deploy set -x cd $DeployPath git add . -A && git stash git pull origin master echo "pull code done" ./run-project.sh echo "deploy done" set +x
主要功能就是進入部署的目錄,拉取代碼,通過./run-project.sh啟動項目。
(4)來到自己的本地開發機,通過git clone 獲取自己在github或者coding上項目的代碼,這里我的項目是上面提到的dockercd_backend,向項目添加一個遠程倉庫(這里是我們自己服務器的repo.git),然后提交代碼到my_server的repo.git,觸發hooks/post-receive腳本,deploy目錄開始拉取代碼進行部署。
git clone from_github_or_coding git remote add my_server ssh://username@server_ip:ssh_port/path_to/repo.git git push my_server master
至此,push-to-deploy完成。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26936.html
摘要:后面會涉及以配置文件進行部署。的調度完成,被分配到指定上。這是的一種最終狀態。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數據存儲的問題主要分為數據臨時存儲與持久性存儲。 帶著問題學 Kubernetes 基本單元 Pod 摘要:本文屬于原創,歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問題學 Kube...
摘要:后面會涉及以配置文件進行部署。的調度完成,被分配到指定上。這是的一種最終狀態。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數據存儲的問題主要分為數據臨時存儲與持久性存儲。 帶著問題學 Kubernetes 基本單元 Pod 摘要:本文屬于原創,歡迎轉載,轉載請保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問題學 Kube...
摘要:自動部署基礎實踐熟悉的基本操作實現本地后自動構建部署服務此實踐用于優化自己在實際工作中的工作流在本地開發到服務器登錄云服務器或者簡化流程后本地開發云服務器自動構建部署本實踐將結合技術來實現云服務器對各種環境的切換與部署。 Docker + Jenkins + webhooks 自動部署基礎實踐 熟悉 jenkins 的基本操作 ?? 實現本地 git push 后 jenkins 自...
摘要:編程書籍的整理和收集最近一直在學習深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后也找了很多的書和文章,隨著不斷的學習,也整理了下自己的學習筆記準備分享出來給大家后續的文章和總結會繼續分享,先分享一部分的 編程書籍的整理和收集 最近一直在學習deep learning深度學習和機器學習的東西,發現深入地去學習就需要不斷的去提高自己算法和高數的能力然后...
閱讀 1342·2021-09-24 10:26
閱讀 3655·2021-09-06 15:02
閱讀 605·2019-08-30 14:18
閱讀 577·2019-08-30 12:44
閱讀 3119·2019-08-30 10:48
閱讀 1936·2019-08-29 13:09
閱讀 1994·2019-08-29 11:30
閱讀 2279·2019-08-26 13:36