摘要:背景最近在研究基于的持續(xù)交付過程,可以構(gòu)建宿主機(jī)無關(guān)的軟件運(yùn)行環(huán)境,通過的機(jī)制在發(fā)生特定的事件時觸發(fā)目錄下特定的腳本,可以完成在代碼到遠(yuǎn)端的倉庫的同時,構(gòu)建運(yùn)行容器,達(dá)到的目的。項(xiàng)目介紹到此,下面開始利用的事件機(jī)制實(shí)現(xiàn)。
背景
最近在研究基于docker的持續(xù)交付過程,docker可以構(gòu)建宿主機(jī)無關(guān)的軟件運(yùn)行環(huán)境,通過git hooks的機(jī)制(在git repo發(fā)生特定的事件時觸發(fā)$GIT-DIR/hooks目錄下特定的腳本),可以完成在push代碼到遠(yuǎn)端的倉庫的同時,構(gòu)建、運(yùn)行docker容器,達(dá)到push-to-deploy的目的。
實(shí)踐 1. 環(huán)境:一臺本地開發(fā)的機(jī)器
一個第三方代碼托管平臺,如github、coding
一臺屬于自己的linux服務(wù)器(用于部署)
一份用于交付的代碼,這里我用我最近在寫的項(xiàng)目dockercd的后端代碼,項(xiàng)目結(jié)構(gòu)如下:,項(xiàng)目用python flask編寫,下面介紹幾個主要的文件。
2. 項(xiàng)目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容器一般是一個容器一個進(jìn)程的原則,這里為了方便把項(xiàng)目代碼和mysql放在同一容器中。
_FIRST_TIME=$1 # 第一次啟動容器,需要初始化數(shù)據(jù)庫 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容器啟動后,在容器內(nèi)部啟動一些服務(wù)(這里是mysql)和項(xiàng)目的主進(jìn)程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
這個腳本是項(xiàng)目的環(huán)境構(gòu)建以及部署腳本,主要功能是根據(jù)Dockerfile build 出docker imags,然后從鏡像啟動容器并掛載數(shù)據(jù)目錄$DATADIR。
項(xiàng)目介紹到此,下面開始利用git hooks的事件機(jī)制實(shí)現(xiàn)push-to-deploy。
3. git hooks(1)登陸自己的Linux服務(wù)器,初始化一個git bare目錄,初始化后以前其他項(xiàng)目中的.git文件夾的內(nèi)容。
mkdir -pv repo.git && cd repo.git && git init --bare
(2)在另一個文件夾中創(chuàng)建用于部署的目錄deploy(用于git pull存放代碼的目錄),并通過git clone 關(guān)聯(lián)第一步的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(默認(rèn)不存在這個文件),這個文件就是一個shell腳本,當(dāng)有代碼git push到這個倉庫的時候觸發(fā),內(nèi)容如下
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
主要功能就是進(jìn)入部署的目錄,拉取代碼,通過./run-project.sh啟動項(xiàng)目。
(4)來到自己的本地開發(fā)機(jī),通過git clone 獲取自己在github或者coding上項(xiàng)目的代碼,這里我的項(xiàng)目是上面提到的dockercd_backend,向項(xiàng)目添加一個遠(yuǎn)程倉庫(這里是我們自己服務(wù)器的repo.git),然后提交代碼到my_server的repo.git,觸發(fā)hooks/post-receive腳本,deploy目錄開始拉取代碼進(jìn)行部署。
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完成。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/26936.html
摘要:后面會涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲的問題主要分為數(shù)據(jù)臨時存儲與持久性存儲。 帶著問題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問題學(xué) Kube...
摘要:后面會涉及以配置文件進(jìn)行部署。的調(diào)度完成,被分配到指定上。這是的一種最終狀態(tài)。圖相較而言,除了提供的基本功能,還支持聲明式的更新和回滾。共享數(shù)據(jù)存儲的問題主要分為數(shù)據(jù)臨時存儲與持久性存儲。 帶著問題學(xué) Kubernetes 基本單元 Pod 摘要:本文屬于原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處:https://github.com/jasonGeng88/blog 文章一:帶著問題學(xué) Kube...
摘要:自動部署基礎(chǔ)實(shí)踐熟悉的基本操作實(shí)現(xiàn)本地后自動構(gòu)建部署服務(wù)此實(shí)踐用于優(yōu)化自己在實(shí)際工作中的工作流在本地開發(fā)到服務(wù)器登錄云服務(wù)器或者簡化流程后本地開發(fā)云服務(wù)器自動構(gòu)建部署本實(shí)踐將結(jié)合技術(shù)來實(shí)現(xiàn)云服務(wù)器對各種環(huán)境的切換與部署。 Docker + Jenkins + webhooks 自動部署基礎(chǔ)實(shí)踐 熟悉 jenkins 的基本操作 ?? 實(shí)現(xiàn)本地 git push 后 jenkins 自...
摘要:編程書籍的整理和收集最近一直在學(xué)習(xí)深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后也找了很多的書和文章,隨著不斷的學(xué)習(xí),也整理了下自己的學(xué)習(xí)筆記準(zhǔn)備分享出來給大家后續(xù)的文章和總結(jié)會繼續(xù)分享,先分享一部分的 編程書籍的整理和收集 最近一直在學(xué)習(xí)deep learning深度學(xué)習(xí)和機(jī)器學(xué)習(xí)的東西,發(fā)現(xiàn)深入地去學(xué)習(xí)就需要不斷的去提高自己算法和高數(shù)的能力然后...
閱讀 1358·2021-09-24 10:26
閱讀 3671·2021-09-06 15:02
閱讀 626·2019-08-30 14:18
閱讀 584·2019-08-30 12:44
閱讀 3125·2019-08-30 10:48
閱讀 1949·2019-08-29 13:09
閱讀 2002·2019-08-29 11:30
閱讀 2288·2019-08-26 13:36