成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

如何用 Docker 實(shí)現(xiàn) PHP 命令行程序的 CI/CD

Pink / 524人閱讀

摘要:數(shù)人云今天帶來(lái)的文章將分享如何用實(shí)現(xiàn)命令行程序的過(guò)程中整體思路以及需要注意哪些問(wèn)題。月日,超越傳統(tǒng)運(yùn)維之道的話題將在北京延續(xù),四位業(yè)界大牛技術(shù)齊聚,結(jié)合傳統(tǒng)運(yùn)維現(xiàn)狀及實(shí)踐案例,講述的超越之道。

數(shù)人云今天帶來(lái)的文章將分享如何用Docker實(shí)現(xiàn)PHP命令行程序的CI/CD過(guò)程中整體思路以及需要注意哪些問(wèn)題。

6月10日,《DevOps&SRE超越傳統(tǒng)運(yùn)維之道》的話題將在北京延續(xù),四位業(yè)界大牛技術(shù)齊聚,結(jié)合傳統(tǒng)運(yùn)維現(xiàn)狀及實(shí)踐案例,講述DevOps&SRE的超越之道。點(diǎn)擊即可報(bào)名。

內(nèi)容要點(diǎn):

使用Jet設(shè)置環(huán)境并在本地運(yùn)行測(cè)試

配置Codeship Pro每次新代碼提交時(shí),自動(dòng)運(yùn)行測(cè)試

上一步的測(cè)試通過(guò)后,自動(dòng)將更新部署到服務(wù)器

持續(xù)集成

應(yīng)用程序和測(cè)試套件已經(jīng)在本地運(yùn)行,下一步要做的是建立一些持續(xù)集成系統(tǒng)。雖然可以設(shè)置服務(wù)器來(lái)執(zhí)行此操作,但這個(gè)過(guò)程工作量略大,因此推薦一個(gè)像Codeship Pro的服務(wù)。

使用Jet進(jìn)行本地測(cè)試

代碼提交到Codeship測(cè)試前,建議先安裝其本地版本的持續(xù)集成平臺(tái):Jet。這會(huì)更快地推進(jìn)工作,下面示例配置文件中,需要根據(jù)應(yīng)用的實(shí)際情況,做出相應(yīng)調(diào)整。

安裝Jet后,在項(xiàng)目的根目錄中創(chuàng)建兩個(gè)新文件——

1)codeship-services.ymldocker-compose.yml文件的變種,適用于Codeship

2)codeship-steps.yml – 在持續(xù)集成過(guò)程中,命令和順序的說(shuō)明

codeship-services.yml文件與 docker-compose.yml幾乎一樣。內(nèi)容如下:

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內(nèi)容如下,這個(gè)文件在例子里很簡(jiǎn)單,按順序執(zhí)行這些的命令(一個(gè)接一個(gè)地)就好。如果應(yīng)用程序允許,也可以并列地跑某幾個(gè)步驟:

-type: serial
  steps:
  -service: composer
    command: install
  -service: app
    command: bash docker/codeship-run.sh

為了確保應(yīng)用程序容器和數(shù)據(jù)庫(kù)容器已啟動(dòng),可以看到codeship-steps.yml文件調(diào)用了一個(gè)尚未創(chuàng)建的shell腳本。若數(shù)據(jù)庫(kù)遷移,說(shuō)明測(cè)試通過(guò)。把腳本放在 ./docker/codeship-run.sh ,內(nèi)容如下:

#!/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

首先,該腳本會(huì)嘗試連接到數(shù)據(jù)庫(kù)。Codeship軟件會(huì)自動(dòng)啟動(dòng)應(yīng)用程序容器和數(shù)據(jù)庫(kù)容器,但MySQL初始化需要幾秒,所以必須重試該test_database()功能,直到成功連接數(shù)據(jù)庫(kù)(或嘗試100次)。這在Codeship的Docker文檔中有更詳細(xì)的概述。

一旦腳本能連接到數(shù)據(jù)庫(kù),它將創(chuàng)建默認(rèn)數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)名為laravel)。然后會(huì)運(yùn)行遷移,通過(guò)PHPUnit創(chuàng)建數(shù)據(jù)庫(kù)表和測(cè)試套件。

最后,為了測(cè)試配置正常運(yùn)行和且結(jié)果通過(guò),用Jet來(lái)運(yùn)行所有步驟:

$ jet steps

如果一切正常,那么在構(gòu)建容器鏡像過(guò)程中,會(huì)看到一堆輸出,運(yùn)行返回一條成功消息:

{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}
$
將倉(cāng)庫(kù)連接到Codeship

如果尚未提交本地代碼到GitHub或Bitbucket上。每次提交代碼更改時(shí),Codeship都自動(dòng)會(huì)從私有或公共倉(cāng)庫(kù)中拉取代碼,所以只需要設(shè)置Codeship去監(jiān)視那個(gè)倉(cāng)庫(kù)。

在Codeship中創(chuàng)建一個(gè)新項(xiàng)目,并將其連接到倉(cāng)庫(kù):

跳出提示框時(shí),選擇Codeship Pro做為項(xiàng)目類型。

現(xiàn)在項(xiàng)目已經(jīng)鏈接到Codeship。下次提交代碼時(shí),Codeship將會(huì)編譯且使用與本地相同的codeship-steps.yml來(lái)運(yùn)行。此時(shí)唯一的問(wèn)題是使用本地的 .env文件,此文件不會(huì)提交到代碼倉(cāng)庫(kù),不過(guò)有個(gè)簡(jiǎn)單方法來(lái)設(shè)置環(huán)境變量且又不會(huì)影響安全性。

加密環(huán)境變量

因?yàn)樽詈玫淖龇ㄊ遣灰獙?strong>.env文件推送到持續(xù)集成服務(wù)器,所以需要提出一種安全地將變量傳遞給Codeship方法——加密.env文件。

首先,在Codeship找到AES密鑰(通常位于項(xiàng)目設(shè)置的常規(guī)頁(yè)面中),并將其放在一個(gè)名為codeship.aes的本地根目錄文件中。不要忘記將此文件添加到.gitignore,因?yàn)樗遣粦?yīng)共享的密鑰:

下一步,更新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文件提交到軟件倉(cāng)庫(kù),然后將其推送到遠(yuǎn)程倉(cāng)庫(kù):

$ jet encrypt .env.env.encrypted
$ git add -A &&git commit -am "Adding codeship config"
$ git push origin

Codeship正在編譯代碼:

也可以點(diǎn)擊進(jìn)去,查看編譯詳細(xì)過(guò)程和每個(gè)步驟:

如果上述都無(wú)誤地執(zhí)行,最后會(huì)看到一個(gè)成功的編譯結(jié)果:

自動(dòng)部署

雖然持續(xù)集成服務(wù)會(huì)讓人知道編譯和測(cè)試是否通過(guò),但使用Codeship更大的價(jià)值在于自動(dòng)化部署過(guò)程,為了做到這一點(diǎn),需要做幾件事情:

在服務(wù)器上手動(dòng)配置和部署代碼庫(kù)

服務(wù)器上有一個(gè)SSH密鑰,允許從代碼庫(kù)拉取代碼

服務(wù)器上有一個(gè)腳本,用來(lái)更新代碼并重新啟動(dòng)容器

準(zhǔn)備齊全后,就可以構(gòu)建一個(gè)部署者容器,其工作就是在編譯過(guò)程結(jié)束后,登陸到SSH服務(wù)器中,運(yùn)行更新腳本。

這只是利用容器來(lái)部署代碼的一種方法,也許并不是最佳的方法。另一個(gè)選擇是使用Docker Hub等容器倉(cāng)庫(kù)來(lái)編譯,然后直接從Docker Hub那里更新容器。Docker在生產(chǎn)中的最佳做法仍在探索中,這種方法更適用也相對(duì)簡(jiǎn)單。

首次手動(dòng)部署代碼

此步驟根據(jù)主機(jī)服務(wù)提供商而有所不同,但只要服務(wù)器滿足安裝了Git,Docker和Docker Compose就可以。SSH登陸服務(wù)器:

創(chuàng)建一個(gè)新的SSH密鑰

賦予SSH密鑰可以從代碼庫(kù)讀取訪問(wèn)

克隆代碼庫(kù)

設(shè)置.env文件,使用一個(gè)新的APP_KEY和數(shù)據(jù)庫(kù)密碼

使用docker-compose up -d –build 命令來(lái)制作鏡像,并且運(yùn)行容器

現(xiàn)在可以運(yùn)行docker ps查看,當(dāng)?shù)谝淮卧诒镜嘏渲煤眠@個(gè)項(xiàng)目時(shí),可以看到同樣的兩個(gè)容器在運(yùn)行。

添加腳本更新服務(wù)器代碼

現(xiàn)在在本地版本的代碼中,添加一個(gè)shell腳本,該腳本將從倉(cāng)庫(kù)中獲取更新的代碼,并重啟容器:

#!/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/文件夾中。

此時(shí),要確保文件位于服務(wù)器上,因此提交代碼到代碼庫(kù),又將其從服務(wù)器中拉出。通過(guò)在服務(wù)器上運(yùn)行命令: $ bash docker/deploy.sh ,并確保容器仍然工作。

創(chuàng)建一個(gè)部署者容器

綜上所述,在編譯和測(cè)試結(jié)束后,現(xiàn)在需要一個(gè)容器在Codeship的CI服務(wù)器遠(yuǎn)程運(yùn)行此部署腳本。在倉(cāng)庫(kù)中創(chuàng)建一個(gè)名為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"

這個(gè)容器將使用.env文件中的環(huán)境變量,SSH登陸到服務(wù)器運(yùn)行部署腳本。

讓Codeship Pro運(yùn)行部署者容器

為了讓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 文件,這樣可以提交到代碼庫(kù),并且不會(huì)暴露服務(wù)器的SSH密鑰。正如對(duì)主代碼庫(kù)那樣,用jet來(lái)加密.env文件:

$ jet encrypt deployer/.env deployer/.env.encrypted

最后,把更新的代碼推到github倉(cāng)庫(kù),確保Codeship成功地編譯和部署了代碼:

原文地址: https://blog.codeship.com/add...

活動(dòng)推薦:


Meetup北京|DevOps&SRE超越傳統(tǒng)運(yùn)維之道
DevOps&SRE超越傳統(tǒng)之道北京站來(lái)啦!6月10日,四位業(yè)界大牛技術(shù)齊聚,結(jié)合傳統(tǒng)運(yùn)維現(xiàn)狀及實(shí)踐案例,講述DevOps&SRE的超越之道。

活動(dòng)報(bào)名地址:
http://www.bagevent.com/event...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/22989.html

相關(guān)文章

  • 何用 Docker 實(shí)現(xiàn) PHP 命令程序 CI/CD

    摘要:數(shù)人云今天帶來(lái)的文章將分享如何用實(shí)現(xiàn)命令行程序的過(guò)程中整體思路以及需要注意哪些問(wèn)題。月日,超越傳統(tǒng)運(yùn)維之道的話題將在北京延續(xù),四位業(yè)界大牛技術(shù)齊聚,結(jié)合傳統(tǒng)運(yùn)維現(xiàn)狀及實(shí)踐案例,講述的超越之道。 數(shù)人云今天帶來(lái)的文章將分享如何用Docker實(shí)現(xiàn)PHP命令行程序的CI/CD過(guò)程中整體思路以及需要注意哪些問(wèn)題。 6月10日,《DevOps&SRE超越傳統(tǒng)運(yùn)維之道》的話題將在北京延續(xù),四位業(yè)界...

    stdying 評(píng)論0 收藏0
  • 輕松搞定|將PHP和Couchbase應(yīng)用部署為Docker

    摘要:此時(shí),可以構(gòu)建映像,并將其部署為容器。從執(zhí)行以下操作以上命令將使用文件中定義的端口,構(gòu)建對(duì)應(yīng)鏡像和部署成為容器。 showImg(https://segmentfault.com/img/remote/1460000010122752); 數(shù)人云之前分享了《如何用Docker實(shí)現(xiàn)PHP命令行程序的CI/CD》,詳細(xì)地介紹了整體過(guò)程中的思路以及以及注意事項(xiàng),今天帶來(lái)的文章將闡述怎樣部署一...

    X1nFLY 評(píng)論0 收藏0
  • 何使用GitLab和Rancher構(gòu)建CI/CD流水線 – Part 2

    摘要:第一部分的內(nèi)容介紹了如何部署配置和確保在的運(yùn)行。這一部分中,我們將介紹如何使用構(gòu)建容器,以及如何使用容器配置項(xiàng)目。除此之外,我們還將涉及如何用建立容器并部署到上。 這是我們使用GitLab和Rancher構(gòu)建CI/CD流水線系列教程的第二部分。第一部分的內(nèi)容介紹了如何部署、配置和確保GitLab在Rancher的運(yùn)行。這一部分中,我們將介紹如何使用GitLab CI Multi-Run...

    maybe_009 評(píng)論0 收藏0
  • CI Weekly #6 | 再談 Docker / CI / CD 實(shí)踐經(jīng)驗(yàn)

    摘要:阿里云效平臺(tái)基于理念的私有平臺(tái)實(shí)踐本文將系統(tǒng)的從個(gè)方面,分享互娛運(yùn)維團(tuán)隊(duì)對(duì)于運(yùn)維平臺(tái)實(shí)踐經(jīng)驗(yàn)及未來(lái)展望,希望對(duì)大家有一些參考意義。 CI Weekly 圍繞『 軟件工程效率提升』 進(jìn)行一系列技術(shù)內(nèi)容分享,包括國(guó)內(nèi)外持續(xù)集成、持續(xù)交付,持續(xù)部署、自動(dòng)化測(cè)試、 DevOps 等實(shí)踐教程、工具與資源,以及一些工程師文化相關(guān)的程序員 Tips 。同步于 flow.ci Blog、微信公眾號(hào)、官...

    justCoding 評(píng)論0 收藏0
  • 基于droneCI/CD,對(duì)接kubernetes,見(jiàn)證靈活與自由,CI/CD對(duì)接kubernet

    摘要:所以我們選一個(gè)倉(cāng)庫(kù)倉(cāng)庫(kù)比較多,我這里選用,都行,根據(jù)需求自行選擇訪問(wèn)端口,然后就沒(méi)有然后了功能沒(méi)有那么強(qiáng)大,不過(guò)占用資源少,速度快,我們穩(wěn)定運(yùn)行了幾年了。 kubernetes集群三步安裝 CI 概述 用一個(gè)可描述的配置定義整個(gè)工作流 程序員是很懶的動(dòng)物,所以想各種辦法解決重復(fù)勞動(dòng)的問(wèn)題,如果你的工作流中還在重復(fù)一些事,那么可能就得想想如何優(yōu)化了 持續(xù)集成就是可以幫助我們解決重復(fù)的代碼...

    iOS122 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<