jenkins上構建的shell腳本
關于腳本第一行的 #!/usr/bin/python 的解釋,相信很多不熟悉 Linux 系統(tǒng)的同學需要普及這個知識,腳本語言的第一行亭畜,只對 Linux/Unix 用戶適用李命,用來指定本腳本用什么解釋器來執(zhí)行译株。
有這句的窥妇,加上執(zhí)行權限后纷纫,可以直接用 ./ 執(zhí)行叁扫,不然會出錯三妈,因為找不到 python 解釋器。
#!/usr/bin/python 是告訴操作系統(tǒng)執(zhí)行這個腳本的時候莫绣,調(diào)用 /usr/bin 下的 python 解釋器畴蒲。
#!/usr/bin/env python 這種用法是為了防止操作系統(tǒng)用戶沒有將 python 裝在默認的 /usr/bin 路徑里。當系統(tǒng)看到這一行的時候对室,首先會到 env 設置里查找 python 的安裝路徑模燥,再調(diào)用對應路徑下的解釋器程序完成操作。
#!/usr/bin/python 相當于寫死了 python 路徑掩宜。
#!/usr/bin/env python 會去環(huán)境設置尋找 python 目錄蔫骂,可以增強代碼的可移植性,推薦這種寫法牺汤。
#!/bin/bash
npm install
VERSION=$(date "+%Y%m%d-%H%M%S")
GIT_SHA_SHORT=`git rev-parse --short=8 ${GIT_COMMIT}`
//docker登錄的賬號名和密碼
docker login -u 66666666 -p 888888888 tencentyun.com
//設置兩個參數(shù)
sh ./deploy/build_docker.sh ${env} jenkins-${env}-${VERSION}-${GIT_SHA_SHORT}
項目中.build_docker.sh文件:
#第一行的內(nèi)容指定了shell腳本解釋器的路徑辽旋,而且這個指定路徑只能放在文件的第一行。第一行寫錯或者不寫時檐迟,系統(tǒng)會有一個默認的解釋器進行解釋补胚。
#!/bin/bash
# 倉庫及鏡像定義
DOCKER_NAME="web" # 需修改
DOCKER_FILE="deploy/Dockerfile"
REPO_DOMAIN="tencentyun.com/product"
# 參數(shù)驗證 $1指的是上邊的第一個參數(shù)${env}
if [ ! -n "$1" ];then //如果$1不存在,就追迟。糖儡。
echo '環(huán)境變量未指定: ./command.sh env';//echo打印
exit;
fi
#環(huán)境變量
APP_ENV=$1
# 鏡像版本 $2指的是第二個參數(shù)jenkins-${env}-${VERSION}-${GIT_SHA_SHORT}
VERSION=$2
if [ ! -n "$2" ];then
VERSION=`date '+%Y%m%d%H%M%S'`
fi
# 打包(需修改) 使用yarn打包 正常流程
yarn
yarn build:$APP_ENV
tar -zcf dist.tar.gz dist
# cd dist
# tar -zcvf mock_web.tgz ./
# 刪除原有本地最新版本鏡像
docker rmi "$DOCKER_NAME:latest"
docker images | grep "$REPO_DOMAIN/$DOCKER_NAME" | awk '{print $3}'| xargs docker rmi
# 生成docker鏡像
docker build -t "$DOCKER_NAME:latest" -f $DOCKER_FILE .
# 打docker鏡像tag
docker tag "$DOCKER_NAME:latest" "$REPO_DOMAIN/$DOCKER_NAME:$VERSION"
# push到騰訊云
docker push "$REPO_DOMAIN/$DOCKER_NAME:$VERSION"
# 刪除原有本地docker none鏡像
# docker images | grep "none" | awk '{print $3}' | xargs docker rm
Nginx
Nginx 是一個高性能的HTTP和反向代理服務器,同時也是一個 IMAP/POP3/SMTP 代理服務器怔匣。
- 靜態(tài)資源服務器
- 動態(tài)匹配
- 反向代理
- Gzip 壓縮
- 負載均衡
項目中的nginx.conf ----Nginx全局的配置文件:(參考:前端想要了解的Nginx)
user nginx;
worker_processes auto; #設置工作進程的數(shù)量
error_log /wdsgbi-web-logs/error.log;
pid /run/nginx.pid;
#處理連接
events {
#設置連接數(shù)
worker_connections 1024;
}
http {
#日志格式握联,定義別名為main
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#制定日志輸入目錄
# access_log /mock-web-logs/access.log main;
sendfile on;#調(diào)用sendfile系統(tǒng)傳輸文件,靜態(tài)文件直接輸出 提高性能
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;#客戶端與服務端連接超時時間每瞒,超時自動斷開
types_hash_max_size 2048;
client_max_body_size 10m;
include /etc/nginx/mime.types;#文件拓展名查找集合
default_type application/octet-stream;#當查找不到對應類型的時候默認值
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
#虛擬主機--搭建靜態(tài)站點
#server配置虛擬主機的相關參數(shù)金闽,可以有多個
server {
listen 80 default_server; # 端口
listen [::]:80 default_server;
server_name _; # 匹配請求中的host值,找到對應的虛擬主機的配置
root /usr/share/nginx/html/dist/; # 查找資源的路徑
location ~* \.(css|js)$ { #開啟gzip靜態(tài)壓縮
gzip_static on;# 如果已經(jīng)通過webpack 或者 rollup 打包出來了gz 文件剿骨, nginx 配置 gzip_static on代芜;開啟代理靜態(tài)gzip文件,就不需要服務器再進行動態(tài)壓縮浓利,節(jié)省服務器資源
}
# nginx 動態(tài)壓縮挤庇,對每個請求先壓縮再輸出。
# nginx 靜態(tài)壓縮贷掖,使用現(xiàn)成的擴展名為 .gz 的預壓縮文件
#location配置請求路由嫡秕,處理相關頁面情況
#路由--監(jiān)聽請求路徑
location ^~ /wdsgbi/ { #以wdsgbi開頭的path使用代理
proxy_pass http://wdsgbi-api:10000/;#代理服務器
}
# 反向代理解決跨域 $http_host、$remote_addr苹威、$scheme 為Nginx內(nèi)置變量昆咽。
#location /api {
# 請求host傳給后端
# proxy_set_header Host $http_host; #proxy_set_header允許重新定義或添加字段傳遞給代理服務器的請求頭
# 請求ip 傳給后端
# proxy_set_header X-Real-IP $remote_addr;
# 請求協(xié)議傳給后端
# proxy_set_header X-Scheme $scheme;
# 路徑重寫 #rewrite 根據(jù)rewrite后的請求URI,將路徑重寫,如:接口路徑為 /user, 我們可以請求 /api/user掷酗。(為什么需要重寫uri调违?因為在使用Nginx做反向代理的時候,需要匹配到跨域的接口再做轉(zhuǎn)發(fā)泻轰,為了方便匹配技肩,會人為的在原接口中添加一段路徑(或標示, 如例子中的api)浮声,因此需要在匹配之后亩鬼、轉(zhuǎn)發(fā)之前把添加的那段去掉,因此需要rewrite阿蝶。)
# rewrite /api/(.*) /$1 break;
# 代理服務器
# proxy_pass http://localhost:9000; //應用服務器HTTP地址
}
location / {
//按順序檢查文件是否存在雳锋,返回第一個找到的文件或文件夾(結尾加斜線表示為文件夾),如果所有的文件或文件夾都找不到羡洁,會進行一個內(nèi)部重定向到最后一個參數(shù)
try_files $uri $uri/ /index.html; //可以用來適配H5 history API玷过,如果 URL 匹配不到任何靜態(tài)資源,則應該返回同一個 index.html 頁面
}
error_page 404 /404.html;
location = /40x.html {
}
# = 表示精確匹配筑煮。只有請求的url路徑與后面的字符串完全相等時辛蚊,才會命中(優(yōu)先級最高)。
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /source/error_page;
}
}
}