前端開發者應該知道的 Centos-Docker-Nginx-Node-Jenkins 操作

# 拷貝D盤https目錄下的所有文件到 遠程的 /data 目錄
scp D:/https/* root@47.93.242.155:/data

複製代碼

本地鏈接遠程 Centos 服務器

ssh -p 端口 用戶名@服務器IP

例子:

ssh -p  22  root@47.93.242.155

# 輸入登錄密碼

# 成功

複製代碼

yum 切換爲阿里源

cd /etc/yum.repos.d/

curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo

# 重新生成緩存--查看執行結果,如果有aliyun 字樣就算成功
yum makecache

複製代碼

其他

# 創建 /data/test 目錄
mkdir /data/test

# 創建 /data/newtest 目錄
mkdir /data/newtest

# 創建 /data/test/index.html 文件
touch /data/test/index.html

# 編輯文件
vi /data/test/index.html

# 查看文件內容
cat /data/www/index.html

# 將 `test`目錄下的所有文件複製到 `newtest`目錄 下
cp –r /data/test/*  /data/newtest

# 刪除 /data/newtest/index.html 文件
rm -rf /data/newtest/index.html

# 將 `test`目錄下的所有文件移動到新目錄 `newtest`目錄 下
mv /data/test/*  /data/newtest


複製代碼
# 查看當前目錄的路徑
pwd

複製代碼
# 檢查端口被哪個進程佔用
netstat -lnp|grep 88   #88請換爲你需要的端口,如:80

複製代碼

執行netstat -lnp|grep 端口號之後會打印出被佔用的進程及其編號

# 殺掉編號爲1777的進程(請根據實際情況輸入)
kill -9 1777

複製代碼

查看當前 Centos 操作系統發行版信息

cat /etc/redhat-release

複製代碼

Nginx 服務器搭建

Nginx 是一個高性能的 HTTP 和反向代理 web 服務器,使用 nginx 網站有:百度、京東、新浪、網易、騰訊、淘寶...。

Centos 下安裝 Nginx 服務器

這裏我們使用 yum 安裝 Nginx 服務器。

yum install -y nginx

複製代碼

啓動 Nginx 服務器

安裝後的 Nginx 沒有啓動,先啓動 Nginx 服務器。

nginx

複製代碼

此時,訪問 http://<您的域名或IP> 可以看到 Nginx 的測試頁面

如果無法訪問,請重試用 nginx -s reload 命令重啓 Nginx

配置靜態服務器訪問路徑

外網用戶訪問服務器的 Web 服務由 Nginx 提供,Nginx 需要配置靜態資源的路徑信息才能通過 url 正確訪問到服務器上的靜態資源。

打開 Nginx 的默認配置文件 /etc/nginx/nginx.conf ,修改 Nginx 配置

vi /etc/nginx/nginx.conf

複製代碼

將默認的 /usr/share/nginx/html; 修改爲: /data/www;,如下:

示例代碼:/etc/nginx/nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

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

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        # 修改爲以下路徑
        root         /data/www;

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

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

複製代碼

配置文件將 /data/www/static 作爲所有靜態資源請求的根路徑,如訪問: http://<您的域名或IP>/static/index.js,將會去 /data/www/static/ 目錄下去查找 index.js/index.html。現在我們需要重啓 Nginx 讓新的配置生效,如:

nginx -s reload

複製代碼

創建第一個靜態文件

現在讓我們新建一個靜態文件,查看服務是否運行正常。

首先讓我們在 /data 目錄 下創建 www 目錄,如:

mkdir -p /data/www

複製代碼

/data/www 目錄下創建我們的第一個靜態文件 index.html

touch /data/www/index.html

vi /data/www/index.html

複製代碼

示例代碼:/data/www/index.html

<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <title>第一個靜態文件</title>
  </head>
  <body>
    <h1>Hello world!</h1>
  </body>
</html>

複製代碼

現在訪問 http://<您的域名或IP>/index.html 應該可以看到頁面輸出 Hello world!

到此,一個基於 Nginx 的靜態服務器就搭建完成了,現在所有放在 /data/www 目錄下的的靜態資源都可以直接通過域名 / IP 訪問。

如果無顯示,請刷新瀏覽器頁面

Nginx 配置 SSL 泛域名證書

這裏使用的是阿里雲的免費證書,期限爲 1 年

購買成功後進入ssl證書控制檯 下載證書

下載申請好的 ssl 證書文件壓縮包到本地並解壓放到自己喜歡的目錄, 如D:/https/。(這裏是用的 pem 與 key 文件,文件名可以更改)。

在連接服務器的窗口中創建 /data/cert 目錄用來存放證書文件

mkdir /data/cert

複製代碼

使用 scp 命令上傳文件到遠程服務器 (這裏需要新開一個終端,不要使用連接服務器的窗口):

scp D:/https/* root@47.93.242.155:/data/cert

複製代碼

上面的意思是拷貝D:/https/目錄下的所有文件到遠程服務器的 /data/cert目錄中

開啓 443 監聽

Nginx 啓動後默認只監聽 80 端口。

這裏我們把 443 端口的監聽也一併開啓。

編輯全局配置文件

vi /etc/nginx/nginx.conf

複製代碼

示例代碼:/etc/nginx/nginx.conf, 說明都在註釋中

# For more information on configuration, see:
#   * Official English Documentation: http://nginx.org/en/docs/
#   * Official Russian Documentation: http://nginx.org/ru/docs/

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

# Load dynamic modules. See /usr/share/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    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  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    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;

    server {
        listen       80;
        # 修改域名
        server_name  nsuedu.cn;

        # 如果是HTTP請求則重定向到HTTPS
        rewrite ^(.*) https://$host$1 permanent;
    }

# Settings for a TLS enabled server.

    server {
         # 服務器端口使用443,開啓ssl
        listen       443 ssl http2 default_server;
        listen       [::]:443 ssl http2 default_server;

        # 輸入你的域名
        server_name  nsuedu.cn;

        # 修改靜態文件的路徑
        root         /data/www;

        # ssl證書配置

        # 修改證書路徑一
        ssl_certificate "/data/cert/4726867_www.nsuedu.cn.pem";
        # 修改證書路徑二
        ssl_certificate_key "/data/cert/4726867_www.nsuedu.cn.key";

        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout  10m;  #緩存有效期
        ssl_ciphers HIGH:!aNULL:!MD5;  #加密算法
        ssl_prefer_server_ciphers on;  #使用服務器端的首選算法

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }

}

複製代碼

重啓 nginx

nginx -s reload

複製代碼

在瀏覽器中訪問http://nsuedu.cn/

配置 Nginx 反向代理

客戶端對代理服務器是無感知的,客戶端不需要做任何配置,用戶只請求反向代理服務器,反向代理服務器選擇目標服務器,獲取數據後再返回給客戶端。

反向代理服務器和目標服務器對外而言就是一個服務器,只是暴露的是代理服務器地址,而隱藏了真實服務器的 IP 地址。

參考從原理到實戰,徹底搞懂 Nginx!

訪問路徑:/api/getUser

  1. 當 nginx 配置文件 proxy_passurl 末尾 帶/:
server {
        listen       80;
        server_name  www.123.com;

        location /api/ {
        proxy_pass http://127.0.0.1:18081/;
        }
    }

複製代碼

代理到後端的路徑爲:http://127.0.0.1:18081/getUser,省略了匹配到的/api/路徑;

  1. 當 nginx 配置文件 proxy_passurl 末尾 不帶/
server {
        listen       80;
        server_name  www.123.com;

        location /api/ {
        proxy_pass http://127.0.0.1:18081;
        }
    }

複製代碼

代理到後端的路徑爲:http://127.0.0.1:18081/api/getUser,連同匹配到的/api/路徑,一起進行反向代理;

Centos 下搭建 Node.js 環境

Node.js 是運行在服務端的 JavaScript, 是基於 Chrome JavaScript V8 引擎建立的平臺。

安裝 Node.js 的幾種方式

  1. 方法一:從EPEL庫安裝Node.js--yum install nodejs不足: 安裝的node/npm版本較低, 需要手動切換版本
  2. 方法二: 使用官方編譯過的二進制數據包安裝, 不足: 安裝步驟繁雜
  3. 方法三: 通過NVM安裝, 方便快捷不足: 安裝時國外的網不好 🥶
  4. 方法四: 源碼下載後編譯安裝, 版本是最新的

yum install nodejs 方式安裝

查看當前系統自帶了哪些nodejs的版本

sudo dnf module list nodejs

複製代碼

可以看到有三個版本的 Node:10,12,14. 在版本 10 上有個[d]符號, 它代表系統將會默認安裝的版本。如果你想要切換默認安裝的版本,可以執行下面的命令

sudo dnf module enable nodejs:14

複製代碼

安裝 Node

sudo dnf install nodejs

複製代碼

查看 node 版本,可以發現是Node14的版本

node --v

複製代碼

NVM 方式安裝

我們可能同時在進行 2 個項目,而 2 個不同的項目所使用的 node 版本又是不一樣的,對於維護多個版本的node將會是一件非常麻煩的事情,而nvm就是爲解決這個問題而產生的,它可以方便的在同一臺設備上進行多個node版本之間切換

注: 使用此方式,在後面的 Jenkins 腳本使用 npm/yarn 會提示找不到命令,我也不知道咋解決,求大佬科普 🤪

下面是 (2021/04) 的最新穩定版: 可以在去 NVM 官網看一下,替換成最新的鏈接

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | cp

複製代碼

還需要運行下面的命令,以確認上一條命令的更改結果

source ~/.bash_profile

複製代碼

查看 Node 版本列表

nvm list-remote

複製代碼

安裝一個長期支持的版本

nvm install 14.16.1

複製代碼

確認是否安裝成功

nvm current

node -v

npm -v

複製代碼

通過 環境變量echo $PATH 查看安裝的位置

echo $PATH

# 打印出的結果中,需要取出 `/root/.nvm/versions/node/v14.16.1/bin`

複製代碼

使用官方編譯過的二進制數據包的方式安裝

注: 使用此方式,在後面的 Jenkins 腳本使用 npm/yarn 能夠正常運行

下面是 (2021/04) 的最新穩定版: 可以在去 Node.js 官網看一下,替換成最新的鏈接

下載 14.16.0/data 目錄

cd /data

wget https://nodejs.org/dist/v14.16.0/node-v14.16.0-linux-x64.tar.xz

複製代碼

下載完成後, 將其解壓

tar xvJf node-v14.16.0-linux-x64.tar.xz

複製代碼

將解壓的 Node.js 目錄移動到 /usr/local 目錄下

mv node-v14.16.0-linux-x64 /usr/local/node-v14

複製代碼

配置 node 軟鏈接到 /bin 目錄

ln -s /usr/local/node-v14/bin/node /bin/node

複製代碼

配置和使用 npm

npmNode.js 的包管理和分發工具。它可以讓 Node.js 開發者能夠更加輕鬆的共享代碼和共用代碼片段

下載 node 的壓縮包中已經包含了 npm , 我們只需要將其軟鏈接到 bin 目錄下即可

ln -s /usr/local/node-v14/bin/npm /bin/npm

複製代碼

配置環境變量

/usr/local/node-v14/bin 目錄添加到 $PATH 環境變量中可以方便地使用通過 npm 全局安裝的第三方工具

echo 'export PATH=/usr/local/node-v14/bin:$PATH' >> /etc/profile

複製代碼

使環境變量生效

source /etc/profile

複製代碼

使用 npm

通過 npm 配置淘寶源

npm config set registry https://registry.npm.taobao.org

npm get registry

複製代碼

全局安裝yarn並配置淘寶源

npm install yarn -g

yarn config set registry http://registry.npm.taobao.org/

yarn config get registry

複製代碼

在 Centos 上安裝 Docker

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然後發佈到任何流行的 Linux 或 Windows 機器上

Docker 與虛擬機的區別

安裝與配置 Docker

在開始安裝之前,需要安裝 device-mapper-persistent-datalvm2 兩個依賴。

yum install -y yum-utils device-mapper-persistent-data lvm2

複製代碼

依賴安裝完畢後,我們將阿里雲的 Docker 鏡像源添加進去。可以加速 Docker 的安裝。

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

複製代碼
yum install docker-ce -y

複製代碼

安裝完畢,我們就可以使用 systemctl 啓動來啓動 Docker 了。systemctlLinux的進程管理服務命令,他可以幫助我們啓動 docker

systemctl start docker

systemctl enable docker

複製代碼

接着執行一下 docker -v,這條命令可以用來查看 Docker 安裝的版本信息。當然也可以幫助我們查看 docker 安裝狀態。如果正常展示版本信息,代表 Docker 已經安裝成功。

docker -v

複製代碼

設置開機啓動

chkconfig docker on

複製代碼

其他

顯示所有容器

docker ps

複製代碼

顯示本地鏡像列表

docker images

複製代碼

刪除本地一個或多個鏡像

docker rmi imageID

複製代碼

容器的啓動 / 關閉 / 重啓

docker stop containerID

docker start containerID

docker restart  containerID

複製代碼

刪除一個或多個容器

docker rm containerID

複製代碼

配置阿里雲鏡像源

Docker 安裝完畢後,之後我們去拉取 docker 鏡像時,一般默認會去 docker 官方源拉取鏡像。但是國內出海網速實在是太慢,所以選擇我們更換爲阿里雲鏡像倉庫源進行鏡像下載加速。

登錄阿里雲官網,打開 阿里雲容器鏡像服務。點擊左側菜單最下面的鏡像加速器 ,選擇 CentOS (如下圖)。按照官網的提示執行命令,即可更換 docker 鏡像源地址。

Docker 內配置 Nginx 方式一 (推薦)

參考 Nginx 容器教程

docker container run -d -p 4030:80 --rm --name mynginx nginx

複製代碼

上面命令的各個參數含義如下。

如果沒有報錯,就可以打開瀏覽器訪問 IP:4030 了。正常情況下,顯示 Nginx 的歡迎頁。

然後,把這個容器終止,由於--rm參數的作用,容器文件會自動刪除。

docker container stop mynginx

複製代碼

Docker 內配置 Nginx 方式二

下載一個官方的 Nginx 鏡像到本地

docker pull nginx

複製代碼

下載好的鏡像就會出現在鏡像列表裏

docker images

複製代碼

運行容器

docker run --name=nginx -d -p 4030:80 nginx

複製代碼

上面命令的解釋如下:

  1. --name:設置容器的名稱;
  2. -d:表示在後臺運行容器;
  3. -p:指定端口映射。4030是宿主機的端口,80是 Nginx 容器內部的端口;
  4. 末尾的nginx:表示根據 nginx 鏡像運行容器。

如圖所示

然後在瀏覽器裏面訪問 http://47.93.242.155:4030/

給 Docker 內的 Nginx 配置反向代理

要修改 Nginx 的配置文件,首先需要進入 Nginx 容器裏面,使用下面的命令進入容器裏面

docker exec -it nginx /bin/bash

複製代碼

上面命令的解釋說明:

我們使用ls查看一下文件結構,發現裏面其實就是一個 Linux 操作系統。

再查看一下詳細的操作系統發行版信息

cat /etc/issue

複製代碼

可以發現是一個Debian系統

Debian系統

順便介紹一些 Debian系統的基本操作

# 首先需要更新一下
apt-get update

# 安裝vim
apt-get install vim

複製代碼

修改爲清華源鏡像

參考 Debian 鏡像使用幫助

如果遇到無法拉取 https 源的情況,請先使用 http 源並安裝:

sudo apt install apt-transport-https ca-certificates

複製代碼

查看 Debian 版本, 以便選擇對應的鏡像源

Debian 版本簡介:

查看版本當前操作系統發行版信息。這個命令就可以清楚的知道到底是 RedHat 的、還是別的發行版,還有具體的版本號,比如 3.4 還是 5.4 等等

cat /etc/os-release

複製代碼

修改鏡像文件

vi /etc/apt/sources.list

複製代碼

修改內容如下

# 默認註釋了源碼鏡像以提高 apt update 速度,如有需要可自行取消註釋
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
# deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free

複製代碼

Nginx 默認會安裝在 etc 目錄下面, 查看 Nginx 的配置文件的內容

cat /etc/nginx/nginx.conf

複製代碼

我們看最後紅框裏面的內容,表示使用的是/etc/nginx/conf.d/default.conf文件進行配置。

那麼我們編輯/etc/nginx/conf.d/default.conf文件即可。

vi /etc/nginx/conf.d/default.conf

複製代碼

配置方式與前文的 nginx 配置一樣,不過我們需要把必要的文件 (靜態文件, SSL 證書) 傳遞給 Docker 容器

創建存放資源的目錄

mkdir /data/cert

mkdir /data/www

複製代碼

退出 docker 容器,到服務器界面

exit

複製代碼

查看所有的容器信息,能獲取容器的 id, 如下圖

docker ps -a

複製代碼

在服務器終端把資源文件傳遞給 docker下的nginx容器

docker cp /data/cert 6ba3901beac9:/data/cert

複製代碼

保存容器

然後執行如下命令,保存鏡像:

docker commit -m="備註" 你的CONTAINER_ID 你的IMAGE

複製代碼

請自行將 -m 後面的信息改成自己的容器的信息

大功告成!

恭喜你結束了 Docker 的教程並學會了 Docker 的一些基本操作

Centos 下安裝 Jenkins

Jenkins 是一個基於 Java 語言開發的持續構建工具平臺,主要用於持續、自動的構建 / 測試你的軟件和項目。它可以執行你預先設定好的設置和構建腳本,也可以和 Git 代碼庫做集成,實現自動觸發和定時觸發構建。

這部分內容大多內容是對從 0 到 1 實現一套 CI/CD 流程 掘金小冊的搬運,更詳細的內容可以學習這本小冊

安裝 OpenJDK

因爲 JenkinsJava 編寫的持續構建平臺,所以安裝 Java 必不可少。

在這裏,我們選擇安裝開源的 openjdk 。在這我們直接使用 yum 包管理器安裝 openjdk 即可。

yum install -y java

複製代碼

使用國內鏡像加速安裝 Jenkins

官方教程 安裝速度太慢。因此我們選擇國內鏡像安裝

下面是 (2021/04) 的 jenkins LTS 版本: 可以在去 清華大學鏡像站 看一下,替換成最新的鏈接

下載 Jenkins/data 目錄

cd  /data

wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.2-1.1.noarch.rpm

sudo yum install jenkins-2.277.2-1.1.noarch.rpm

複製代碼

啓動 Jenkins

Jenkins 安裝後,會將啓動命令註冊到系統 Service 命令中。所以我們直接使用系統 service 命令啓動 Jenkins 即可。

在這裏,有三個命令可以使用,分別對應 啓動 / 重啓 / 停止 三個命令。

在這裏,我們直接調用 service jenkins start 啓動 Jenkins 即可

service jenkins start
# service jenkins restart restart 重啓 Jenkins
# service jenkins restart stop 停止 Jenkins

複製代碼

服務啓動後,訪問 IP:8080 。如果能夠看到以下界面,代表正在啓動。 Jenkins 第一次的啓動時間一般比較長(視服務器性能而看)

初始化 Jenkins 配置

解鎖 Jenkins

Jenkins 啓動完成後,會自動跳轉至這個界面(下方二圖)。這是 Jenkins 的解鎖界面,你需要輸入存放在服務器的初始解鎖密碼才能進行下一步操作。

Jenkins 啓動後,會生成一個初始密碼。該密碼在服務器的文件內存放,我們可以進入服務器查看密碼內容,將密碼填寫在 Jenkins 的管理員密碼輸入框內:

cat /var/lib/jenkins/secrets/initialAdminPassword

複製代碼

點擊 繼續 按鈕,解鎖 Jenkins。

下載插件

解鎖後就來到了插件下載頁面,這一步要下載一些 Jenkins 的功能插件。

因爲 Jenkins 插件服務器在國外,所以速度不太理想。我們需要更換爲清華大學的 Jenkins 插件源後,再安裝插件,所以先不要點安裝插件。

更換方法很簡單。進入服務器,將 /var/lib/jenkins/updates/default.json 內的插件源地址替換成清華大學的源地址,將 google 替換爲 baidu 即可。

sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json

複製代碼

接着點擊 安裝推薦的插件 即可。稍等一會插件安裝完畢

完成安裝

插件安裝完畢後,接着是註冊管理員賬號。

按照提示一路配置後,直到看到以下界面代表安裝成功

測試安裝

到這裏,我們的 Jenkins 算是啓動成功了。但是,我們還需要對 Jenkins 做一點點簡單的配置,纔可以讓它可以構建 docker 鏡像。

我們點擊 Jenkins 首頁 -> 左側導航 -> 新建任務 -> Freestyle project(構建一個自由風格的軟件項目)

新建完畢後,找到 構建 一項,選擇 增加構建步驟,選擇 執行 shell ,輸入以下命令

docker -v
docker pull node:latest

複製代碼

該命令會去拉取一個 nodejs 穩定版的鏡像,我們可以來測試 Docker 的可用性

保存後,我們點擊左側菜單的立即構建, Jenkins 就會開始構建。選擇左側歷史記錄第一項(最新的一項),點擊控制檯輸出,查看構建日誌。

執行後,我們發現提示無訪問權限。這又是什麼情況呢?這裏就不得不提到 Linux 下的 Unix Socket 權限問題了

Linux 中, Unix socket 屬於 root 用戶,因此需要 root 權限才能訪問

但是在 docker 中, docker 提供了一個 用戶組 的概念。我們可以將執行 Shell 的用戶添加到名稱爲 docker 的用戶組,則可以正常執行 docker 命令。

而在 Jenkins 中執行的終端用戶做 jenkins ,所以我們只需要將 jenkins 加入到 docker 用戶組即可:

sudo groupadd docker          #新增docker用戶組
sudo gpasswd -a jenkins docker  #將當前用戶添加至docker用戶組
newgrp docker                 #更新docker用戶組

複製代碼

加入後,重啓 Jenkins

sudo service jenkins restart

複製代碼

重啓 Jenkins 後,再次執行腳本。此時執行成功:

回過頭來查看 docker 鏡像

docker images

複製代碼

會發現多了一個dockernode鏡像, 這就是我們通過Jenkins 自動安裝的

進入此docker鏡像

docker run -it node /bin/bash

複製代碼

做一些配置 (如何做參考前文的說明)

npm config set registry https://registry.npm.taobao.org

npm get registry
# 可能提示已安裝,就不用再安裝了
npm install yarn -g

yarn config set registry http://registry.npm.taobao.org/

yarn config get registry

exit

複製代碼

使用 SSH 協議集成 Git 倉庫源

這一步,我們使用 Jenkins 集成外部 Git 倉庫,實現對真實代碼的拉取和構建。在這裏,我們選用 Gitee(Github 太慢了 🤧) 作爲我們的代碼源。 這裏準備一個 UmiJS 項目來演示構建。

生成公鑰私鑰

首先,我們先來配置公鑰和私鑰。這是 Jenkins 訪問 Git 私有庫的常用認證方式。我們可以使用 ssh-keygen 命令即可生成公鑰私鑰。在本地機器執行生成即可。這裏的郵箱可以換成你自己的郵箱:

ssh-keygen -t rsa -C "642178633@qq.com"

複製代碼

執行後,會遇到第一步驟: Enter file in which to save the key

這一步是詢問你要將公鑰私鑰文件放在哪裏。默認是放在 ~/.ssh/id_rsa 下,當然也可以選擇輸入你自己的路徑。一路回車即可。

結束後,你會得到兩個文件。分別是 id_rsaid_rsa.pub

其中,id_rsa 是私鑰文件,id_rsa.pub 是對應的公鑰文件。

我們需要在 Git 端配置公鑰,在 Jenkins 端使用私鑰與 Git 進行身份校驗。

在 Gitee 配置公鑰

Gitee 中,如果你要配置公鑰有 2 種方式:倉庫公鑰 和 個人公鑰。其中,如果配置了倉庫公鑰,則該公鑰只能對配置的倉庫進行訪問。如果配置了個人公鑰,則賬號下所有私有倉庫都可以訪問。

這裏我們就以配置個人公鑰爲例子。首先打開右上角的設置 ,點擊下面的 設置 => SSH 公鑰

在下方有個添加公鑰,填入信息即可。

其中的標題爲公鑰標題,這裏可以自定義標題;公鑰則爲剛纔生成的 id_rsa.pub 文件。使用 cat 命令查看下文件內容,將內容填入輸入框並保存。接着去 Jenkins 端配置私鑰

cat ~/.ssh/id_rsa.pub

複製代碼

在 Jenkins 配置私鑰

回到 Jenkins。在 Jenkins 中,私鑰 / 密碼 等認證信息都是以 憑證 的方式管理的,所以可以做到全局都通用。 我們可以在配置任務時,來添加一個自己的憑證。點擊項目的 配置,依次找到 源碼管理 => Git => Repositories

這裏的 Repository URL 則是我們的倉庫地址, SSH 地址格式爲 git@gitee.com:xxx/xxx.git 。可以從倉庫首頁中的 克隆/下載 => SSH 中看到

重點是 Credentials 這一項,這裏則是我們選擇認證憑證的地方。我們可以點擊右側 添加 => Jenkins 按鈕添加一條新的憑證認證信息。

點擊後會打開一個彈窗,這是 Jenkins 添加憑證的彈窗。選擇類型中的 SSH Username with private key 這一項。接着填寫信息即可:

在命令行窗口,查看私鑰文件內容,並複製它

cat ~/.ssh/id_rsa

複製代碼

點擊 Add 按鈕,將 xxx 私鑰文件內所有文件內容全部複製過去(包含開頭的 BEGIN OPENSSH PRIVATE KEY 和結尾的 END OPENSSH PRIVATE KEY)

接着點擊添加按鈕,保存憑證。

保存後,在 Credentials 下拉列表中選擇你添加的憑證。

如果沒有出現紅色無權限提示,則代表身份校驗成功,可以正常訪問。

如果出現下圖的問題,則說明服務器上沒有安裝 Git

安裝結束後,刷新界面就正常了

yum -y install git

複製代碼

構建鏡像

在我們將環境準備就緒後,就可以開始構建鏡像了。不過,我們需要先準備個 DockerFile 纔可以構建鏡像。那什麼是 DockerFile 呢?

編寫 Dockerfile

什麼是 Dockerfile

Dockerfile 是一個 Docker 鏡像的基礎描述文件,裏面描述了生成一個鏡像所需要的執行步驟。我們也可以自定義一份 Dockerfile 來創建一個自己的鏡像。

例如下面的步驟,使用 Dockerfile 可描述爲:

  1. 基於 nginx:1.15 鏡像做底座。
  2. 拷貝本地 html 文件夾內的文件,到鏡像內 /etc/nginx/html 文件夾。
  3. 拷貝本地 conf 文件夾內的文件,到鏡像內 /etc/nginx/ 文件夾。
FROM nginx:1.15-alpine
COPY html /etc/nginx/html
COPY conf /etc/nginx/
WORKDIR /etc/nginx/html

複製代碼

編寫完成後,怎麼生成鏡像呢?我們只需要使用 docker build 命令就可以構建一個鏡像了:

docker build -t imagename:version .

複製代碼

-t: 聲明要打一個鏡像的 Tag 標籤,緊跟着的後面就是標籤。

標籤格式爲 鏡像名:版本 . :聲明要尋找dockerfile文件的路徑. .代表當前路徑下尋找。默認文件名爲 Dockerfile

關於更多 DockerFile 的語法,詳細可以看這裏

因爲我們的鏡像只包含一個 nginx,所以 dockerfile 內容比較簡單。我們只需要在代碼根目錄下新建一個名爲 Dockerfile 的文件,輸入以下內容,並將其提交到代碼庫即可。

vi Dockerfile
FROM nginx:1.15-alpine
COPY html /etc/nginx/html
COPY conf /etc/nginx/
WORKDIR /etc/nginx/html

複製代碼
git add ./Dockerfile
git commit -m "chore: add dockerfile"
git push

複製代碼

Jenkins 端配置

在代碼源和 DockerFile 準備就緒後。在服務器的/data目錄下新建一個jenkins-shll.sh 腳本文件

touch /data/jenkins-shll.sh

vi /data/jenkins-shll.sh

複製代碼

並加入如下內容

#!/bin/sh -l

yarn
yarn run build
docker build -t jenkins-test .

複製代碼

這裏腳本很簡單,主要是作用是安裝依賴 => 構建文件 => 構建鏡像

#!/bin/sh -l的作用是:

如果在服務器中的shell命令可以執行,但到了jenkins中卻無法執行,這是因爲jenkins沒有加載服務器中的全局變量/etc/profile導致的

最後只需在 Jenkins 端配置下要執行的 Shell 腳本即可。找到項目的配置,依次找到構建 => Execute shell。輸入以下腳本:

sh /data/jenkins-shll.sh

複製代碼

手動執行任務

保存後我們去手動觸發執行下任務。當未拋出錯誤時,代表任務執行成功

回過頭來查看 docker

docker images

複製代碼

可以發現,又多了一個名叫jenkins-test 的 docker 鏡像

自動執行任務

安裝插件

安裝 Generic Webhook Trigger Plugin 插件(系統管理-插件管理-可用插件- 搜索 Generic Webhook

選中並點擊Install without restart

如果可選插件列表爲空,點擊高級標籤頁,替換升級站點的 URL 爲:http://mirror.xmission.com/jenkins/updates/update-center.json並且點擊提交和立即獲取。

添加觸發器

Generic Webhook Trigger Plugin 插件功能很強大,可以根據不同的觸發參數觸發不同的構建操作,比如我向遠程倉庫提交的是 master 分支的代碼,就執行代碼部署工作,我向遠程倉庫提交的是某個 feature分支,就執行單元測試,單元測試通過後合併至 dev 分支。

靈活性很高,可以自定義配置適合自己公司的方案,這裏方便演示我們不做任何條件判斷,只要有push就觸發。

在任務配置 ->觸發構建起-> 裏勾選 Generic Webhook Trigger ,然後保存即可

Git 倉庫配置鉤子

此處以碼云爲例,github 的配置基本一致,進入碼雲項目主頁後,點擊管理-webhooks-添加,會跳出一個這樣的框來。

上圖中的 URL 格式爲 http://<User ID>:<API Token>@<Jenkins IP 地址>:端口/generic-webhook-trigger/invoke

下面的幾個選項是你在倉庫執行什麼操作的時候觸發鉤子,這裏默認用 push

進入 jenkin 的系統管理->管理用戶 界面, 可以看到一個用戶列表。在此列表中就找到User ID.

接下來點擊工具圖標 進入詳情界面後找到API Token->添加新Token->生成-> 找個你喜歡的地方將此 token 保存好

Jenkins IP 地址和端口是你部署 jenkins 服務器的 ip 地址,端口號沒改過的話就是 8080

密碼就是你登錄 jenkins 的密碼

點擊提交完成配置。我們還需要測試一下鉤子是否生效

點擊測試,如果配置是成功的,你的 Jenkins 左側欄構建執行狀態裏將會出現一個任務。

實現郵件提醒 - todo

批量刪除構建歷史

進入系統配置->腳本命令運行

輸入腳本

# "test"是項目名稱,100是指(0~·100)全刪除,就是構建歷史前面的ID
def jobName = "test"

def maxNumber = 100

Jenkins.instance.getItemByFullName(jobName).builds.findAll {it.number <= maxNumber}.each { it.delete() }


複製代碼

點擊運行

最後

在日常工作中你還使用哪些Centos配置呢?歡迎在評論區留下的你的見解!

覺得有收穫的朋友歡迎點贊,關注一波!

往期好文

  1. 2021 年前端開發者需要知道的 JS/React 規範
  2. 你有一份 ECMAScript 特性速查表, 請查收
  3. 作爲前端,你應該瞭解的分辨率 / 邏輯像素 / 物理像素 / retina 屏知識 🧐

參考文檔

  1. How To Install Node.js on CentOS 8
  2. How to Set Up SSH Keys on CentOS 8
  3. How to configure build tools (Gradle, Yarn) in Jenkins and use them in Jenkinsfile 🛠
  4. 搭建 Docker 環境
  5. 搭建 Nginx 靜態網站
  6. 搭建 Node.js 環境
  7. 實戰筆記:Jenkins 打造強大的前端自動化工作流
  8. 從 0 到 1 實現一套 CI/CD 流程
  9. CentOS8 安裝 MySQL8
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://juejin.cn/post/6951684431597797389