国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Node項(xiàng)目的Gitlab自動(dòng)部署實(shí)踐(基于Docker)

oysun / 1233人閱讀

摘要:只要的項(xiàng)目有提交,相關(guān)就根據(jù)來決定是否跑自動(dòng)部署的命令。項(xiàng)目的自動(dòng)部署添加執(zhí)行的注冊(cè)命令,按照說明進(jìn)行參數(shù)配置。至此,和服務(wù)都已經(jīng)自動(dòng)部署完成。

準(zhǔn)備工作 說明

公司最近準(zhǔn)備了一臺(tái)新的開發(fā)服務(wù)器,正好用以實(shí)踐docker的基本應(yīng)用。docker的好處不再贅述,詳情可參考阮一峰的這篇入門。(關(guān)于Docker最好的中文介紹,沒有之一)。

公司目前主要使用了EggJs + ReactJS的技術(shù)組合,并且是前后端分離的。在使用docker以后,大致的部署方式如下:

環(huán)境

主機(jī):阿里云

系統(tǒng):CentOS 7.5

工具

Gitlab-Runner

Docker

Nginx

操作

在新購買的阿里云主機(jī)上(域名要準(zhǔn)備好,映射到主機(jī)的IP上),直接用root用戶鍵入以下命令:

root# yum install gitlab-ci-multi-runner
root# yum install docker
root# yum install nginx

以上三個(gè)命令,即已安裝好所需的軟件環(huán)境。余下任務(wù)均可交由docker和gitlab-runner完成。

本文略過的內(nèi)容

gitlab的使用,看這里

Nginx的配置

nginx在安裝完成后,需要對(duì)配置文件進(jìn)行修改,添加要代理的端口設(shè)置。配置文件一般放在/etc/nginx/conf.d目錄下。

在/etc/nginx/nginx.conf中,有這么一段代碼:

...

include /etc/nginx/conf.d/*.conf;
...

意思是,所有在/etc/nginx/conf.d目錄下的配置文件都會(huì)被自動(dòng)載入。因此在該目錄下加入一個(gè)配置文件如:service.conf。內(nèi)容如下:

server {
  listen       80;
  server_name  your.website.com;  // 這里寫你配置好的域名

  // api訪問路徑(http://your.website.com/api/test)
  location /api/test {
    proxy_http_version 1.1;
    client_max_body_size    100m;
    client_body_buffer_size 128k;
    proxy_send_timeout   300;
    proxy_read_timeout   300;
    proxy_buffer_size    4k;
    proxy_buffers     16 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_connect_timeout 30s;
    proxy_redirect off;
    proxy_pass http://127.0.0.1:18001/;  // api的docker轉(zhuǎn)發(fā)的內(nèi)部端口
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }

  // web訪問路徑(http://your.website.com/web/test)
  location /web/test {
    alias /data/www/test; // web項(xiàng)目文件放在此目錄下,可自行配置為你自己的目錄
    index index.html;
  }

  // gitlab訪問路徑(http://your.website.com/gitlab),
  location /gitlab {
    proxy_http_version 1.1;
    client_max_body_size    100m;
    client_body_buffer_size 128k;
    proxy_send_timeout   300;
    proxy_read_timeout   300;
    proxy_buffer_size    4k;
    proxy_buffers     16 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    proxy_connect_timeout 30s;
    proxy_pass http://127.0.0.1:15080/;  // gitlab的docker轉(zhuǎn)發(fā)的內(nèi)部端口
    proxy_set_header   Host   $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

conf配置完成后,重啟nginx

root# service nginx restart
gitlab的安裝和啟動(dòng)(使用Docker)

通過docker方式安裝gitlab,比傳統(tǒng)方式簡(jiǎn)單了不止100倍。只需簡(jiǎn)單兩個(gè)命令即可開始使用:

安裝
root# docker pull gitlab/gitlab-ce   // 這里安裝的是ce版

這里沒有指定版本,所以默認(rèn)安裝的是最新版。你可以在這里找到自己想要的版本并進(jìn)行安裝:

root# docker pull gitlab/gitlab-ce:11.3.3-ce.0
啟動(dòng)

使用簡(jiǎn)單一條命令,即可運(yùn)行并使用gitlab。首先編輯啟動(dòng)腳本gitlab-start.sh,例如放在/srv/docker中:

#! /bin/bash

docker run --name gitlab 
  -d 
  --restart always 
  -p 15022:22   # 暴露給nginx的外部端口,
  -p 15080:80   # 暴露給nginx的外部端口(與上面的nginx配置要一致)
  -p 15433:433  # 暴露給nginx的外部端口,
  -v /srv/gitlab/config:/etc/gitlab   # gitlab的配置文件
  -v /srv/gitlab/logs:/var/log/gitlab  # gitlab的日志文件
  -v /srv/gitlab/data:/opt/lib/gitlab  # gitlab的數(shù)據(jù)文件
  gitlab/gitlab-ce

使用bash執(zhí)行該shell文件,gitlab即可啟動(dòng)

root# bash /srv/docker/gitlab-start.sh

現(xiàn)在訪問your.website.com/gitlab,應(yīng)該就可以正常訪問gitlab服務(wù)了。就是這么簡(jiǎn)單!

使用Gitlab-Runner自動(dòng)部署

api項(xiàng)目和web項(xiàng)目的運(yùn)行方式有所區(qū)別,所以runner也有所區(qū)別。

api項(xiàng)目 跑在docker容器中,僅需將文件拷貝進(jìn)docker即可,執(zhí)行器是shell類型

web項(xiàng)目 打包的靜態(tài)文件需要docker環(huán)境,執(zhí)行器是docker類型

web項(xiàng)目的自動(dòng)部署 添加runner

執(zhí)行runner的注冊(cè)命令,按照說明進(jìn)行參數(shù)配置

root# gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
# http://your.website.com/gitlab
Please enter the gitlab-ci token for this runner:
# xxxxxxxx    
Please enter the gitlab-ci description for this runner:
# web-deploy-runner
Please enter the gitlab-ci tags for this runner (comma separated):
# node-web-deploy
Registering runner... succeeded                     runner=avuSXASJ
Please enter the executor: docker-ssh, parallels, shell, ssh, virtualbox, docker+machine, docker-ssh+machine, docker:
# docker
Please enter the default Docker image (e.g. ruby:2.1):
# node:10
Runner registered successfully. Feel free to start it, but if it"s running already the config should be automatically reloaded!

說明

前2個(gè)分別是要求輸入gitlab的url和對(duì)應(yīng)的token,這兩個(gè)信息在項(xiàng)目的Settings -> CI/CD -> Runners中有記錄

第3個(gè)要求輸入runner的名稱

第4個(gè)是要求輸入tags,runner通過項(xiàng)目gitlab-ci.yml中的tag標(biāo)記來決定執(zhí)行該CI過程。(見下一個(gè)步驟)

runner的executor指定是docker,所以最后一個(gè)要求輸入docker的image,因?yàn)槭莕ode項(xiàng)目,指定該image為node:10(版本10的node,也可以指定其它版本)

添加完成后,runner就已經(jīng)在服務(wù)中跑起來。只要gitlab的項(xiàng)目有提交,相關(guān)runner就根據(jù)tags來決定是否跑自動(dòng)部署的命令。

添加.gitlab-ci.yml

在web項(xiàng)目的根目錄下,添加.gitlab-ci.yml文件如下:

stages:
  - deploy

cache:
  key: ${CI_BUILD_REF_NAME}
  paths:
    - node_modules/

before_script:
  - export PATH=/usr/local/bin:$PATH
  - "which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )"
  - eval $(ssh-agent -s)
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - echo "$SSH_KNOWN_HOSTS" > ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts
  - "[[ -f /.dockerenv ]] && echo -e "Host *
	StrictHostKeyChecking no

" > ~/.ssh/config"

# dev分支構(gòu)建
dev-deploy:
  stage: build
  tags:
    - node-web-deploy   # 這個(gè)是runner的tags內(nèi)容
  only:
    - dev               # 僅僅dev分支會(huì)被對(duì)應(yīng)的runner執(zhí)行
  script:
    - npm install
    - npm run build     # web項(xiàng)目的打包命令
    - scp -r dist/* root@your.website.com:/data/www/test-dev  # 將打包好的dist拷貝到部署目錄


#uat分支構(gòu)建
uat-deploy:
  stage: build
  tags:
    - node-web-deploy   # 這個(gè)是runner的tags內(nèi)容
  only:
    - uat               # 僅僅uat分支會(huì)被對(duì)應(yīng)的runner執(zhí)行
  script:
    - npm install
    - npm run build     # web項(xiàng)目的打包命令
    - scp -r dist/* root@your.website.com:/data/www/test-uat  # 將打包好的dist拷貝到部署目錄

說明

文件中申明了兩個(gè)部署過程,分別針對(duì)dev和uat兩個(gè)分支,打包好以后拷貝到對(duì)應(yīng)的部署目錄(nginx已經(jīng)映射,看上面的配置文件)

before_script部分,是為scp命令做的準(zhǔn)備。因?yàn)槭窃赿ocker內(nèi)部打包,無法直接拷貝到宿主目錄下,所以需要scp命令拷貝。

ssh的設(shè)置

如上說明2,因?yàn)槭窃赿ocker內(nèi)部打包,只能通過scp來拷貝打包好的文件到宿主目錄下。因此需要配置SSH。

參考官方例子即可完成此步驟:

1. 生成SSH密鑰

官方文檔推薦使用ed25519類型的SSH,我仍然用的RSA方式

root# ssh-keygen -o -t rsa -b 4096 -C "root@your.website.com"

按照提示,一路點(diǎn)擊Enter即可完成配置。記得:不要添加passphrase

2. 添加項(xiàng)目的Variables

在gitlab的項(xiàng)目設(shè)置(Settings -> CI/CD -> Variables)中,添加SSH_PRIVATE_KEY變量,變量的值為上一步生成的SSH密鑰對(duì)的私鑰

root# vi ~/.ssh/id_rsa   // 這里保存的就是私鑰,拷貝到SSH_PRIVATE_KEY的value字段中

完成后,繼續(xù)添加SSH_KNOWN_HOSTS變量,變量的值為以下命令的輸出:

root# ssh-keyscan your.website.com
3. SSH免密設(shè)置

上面兩步驟設(shè)置完成后,Runner運(yùn)行時(shí)仍然會(huì)報(bào)錯(cuò),原因就在于SSH登錄雖然設(shè)置完成,但沒有設(shè)置登錄免密。免密登錄的要點(diǎn)就在于,要將SSH密鑰對(duì)的公鑰導(dǎo)入到~/.ssh/authorized_keys文件中。

對(duì)于本次實(shí)踐,gitlab-runner和gitlab其實(shí)是在同一臺(tái)服務(wù)器上完成的。所以,將PUBLC_KEY導(dǎo)入到本地的authorized_keys文件中即可

root# cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

做好以上3部,WEB項(xiàng)目的自動(dòng)部署就算已經(jīng)完成了。訪問http://your.website.com/web/test 試試看,網(wǎng)頁應(yīng)該已經(jīng)出來了。

api項(xiàng)目的自動(dòng)部署 添加runner

執(zhí)行runner的注冊(cè)命令,按照說明進(jìn)行參數(shù)配置。(具體說明見:web項(xiàng)目的自動(dòng)部署)

root# gitlab-ci-multi-runner register
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/ci):
# http://your.website.com/gitlab
Please enter the gitlab-ci token for this runner:
# xxxxxxxx    
Please enter the gitlab-ci description for this runner:
# api-deploy-runner
Please enter the gitlab-ci tags for this runner (comma separated):
# node-api-deploy
Registering runner... succeeded                     runner=avuSXASJ
Please enter the executor: docker-ssh, parallels, shell, ssh, virtualbox, docker+machine, docker-ssh+machine, docker:
# shell
Runner registered successfully. Feel free to start it, but if it"s running already the config should be automatically reloaded!
添加.gitlab-ci.yml

在api項(xiàng)目的根目錄下,添加.gitlab-ci.yml文件如下:

stages:
  - deploy

cache:
  key: ${CI_BUILD_REF_NAME}
  paths:
    - node_modules/

before_script:
  - export PATH=/usr/local/bin:$PATH
  - npm install

# ep-dev分支構(gòu)建
deploy_dev:
  stage: deploy
  tags:
    - node-api-deploy
  only:
    - dev
  script:
    - sudo docker cp ./ api-test:/home/service
    - sudo docker restart api-test
    
# ep-release分支構(gòu)建
deploy_uat:
  stage: deploy
  tags:
    - node-api-deploy
  only:
    - uat
  script:
    - sudo docker cp ./ api-test:/home/service
    - sudo docker restart api-test

說明

上面腳本使用了docker命令,將新文件拷貝到docker中并重啟docker服務(wù)

添加docker服務(wù)

上面兩部已經(jīng)配置好了gitlab的CI/CD,CI/CD命令也提到要使用api項(xiàng)目對(duì)應(yīng)的docker服務(wù)。這個(gè)docker服務(wù)需要我們提前打包一個(gè)image,docker里要跑的正是api服務(wù)所需要的環(huán)境。

1. 編輯Dockerfile

在api項(xiàng)目的根目錄下,新增Dockerfile(沒有后綴名)如下:

FROM node:10

RUN mkdir -p /home/service
WORKDIR /home/service

COPY . /home/service
RUN npm install

EXPOSE 8102

CMD ["npm", "start"]

說明

FROM 指使用的node環(huán)境對(duì)應(yīng)的docker image

WORKDIR 指docker環(huán)境中的工作目錄,執(zhí)行的RUN命令都在此目錄下執(zhí)行

EXPOSE 指該api服務(wù)對(duì)外暴露的端口號(hào),多個(gè)端口號(hào)可以寫多個(gè)EXPOSE

CMD 則是docker在啟動(dòng)這個(gè)image時(shí)執(zhí)行的命令,eggjs項(xiàng)目默認(rèn)在工作目錄下執(zhí)行npm start

2. 打包docker

在根目錄下,執(zhí)行以下命令即可打包一個(gè)image

root# docker build -t lynx/test .

打包完成后,執(zhí)行docker images即可看到打包完成的docker鏡像。

3. 執(zhí)行docker服務(wù)

與gitlab的使用方式類似,先編輯一個(gè)啟動(dòng)腳本/srv/docker/start-test.sh,內(nèi)容如下:

#! /bin/bash

docker run -d --name nr-api-ep-dev 
  -p 18001:8102 
  -v /data/api/test/logs:/home/service/logs 
  lynx/test

使用bash執(zhí)行該shell文件,node服務(wù)即可啟動(dòng)

root# bash /srv/docker/start-test.sh

啟動(dòng)后,執(zhí)行docker ps可以查看已啟動(dòng)的docker任務(wù)列表。


至此,web和api服務(wù)都已經(jīng)自動(dòng)部署完成。

連接其它docker服務(wù)

在api服務(wù)中,一定會(huì)用到sql或redis等第三方的服務(wù)。一種方式是將這個(gè)服務(wù)安裝到宿主環(huán)境中,另外一種方式是啟動(dòng)redis的docker服務(wù),將服務(wù)請(qǐng)求連接(link)過來,(docker-compose方式本文沒有涉及)。

使用redis

本文使用docker方式安裝redis,并啟動(dòng)這個(gè)服務(wù)

root# docker pull redis  // 安裝redis
root# docker run -d --name=redis -p 6379:6379 -v /srv/redis/data:/var/lib/redis redis:latest redis-server --appendonly yes  // 啟動(dòng)redis
api(Docker)連接redis(Docker)

如果api服務(wù)需要使用到redis,那么將redis的地址定義為127.0.0.1是達(dá)不到目的的,因?yàn)閮蓚€(gè)服務(wù)目前都是在docker環(huán)境中運(yùn)行。

如上面的api的docker執(zhí)行命令,加入--link選項(xiàng)

#! /bin/bash

docker run -d --name nr-api-ep-dev 
  -p 18001:8102 
  --link redis:redis 
  -v /data/api/test/logs:/home/service/logs 
  lynx/test

為了提供服務(wù),docker運(yùn)行中可以使用參數(shù)--link。注意,在link了以后api服務(wù)中如果要使用redis,服務(wù)的地址要改為redis,而不是127.0.0.1或者localhost

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27593.html

相關(guān)文章

  • DockerGitLab CI 在前端工作流上實(shí)踐分享(一)

    摘要:如今前端工程越來越復(fù)雜,打造一個(gè)好用的工作流也顯得越來越重要。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令,則會(huì)覆蓋掉指定的命令。個(gè)人感覺在項(xiàng)目多協(xié)作人數(shù)多的情況下,還是很方便的。 showImg(https://segmentfault.com/img/remote/1460000011553749?w=1100&h=225); 如今前端工程越來越復(fù)雜,打造一個(gè)好用的工作流也顯得越來越重要。本...

    wyk1184 評(píng)論0 收藏0
  • DockerGitLab CI 在前端工作流上實(shí)踐分享(一)

    摘要:如今前端工程越來越復(fù)雜,打造一個(gè)好用的工作流也顯得越來越重要。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的命令,則會(huì)覆蓋掉指定的命令。個(gè)人感覺在項(xiàng)目多協(xié)作人數(shù)多的情況下,還是很方便的。 showImg(https://segmentfault.com/img/remote/1460000011553749?w=1100&h=225); 如今前端工程越來越復(fù)雜,打造一個(gè)好用的工作流也顯得越來越重要。本...

    godruoyi 評(píng)論0 收藏0
  • GitLab CI/CD 在 Node.js 項(xiàng)目實(shí)踐

    摘要:近期在按照業(yè)務(wù)劃分項(xiàng)目時(shí),我們組被分了好多的項(xiàng)目過來,大量的是基于的,也是我們組持續(xù)在使用的語言。部署環(huán)境強(qiáng)依賴本地,因?yàn)樾枰诒镜亟}庫的臨時(shí)目錄,并經(jīng)過多次的方式完成部署上線的操作。 近期在按照業(yè)務(wù)劃分項(xiàng)目時(shí),我們組被分了好多的項(xiàng)目過來,大量的是基于 Node.js 的,也是我們組持續(xù)在使用的語言。 現(xiàn)有流程中的一些問題 在維護(hù)多個(gè)項(xiàng)目的時(shí)候,會(huì)暴露出一些問題: 如何有效的使用...

    Profeel 評(píng)論0 收藏0
  • Docker + Jenkins + webhooks 自動(dòng)部署基礎(chǔ)實(shí)踐

    摘要:自動(dòng)部署基礎(chǔ)實(shí)踐熟悉的基本操作實(shí)現(xiàn)本地后自動(dòng)構(gòu)建部署服務(wù)此實(shí)踐用于優(yōu)化自己在實(shí)際工作中的工作流在本地開發(fā)到服務(wù)器登錄云服務(wù)器或者簡(jiǎn)化流程后本地開發(fā)云服務(wù)器自動(dòng)構(gòu)建部署本實(shí)踐將結(jié)合技術(shù)來實(shí)現(xiàn)云服務(wù)器對(duì)各種環(huán)境的切換與部署。 Docker + Jenkins + webhooks 自動(dòng)部署基礎(chǔ)實(shí)踐 熟悉 jenkins 的基本操作 ?? 實(shí)現(xiàn)本地 git push 后 jenkins 自...

    Charlie_Jade 評(píng)論0 收藏0
  • Kubernetes如何加速UCloud內(nèi)部代碼部署CI/CD流程

    摘要:內(nèi)部長(zhǎng)期使用來管理代碼。審核通過并且成功后,觸發(fā)靜態(tài)測(cè)試單元測(cè)試鏡像構(gòu)建鏡像部署集成測(cè)試等測(cè)試通過后,創(chuàng)建一個(gè)從到的,由負(fù)責(zé)人進(jìn)行審核。從圖中我們可以看到,部分是一個(gè)單元測(cè)試,預(yù)發(fā)布部署,集成測(cè)試,,提交代碼的循環(huán)過程。UCloud內(nèi)部長(zhǎng)期使用 Gitlab 來管理代碼。雖然Gitlab作為一套開源平臺(tái)已很優(yōu)秀,但我們對(duì)于其能為CI/CD提供的敏捷性并不十分滿意,內(nèi)部實(shí)踐中的代碼發(fā)布周期仍需...

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

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

0條評(píng)論

oysun

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<