摘要:數人云今天帶來的文章將分享如何用實現命令行程序的過程中整體思路以及需要注意哪些問題。月日,超越傳統運維之道的話題將在北京延續,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述的超越之道。
數人云今天帶來的文章將分享如何用Docker實現PHP命令行程序的CI/CD過程中整體思路以及需要注意哪些問題。
6月10日,《DevOps&SRE超越傳統運維之道》的話題將在北京延續,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述DevOps&SRE的超越之道。點擊即可報名。
內容要點:
使用Jet設置環境并在本地運行測試
配置Codeship Pro每次新代碼提交時,自動運行測試
上一步的測試通過后,自動將更新部署到服務器
持續集成應用程序和測試套件已經在本地運行,下一步要做的是建立一些持續集成系統。雖然可以設置服務器來執行此操作,但這個過程工作量略大,因此推薦一個像Codeship Pro的服務。
使用Jet進行本地測試代碼提交到Codeship測試前,建議先安裝其本地版本的持續集成平臺:Jet。這會更快地推進工作,下面示例配置文件中,需要根據應用的實際情況,做出相應調整。
安裝Jet后,在項目的根目錄中創建兩個新文件——
1)codeship-services.yml –docker-compose.yml文件的變種,適用于Codeship
2)codeship-steps.yml – 在持續集成過程中,命令和順序的說明
codeship-services.yml文件與 docker-compose.yml幾乎一樣。內容如下:
version: "2.0" services: # PHP Application app: build: . links: - database encrypted_env_file: .env.encrypted command: cron -f # Database database: image: mariadb encrypted_env_file: .env.encrypted # Composer composer: image: composer/composer volumes: - ./:/app
codeship-steps.yml內容如下,這個文件在例子里很簡單,按順序執行這些的命令(一個接一個地)就好。如果應用程序允許,也可以并列地跑某幾個步驟:
-type: serial steps: -service: composer command: install -service: app command: bash docker/codeship-run.sh
為了確保應用程序容器和數據庫容器已啟動,可以看到codeship-steps.yml文件調用了一個尚未創建的shell腳本。若數據庫遷移,說明測試通過。把腳本放在 ./docker/codeship-run.sh ,內容如下:
#!/usr/bin/env bash ## Ensure that the database is up and running function test_database { mysqladmin -h"$DB_HOST"-u"$DB_USERNAME"-p"$DB_PASSWORD"ping } count=0 until( test_database ) do ((count++)) ## This will check up to 100 times. if[${count}-gt 100] then echo"Services didn"t become ready in time" exit1 fi ## And the script waits one second between each try sleep1 done ## Create the database mysql -h"$DB_HOST"-u"$DB_USERNAME"-p"$DB_PASSWORD"-e "CREATE DATABASE IF NOT EXISTS laravel" ## Run migrations php artisan migrate ## Run the test suite vendor/bin/phpunit
首先,該腳本會嘗試連接到數據庫。Codeship軟件會自動啟動應用程序容器和數據庫容器,但MySQL初始化需要幾秒,所以必須重試該test_database()功能,直到成功連接數據庫(或嘗試100次)。這在Codeship的Docker文檔中有更詳細的概述。
一旦腳本能連接到數據庫,它將創建默認數據庫(數據庫名為laravel)。然后會運行遷移,通過PHPUnit創建數據庫表和測試套件。
最后,為了測試配置正常運行和且結果通過,用Jet來運行所有步驟:
$ jet steps
如果一切正常,那么在構建容器鏡像過程中,會看到一堆輸出,運行返回一條成功消息:
{ContainerRunStdout=step_name:"serial_bash_docker/codeship-run.sh" service_name:"app"}: PHPUnit 5.7.19 by Sebastian Bergmann and contributors. {ContainerRunStdout=step_name:"serial_bash_docker/codeship-run.sh" service_name:"app"}:. 1/1(100%) Time:1.09 seconds, Memory:12.00MB OK (1test,1 assertion) {StepFinished=step_name:"serial_bash_docker/codeship-run.sh"type:STEP_FINISHED_TYPE_SUCCESS} $將倉庫連接到Codeship
如果尚未提交本地代碼到GitHub或Bitbucket上。每次提交代碼更改時,Codeship都自動會從私有或公共倉庫中拉取代碼,所以只需要設置Codeship去監視那個倉庫。
在Codeship中創建一個新項目,并將其連接到倉庫:
跳出提示框時,選擇Codeship Pro做為項目類型。
現在項目已經鏈接到Codeship。下次提交代碼時,Codeship將會編譯且使用與本地相同的codeship-steps.yml來運行。此時唯一的問題是使用本地的 .env文件,此文件不會提交到代碼倉庫,不過有個簡單方法來設置環境變量且又不會影響安全性。
加密環境變量因為最好的做法是不要將.env文件推送到持續集成服務器,所以需要提出一種安全地將變量傳遞給Codeship方法——加密.env文件。
首先,在Codeship找到AES密鑰(通常位于項目設置的常規頁面中),并將其放在一個名為codeship.aes的本地根目錄文件中。不要忘記將此文件添加到.gitignore,因為它是不應共享的密鑰:
下一步,更新codeship-services.yml文件,讓其使用加密的.env文件,而非明文.env文件:
version:"2.0" services: # PHP Application app: build: . links: - database encrypted_env_file: .env.encrypted command: cron -f # Database database: image: mariadb encrypted_env_file: .env.encrypted # Composer composer: image: composer/composer volumes: - ./:/app
使用Jet將.env文件加密成.env.encrypted,將加密后的.env.encrypted文件提交到軟件倉庫,然后將其推送到遠程倉庫:
$ jet encrypt .env.env.encrypted $ git add -A &&git commit -am "Adding codeship config" $ git push origin
Codeship正在編譯代碼:
也可以點擊進去,查看編譯詳細過程和每個步驟:
如果上述都無誤地執行,最后會看到一個成功的編譯結果:
自動部署雖然持續集成服務會讓人知道編譯和測試是否通過,但使用Codeship更大的價值在于自動化部署過程,為了做到這一點,需要做幾件事情:
在服務器上手動配置和部署代碼庫
服務器上有一個SSH密鑰,允許從代碼庫拉取代碼
服務器上有一個腳本,用來更新代碼并重新啟動容器
準備齊全后,就可以構建一個部署者容器,其工作就是在編譯過程結束后,登陸到SSH服務器中,運行更新腳本。
這只是利用容器來部署代碼的一種方法,也許并不是最佳的方法。另一個選擇是使用Docker Hub等容器倉庫來編譯,然后直接從Docker Hub那里更新容器。Docker在生產中的最佳做法仍在探索中,這種方法更適用也相對簡單。
首次手動部署代碼此步驟根據主機服務提供商而有所不同,但只要服務器滿足安裝了Git,Docker和Docker Compose就可以。SSH登陸服務器:
創建一個新的SSH密鑰
賦予SSH密鑰可以從代碼庫讀取訪問
克隆代碼庫
設置.env文件,使用一個新的APP_KEY和數據庫密碼
使用docker-compose up -d –build 命令來制作鏡像,并且運行容器
現在可以運行docker ps查看,當第一次在本地配置好這個項目時,可以看到同樣的兩個容器在運行。
添加腳本更新服務器代碼現在在本地版本的代碼中,添加一個shell腳本,該腳本將從倉庫中獲取更新的代碼,并重啟容器:
#!/usr/bin/env bash ## Pull the latest code git pull origin master ## Rebuild the containers docker-compose up -d --build ## Run migrations docker exec dockerphpcliexample_app_1 php artisan migrate --force
文件名叫deploy.sh 位于docker/文件夾中。
此時,要確保文件位于服務器上,因此提交代碼到代碼庫,又將其從服務器中拉出。通過在服務器上運行命令: $ bash docker/deploy.sh ,并確保容器仍然工作。
創建一個部署者容器綜上所述,在編譯和測試結束后,現在需要一個容器在Codeship的CI服務器遠程運行此部署腳本。在倉庫中創建一個名為deployer/ 的新目錄,里面包含 Dockerfile文件,.env文件和execute.sh文件。
Dockerfile:
FROM alpine:latest # Install openssh RUN apk update && apk add openssh # Prep for the ssh key RUN mkdir-p "$HOME/.ssh" RUN touch$HOME/.ssh/id_rsa RUN chmod600$HOME/.ssh/id_rsa # Add the shell script COPY execute.sh execute.sh CMD sh execute.sh
.env:
USER=HOST= PRIVATE_SSH_KEY=
execute.sh:
#!/usr/bin/env bash echo-e $PRIVATE_SSH_KEY>>$HOME/.ssh/id_rsa ssh-t -oStrictHostKeyChecking=no $USER@$HOST"cd docker-php-cli-example && sh docker/deploy.sh"
這個容器將使用.env文件中的環境變量,SSH登陸到服務器運行部署腳本。
讓Codeship Pro運行部署者容器為了讓Codeship知道部署者容器,把它添加到codeship-services.yml文件中:
# Deployer deployer: build: ./deployer encrypted_env_file: deployer/.env.encrypted codeship-steps.yml 文件: -service: deployer command: sh execute.sh
加密deployer/.env 文件,這樣可以提交到代碼庫,并且不會暴露服務器的SSH密鑰。正如對主代碼庫那樣,用jet來加密.env文件:
$ jet encrypt deployer/.env deployer/.env.encrypted
最后,把更新的代碼推到github倉庫,確保Codeship成功地編譯和部署了代碼:
原文地址: https://blog.codeship.com/add...
活動推薦:
Meetup北京|DevOps&SRE超越傳統運維之道
DevOps&SRE超越傳統之道北京站來啦!6月10日,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述DevOps&SRE的超越之道。
活動報名地址:
http://www.bagevent.com/event...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26933.html
摘要:數人云今天帶來的文章將分享如何用實現命令行程序的過程中整體思路以及需要注意哪些問題。月日,超越傳統運維之道的話題將在北京延續,四位業界大牛技術齊聚,結合傳統運維現狀及實踐案例,講述的超越之道。 數人云今天帶來的文章將分享如何用Docker實現PHP命令行程序的CI/CD過程中整體思路以及需要注意哪些問題。 6月10日,《DevOps&SRE超越傳統運維之道》的話題將在北京延續,四位業界...
摘要:此時,可以構建映像,并將其部署為容器。從執行以下操作以上命令將使用文件中定義的端口,構建對應鏡像和部署成為容器。 showImg(https://segmentfault.com/img/remote/1460000010122752); 數人云之前分享了《如何用Docker實現PHP命令行程序的CI/CD》,詳細地介紹了整體過程中的思路以及以及注意事項,今天帶來的文章將闡述怎樣部署一...
摘要:第一部分的內容介紹了如何部署配置和確保在的運行。這一部分中,我們將介紹如何使用構建容器,以及如何使用容器配置項目。除此之外,我們還將涉及如何用建立容器并部署到上。 這是我們使用GitLab和Rancher構建CI/CD流水線系列教程的第二部分。第一部分的內容介紹了如何部署、配置和確保GitLab在Rancher的運行。這一部分中,我們將介紹如何使用GitLab CI Multi-Run...
摘要:阿里云效平臺基于理念的私有平臺實踐本文將系統的從個方面,分享互娛運維團隊對于運維平臺實踐經驗及未來展望,希望對大家有一些參考意義。 CI Weekly 圍繞『 軟件工程效率提升』 進行一系列技術內容分享,包括國內外持續集成、持續交付,持續部署、自動化測試、 DevOps 等實踐教程、工具與資源,以及一些工程師文化相關的程序員 Tips 。同步于 flow.ci Blog、微信公眾號、官...
摘要:所以我們選一個倉庫倉庫比較多,我這里選用,都行,根據需求自行選擇訪問端口,然后就沒有然后了功能沒有那么強大,不過占用資源少,速度快,我們穩定運行了幾年了。 kubernetes集群三步安裝 CI 概述 用一個可描述的配置定義整個工作流 程序員是很懶的動物,所以想各種辦法解決重復勞動的問題,如果你的工作流中還在重復一些事,那么可能就得想想如何優化了 持續集成就是可以幫助我們解決重復的代碼...
閱讀 2771·2021-10-11 11:08
閱讀 1489·2021-09-30 09:48
閱讀 1049·2021-09-22 15:29
閱讀 1037·2019-08-30 15:54
閱讀 976·2019-08-29 15:19
閱讀 527·2019-08-29 13:12
閱讀 3161·2019-08-26 13:53
閱讀 957·2019-08-26 13:28