1. 程式人生 > >gitlab-ci實現前端自動化部署(步驟全面)

gitlab-ci實現前端自動化部署(步驟全面)

   近些年前端發展迅速,前後分離已經是一個大趨勢。隨著前端專案的愈加龐大,其自動化也極其重要的一環。不僅僅是通過webpack實現的自動化構建,當專案提交的時候,同時也要實現其自動化的部署、釋出工作。

   接下來我就講一講通過gitlab-ci實現前端自動化部署的各個環節的配置。

期望的效果

    在我們本地向origin提交程式碼的時候,git倉庫可以監聽到這一次提交,並自動將這份push的程式碼clone到伺服器上、執行相關依賴的安裝、打包、檔案拷貝等操作。實現:提交程式碼後,自動將程式碼拷貝、釋出到伺服器上。

將要使用的工具

gitlab-ci

持續整合:是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,整合每天可能會發生若干次。每次整合都通過自動化的構建(包括編譯,釋出,自動化測試)來驗證,從而儘早地發現整合錯誤。

gitlab-ci 即 gitlab提供的持續整合的功能。

webhooks

webhooks可以監聽gitlab上執行的很多操作,可以在gitlab的setting->integrations中設定。如圖,這裡選中了Push events,可以監聽到程式碼push到gitlab的事件。

gitlab-runner

    gitlab-runner即專案自動化的執行者(驅動),它可以執行一個 .gitlab-ci.yml(YAML檔案)的檔案,這個 .gitlab-ci.yml 檔案又指定了webhooks監聽到事件後要執行的操作、指令碼,由指令碼再執行進一步的操作,從而實現自動化。

    .gitlab-ci.yml

具體的語法可以參考-官方文件

    其.gitlab-ci.yml 檔案的格式大致如下:

配置流程

1.開啟webhook的trigger,使其可以監聽push事件

2.部署伺服器環境

    我這邊採用的是linux系統的伺服器,先把後續操作可能用到的軟體和包都提前安裝好,這樣跑指令碼的時候才會順利進行。

3.下載git並配置ssh key公鑰

使用yum下載git:

yum -y install git 

配置ssh key公鑰

    配置ssh公鑰是為了在伺服器自動獲取gitlab上的程式碼時,可以免輸入密碼,用https的方式clone的話要手動輸入賬號密碼,這樣實現不了想要的自動化效果。

檢視有無.ssh檔案:

ls -al ~/.ssh

執行以下命令:

  cd ~/.ssh/    (如果沒有對應的資料夾,則執行  mkdir  ./.ssh)
  git config --global user.name "san.zhang"
  git config --global user.email "[email protected]"
  ssh-keygen -t rsa -C "[email protected]"

三次回車之後,會在 root/.ssh 目錄下生成 id_rsa  、 id_rsa.pub 兩個檔案

用 cat id_rsa.pub 指令檢視該檔案 並複製出檔案中的ssh公鑰,貼上到gitlab的SSH Keys 中,新增此公鑰,即可完成配置。

新增完成之後,我們直接在linux伺服器上直接使用git clone  [SSH url] 指令,來測試剛剛配置的ssh公鑰是否有效。

若出現類似錯誤:

    The authenticity of host 'gitlab.xxx.net (192.168.1.41)' can't be established.

解決方法:

1)使用ssh連線遠端主機時加上“-o StrictHostKeyChecking=no”的選項,如下:

 ssh  -o StrictHostKeyChecking=no  192.168.xxx.xxx     // 這裡寫的是本機地址

2)一個徹底去掉這個提示的方法是,修改/etc/ssh/ssh_config檔案(或$HOME/.ssh/config)中的配置,新增如下兩行配置:

StrictHostKeyChecking no
UserKnownHostsFile /dev/null

4.安裝node.js(當前最新8.12.0)和yarn

首先下載node.js我們要藉助wget,它是Linux系統下載檔案的工具,具有非常強的穩定性

yum -y install wget

使用wget安裝node.js

// 下載
wget https://nodejs.org/dist/v8.12.0/node-v8.12.0-linux-x64.tar.gz

// 解壓
tar -zxvf node-v8.12.0-linux-x64.tar.gz

// 全域性配置:(設定軟連結)

// 注意:這裡的 /home/node/ 是node解壓出來的檔案所在的路徑。

ln -s /home/node/node-v8.12.0-linux-x64/bin/npm /usr/local/bin/npm

ln -s /home/node/node-v8.12.0-linux-x64/bin/node /usr/local/bin/node

(若建立了軟連線後發現npm和node指令都無法使用,可嘗試先用sudo chmod -R 777修改node資料夾許可權)

安裝yarn ,其目的是 能快速穩定地安裝專案依賴——node_modules

// 通過 RPM 包倉庫安裝 Yarn
curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
sudo yum install yarn

// yarn -v 檢視yarn版本

注意:yarn的官方文件其中有一步是這樣描述的:

如果你沒有安裝 Node.js,你也應該配置 NodeSource 倉庫

curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -

    這裡已經安裝了node的話,就不要執行此操作了,否則可能會修改gitlab-runner使用的node版本。

    如果發現gitlab-runner自動釋出時執行的node指令碼的版本和在伺服器上通過node -v看到的不一樣,可能就是該原因導致的,這時可以通過指定node執行的環境變數來修改。

    若通過 sudo yum install yarn 安裝yarn報以下錯:

    

    可以執行以下步驟來解決:

sudo yum install epel-release
sudo yum install nodejs
sudo yum install yarn

5.安裝Gitlab Runner

-- 移除舊版本倉庫:

sudo rm /etc/yum.repos.d/runner_gitlab-ci-multi-runner.repo

-- 新增 GitLab's 官方倉庫:

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

-- 下載最新版 GitLab Runner:

sudo yum install gitlab-runner

-- 安裝 GitLab Runner 的特定版本:

yum list gitlab-runner --showduplicates | sort -r sudo yum install gitlab-runner-10.0.0-1

   gitlab-runner執行的過程中,報錯ERROR: preparation failed時,可能就是gitlab-runner版本有誤,所以儘量下載最新的、或者合適版本的gitlab-runner

6.註冊gitlab-runner

安裝好了gitlab-runner,還要進行註冊,執行以下操作:

// 註冊 gitlab-runner
sudo gitlab-runner register

// 註冊 gitlab-ci-multi-runner
sudo gitlab-ci-multi-runner register

之後會為註冊輸入一系列資訊:

Enter your GitLab instance URL:(填寫GitLab的url)
Please enter the gitlab-ci coordinator URL (e.g. http://gitlab.com )

// 注:URL和token可在gitlab專案的Setting->CI/CD->Runners Setting->Expand中檢視
http://gitlab.example.com/

Enter the token you obtained to register the Runner:(填寫GitLab的token資訊)
Please enter the gitlab-ci token for this runner

WgdB8849hjQwFAxxxxxx

Enter a description for the Runner, you can change this later in GitLab's UI:(runner的描述)
Please enter the gitlab-ci description for this runner

my-runner

Enter the tags associated with the Runner, you can change this later in GitLab's UI:(runner的標籤,用逗號分開)
Please enter the gitlab-ci tags for this runner (comma separated):

// 多個tag使用英文逗號隔開
runner-tag,runner-tag2,runner-tagx

Enter the Runner executor: (runner的執行者)
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:

shell

(gitlab-runner的資料夾會在 ~/.local/bin 目錄下)

註冊完成後,將gitlab-runner資料夾的使用者所屬修改為gitlab-runner,這樣gitlab-runner對其才會有執行許可權。

sudo chown -R gitlab-runner:gitlab-runner /home/gitlab-runner

修改檔案讀寫許可權:

sudo chmod -R 777 /home/gitlab-runner

許可權不夠會導致runner在執行的時候報錯 permission denied,即不能對檔案進行讀寫、編輯的操作  

注意:gitlab上clone下來的檔案在linux環境中可能也會沒有讀寫許可權,進而也會報錯 permission denied ,此時就要先把clone下來的專案執行 sudo chmod -R 777 /home/project_name ,使專案中的檔案都可讀寫;再進行一個無關的修改,提交到遠端分支,這樣以後clone或者fetch下來的專案都是可讀寫的了。

註冊好之後如果在gitlab-ci的介面上看到runner的旁邊不是綠點,而是黑色三角的感嘆號,可以使用 gitlab-runner start 或者 gitlab-runner run 的指令來開啟runner的service

7.編寫要執行的shell指令碼

接下來我們寫指令碼檔案,因為我們採用的是linux系統,所以用的是shell檔案。

shell 指令碼要做的事情可以分為這些步驟:

    1. 從gitlab上git clone/fetch 專案資源;

    2.進入專案中,執行 yarn / npm install ,安裝專案依賴

    3.執行npm run build 打包專案

    4.將打包好的dist檔案放到伺服器指定釋出目錄下

如果在釋出後想要執行回滾的操作,可以在第4個步驟執行完成後將檔名按git的commit id 來重新命名,並且每次都把這個檔案再拷貝到一個單獨的目錄下存放;再建立軟連結將專案連結到伺服器的釋出目錄下。這樣一來,每次提交的檔案都會儲存在一個地方,釋出的版本就取決於軟連結所指向的檔案,要更改釋出版本的話,只要手動修改一下軟連結指向的重新命名後的dist檔案就可以了

    5.將之前clone下來的檔案刪除,避免檔案越來越多佔據過多記憶體,同時也方便下次clone

8.提交 .gitlab-ci.yml 檔案

    在gitlab的CI/CD->Pipelines->點選Get start with Pipelines,可看到配置文件。文件告訴我們,在push到gitlab的專案的根目錄中新增 .gitlab-ci.yml 檔案,就可以開啟pipelines。在pipelines中就可以看到我們gitlab監聽到事件後執行.gitlab-ci.yml檔案的過程,以及執行狀態等。

    我們參考 #官方文件 的格式,在 .gitlab-ci.yml 檔案寫入要執行的步驟。

    其中在寫job要執行的scripts時,就可以執行我們剛剛寫好的shell指令碼。我們在專案的與.gitlab-ci.yml檔案的同級目錄下建立一個 /ci 目錄,用來存放要執行的.sh檔案,這樣就可以通過相對路徑引入指令碼 ,如:

stages:
  - deploy

deploy_develop:
  stage: deploy
  script:
    - ci/deploy_develop.sh
  only:
    - develop

deploy_stage:
  stage: deploy
  script:
    - ci/deploy_stage.sh
  only:
    - master

    儲存後push到遠端分支。

    此時我們再進入 CI/CD->Pipelines 中,可以看到gitlab的介面已經發生了變化:

   如果執行順利的話,status列就會顯示 passed 。

   點進去檢查一下指令碼是否也按預期的執行了,如果是的話,通過gitlab-ci實現的前端自動化部署/釋出就大功告成了!