純手工搭建 GitaLab與 Gitlab-CI/CD—干貨
作者:javastarboy
背景:前幾年(2018 年前后)的 jenkins+docker+k8s 的CI/CD 在工作之中受益不少。提升了不少工作效率。而隨著這幾年的使用發(fā)現(xiàn),目前 gitlab-CI/CD 在持續(xù)集成部署中更加方便、高效。 尤其是在測(cè)試環(huán)節(jié)中,研發(fā)無需編寫復(fù)雜的 jenkins 腳本,只要提交代碼,即可自動(dòng)構(gòu)建部署。 環(huán)境的處理也與 git 思想一致,在敏捷迭代中,效果顯著。 最近,小編的其中一個(gè)客戶也有此方面訴求,便著手搭建了一下這套流程,奈何網(wǎng)上資料過于零散,雖然僅用一天時(shí)間便搭建起來,但是我認(rèn)為,前面已經(jīng)這么多人(項(xiàng)目組)用過了,在開源的浪潮下,就不應(yīng)該讓后人這么繁瑣的搭建這套流程。 所以此篇文章旨在讀此一篇,便可拿到所有資料鏈接、便可成功搭建 Gitlab-CI/CD。
1、準(zhǔn)備工作
1.1 服務(wù)器準(zhǔn)備
- 服務(wù)器兩臺(tái):實(shí)際使用中,gitlab 與 gitlab-runner 會(huì)分開使用(后文介紹)
- Gitlab 服務(wù)器:4C8G 5M寬帶【如果 2C4G 基本上會(huì)經(jīng)??ㄋ馈?/li>
- Gitlab-Runner 服務(wù)器:2C4G(runner 比較吃內(nèi)存,實(shí)際使用中建議根據(jù)需要搭配,這里學(xué)習(xí)使用,僅用 4G)。 當(dāng)然,項(xiàng)目中 runner 也可使用 docker + k8s 更加便利。
- 服務(wù)器版本
我最后用的是 CentoOS7.6 (因?yàn)樵?CentoOS8 中,在安裝 gitlab 過程中會(huì)有命令兼容問題,我 gitlab 用的是騰訊云,gitlab-runner 用的阿里云,這兩個(gè)云自研的 OpenCloud8 都有問題。所以建議使用原生的 CentoOS7.6,可以規(guī)避很多問題
) - 服務(wù)器的購買
無論買哪個(gè),一定要珍惜自己的新人機(jī)會(huì),就一次,能省下很多錢
- 阿里云:各方面都挺好,但僅新用戶合適,老用戶真的太貴了。 建議珍惜新人優(yōu)惠,趕在雙 11 一次性買個(gè)三年的, 小編買的是 2C8G5M 寬帶 3年 g5 服務(wù)器,當(dāng)時(shí)才 700 多,現(xiàn)在已經(jīng) 8000 多了。
- 騰訊云:性價(jià)比較高,小編買的是新人優(yōu)惠 188 元 1 5 個(gè)月 2C4G6M 寬帶輕量級(jí)
- 華為云:主要是企業(yè)用的多,個(gè)人學(xué)習(xí)不建議
- 京東云:用的太少了,不建議買
1.2 軟件準(zhǔn)備
此文章寫于 2023 年 3 月 5 日,相關(guān)軟件版本用的當(dāng)下最新版
- Gitlab CE(社區(qū)版) 15.9.2
- gitlab-runner 15.9.1
- JDK 11 (這個(gè)無所謂,根據(jù)項(xiàng)目選擇)
- Git 2.31.1
- maven 3.6.3 (用于 maven 構(gòu)建項(xiàng)目)
- gradle (用于 gradle 構(gòu)建項(xiàng)目)
2、Gitlab 的安裝
安裝參考鏈接
官網(wǎng) gitlab ce 安裝包
2.1 安裝 gitlab 相關(guān)命令
- 先創(chuàng)建一個(gè) gitlab 用戶(后面用于發(fā)布 jar 服務(wù)方便管理,與安裝無關(guān))
也可看小編另一篇文章Liunx創(chuàng)建用戶與授權(quán)大招以及Linux修改SSH端口linux 創(chuàng)建用戶并授權(quán)案例,一勞永逸
# 創(chuàng)建tomcat用戶于tomcat目錄上
useradd gitlab
# 修改密碼
passwd gitlab 回車
然后鍵入密碼
# 授權(quán)tomcat目錄
chown -R 777 /home/gitlab
# 修改sudo 權(quán)限:
1)鍵入 vi /etc/sudoers 進(jìn)入編輯模式,然后鍵入 i 追加如下權(quán)限
gitlab ALL=(ALL) ALL
2)若需跨服務(wù)執(zhí)行 sudo 權(quán)限,追加如下權(quán)限
gitlab ALL=(ALL) NOPASSWD:ALL)
3)最后按 esc 鍵,輸入 `:wq` 保存
# 后續(xù)安裝 maven、gitlab 等用戶都需要同步授權(quán)目錄使用
chown -R gitlab:tomcat /usr/share/apache-maven
-
安裝依賴包
yum install -y curl policycoreutils-python openssh-server
-
設(shè)置 SSH 開機(jī)自啟動(dòng)并啟動(dòng) SSH 服務(wù)
systemctl enable sshd systemctl start sshd
-
安裝 Postfix
yum install -y postfix
-
Postfix 設(shè)置
# 設(shè)置 Postfix 服務(wù)開機(jī)自啟動(dòng) systemctl enable postfix # 打開 Postfix 的配置文件 main.cf vim /etc/postfix/main.cf
按 i 進(jìn)入編輯模式,刪除 inet_interfaces = all 前的 #,在 inet_interfaces = localhost 前加上 #。修改完成后如下圖所示。 然后按 Esc 并輸入 :wq 保存修改并退出文件
-
啟動(dòng) Postfix
systemctl start postfix
-
執(zhí)行以下命令,添加 GitLab 軟件包倉庫(CentoOS 8.2以上會(huì)有問題)
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
-
安裝 GitLab
sudo EXTERNAL_URL="服務(wù)器的公網(wǎng)IP地址" yum install -y gitlab-ce
-
在本地瀏覽器中訪問已獲取的公網(wǎng) IP,返回頁面如下所示,則表示已成功安裝 GitLab
2.2 設(shè)置管理員帳戶密碼
- 獲取管理員帳戶默認(rèn)密碼
bash cat /etc/gitlab/initial_root_password
- 登錄 GitLab
在本地瀏覽器中訪問云服務(wù)器的公網(wǎng) IP,進(jìn)入 GitLab 登錄界面。使用 root 帳戶及已獲取的登錄密碼進(jìn)行登錄 - 修改管理員帳戶密碼
由于保存默認(rèn)密碼的文件將在首次配置運(yùn)行24小時(shí)后自動(dòng)刪除,請(qǐng)盡快修改 root 帳戶登錄密碼。選擇頁面右上角的用戶頭像,在彈出菜單中選擇 Perferences。在 “User Settings” 頁面中,選擇左側(cè)導(dǎo)航欄的 Password。在頁面中輸入目前使用密碼,新密碼及確認(rèn)新密碼后,單擊 Save Password 即可。如下圖所示:
- 創(chuàng)建項(xiàng)目與Add SSH Key 屬于工具的使用,這里不贅述了,大家可以自行驗(yàn)證。
也可轉(zhuǎn)此文章:SSH Key的操作
3、Gitlab-Runner 安裝
3.1 先安裝必要軟件
- 安裝 Git
# 安裝 git yum -y install git # 查看是否安裝成功 git --version # 如果版本是 1.8*,那就再更新一下 git 版本,否則后面 gitlab-runner 第二次 stage 階段會(huì)報(bào)錯(cuò) yum update git
- 安裝 jdk11
# 查找openjdk yum search java|grep jdk # 或者帶顏色查找,看著方便點(diǎn) yum search java | grep -i --color jdk # 選擇需要的文件進(jìn)行安裝(以 1.8 為例) yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel # 或者如下命令,安裝 open jdk1.8 的所有文件(省事) yum install -y java-1.8.0-openjdk* # ======================================== # 其他命令 # 查找已安裝的jdk yum list installed | grep [java][jdk] # 卸載所有openjdk相關(guān)文件 yum -y remove java-1.8.0-openjdk* # 安裝OpenJDK 8 JRE yum install java-1.8.0-openjdk # 安裝OpenJDK 8 JDK yum install java-1.8.0-openjdk-devel # 查找已安裝的jdk yum list installed | grep [java][jdk] # 卸載所有openjdk相關(guān)文件 yum -y remove java-1.8.0-openjdk*
- 安裝 maven 3.6.3
-
maven 官方下載地址
- 將下載好的maven安裝包放在磁盤的 /usr/local/ 目錄下,如下圖:
- 解壓apache-maven-3.6.3-bin.tar.gz文件。如下圖:
- 將解壓后的文件夾改成一個(gè)短一點(diǎn)的名字:maven3.6
mv /usr/local/apache-maven-3.8.6/ /usr/local/bin/maven3.6
- 修改 maven settings.xml 倉庫鏡像地址為阿里云鏡像(否則下載依賴會(huì)很慢)
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror>
- 配置maven環(huán)境變量,編輯:vi /etc/profile 文件
# 輸入如下命令打開配置文件 vi /etc/profile # 輸入 i 進(jìn)入編輯模式 export MAVEN_HOME=/usr/local/bin/maven3.6 export PATH=$PATH:$MAVEN_HOME/bin # 按 esc 鍵,然后疏忽 :wq 回車保存 # 輸入如下命令,生效配置 source /etc/profile # 輸入命令,驗(yàn)證安裝是否成功,打印出 maven 版本即成功,如圖: mvn -v
-
maven 官方下載地址
- 安裝 gradle 3.6.3
安裝原理同 maven
- 安裝包下載地址
- 上傳包至 /usr/local/bin 下
- unzip gradle-5.5.1-all.zip
- vim /etc/profile
- shift+G 進(jìn)入最后一行,數(shù)
i
進(jìn)入編輯模式 - 追加如下配置
# gradle
GRADLE_HOME=/usr/local/bin/gradle-5.5.1
export PATH=$PATH:GRADLE_HOME/bin
- exit退出編輯,
:wq!
保存并推出 - source /etc/profile
- gradle -v
3.2 安裝 Gitlab-Runner
注意:此時(shí)已經(jīng)切換到另外一臺(tái)服務(wù)器了,后面CI/CD 主要在這里執(zhí)行
3.2.1 安裝 gitlab-runner
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Give it permission to execute
sudo chmod +x /usr/local/bin/gitlab-runner
# Create a GitLab Runner user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# Install and run as a service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
3.2.2 注冊(cè)runner
1、命令注冊(cè)
# 注冊(cè)命令(注意 gitlab 服務(wù)器地址以及獲取 token 方式見后圖)
sudo gitlab-runner register --url `http://你 gitlab 服務(wù)器的公網(wǎng)IP`/ --registration-token `我是項(xiàng)目的token值(獲取方式見后圖)`
# 接下來就是輸入一些列命令,按照提示操作即可,示例如下($為服務(wù)器的步驟提示):
# 1. 填寫gitlab的地址,確保容器內(nèi)能夠順利訪問到該地址
$ Enter the GitLab instance URL (for example, https://gitlab.com/):
輸入:http://gitlab服務(wù)器公網(wǎng)ip/
# 填寫需要注冊(cè)的runner token,此處選擇shared runner token【獲取方式見后面截圖】
$ Enter the registration token:
輸入:BHRagrsztQAxdMPPhxGm
# 描述信息隨意填寫,也可不填
$ Enter a description for the runner:
輸入:gitlab-runner-01
# tag隨意填寫
$ Enter tags for the runner (comma-separated):
輸入:lmx-runner-4
# 隨意填寫,可不填
$ Enter optional maintenance note for the runner:
Registering runner... succeeded
# 選擇執(zhí)行器的種類,建議選擇docker【小編為演示方便,選擇了 shell】
$ Enter an executor: docker, shell, ssh, kubernetes, custom, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:
輸入:shell
token 獲取位置如圖:
Setting -> CI/CD -> Genneral pioelines settings -> Expand
2、回到 gitlab 查看 runne
gitlab 頁面如下,部分信息可以再次修改
3.2.3 gitlab-runner 的命令
# 啟動(dòng) 重起 停止
gitlab-runner start
gitlab-runner restart
gitlab-runner stop
# 查看gitlab-runner運(yùn)行狀態(tài)
gitlab-runner status
4、實(shí)踐-自動(dòng)化部署 java SpringBoot 項(xiàng)目
4.1 配置一個(gè) gitlab-runner
見 3.2.2 注冊(cè)runner 章節(jié)的注冊(cè)一個(gè) runner 說明
4.2 編輯 .gitlab-ci.yml
先初始化 .gilab-ci.yml 文件,然后編輯腳本
gitlab-ci templates
后文分別舉例了三種部署方式
- 基于 gitlab-runner 本機(jī)部署
- 向指定的虛機(jī)服務(wù)器部署
- 通過 sshpass 方式執(zhí)行目標(biāo)虛機(jī)服務(wù)器命令(需要安裝 sshpass 軟件,處理各種命令執(zhí)行權(quán)限問題,細(xì)節(jié)調(diào)試比較繁瑣,不過不用擔(dān)心,小編這里已經(jīng)把調(diào)試好的腳本給到大家,調(diào)整變量參數(shù)即可)
- 通過 rsa ssh 私鑰部署(最簡(jiǎn)單,前提要配置私鑰,可以免去各種權(quán)限問題)
- 通過 docker 部署—待補(bǔ)充…
- 通過分支、manual 等加入審批環(huán)節(jié)并區(qū)分生產(chǎn)環(huán)境,分支命名嚴(yán)格規(guī)范—待補(bǔ)充…
4.2.1 方案一:基于 gitlab-runner 本機(jī)部署項(xiàng)目示例–基礎(chǔ)版
大家調(diào)試的時(shí)候,可以先調(diào)試 test 環(huán)節(jié),保證你的 gitlab-runner 流程是正常的,然后再一步一步深入調(diào)試
當(dāng)前示例的 jar 應(yīng)用最終會(huì)部署在 gitlab-runner 本機(jī)上。 實(shí)際應(yīng)用中不會(huì)這樣部署,否則 gitlab-runner服務(wù)器資源會(huì)很緊張,咱們由淺入深,先調(diào)試名奶原理,再看后面章節(jié)。
流程圖示意(區(qū)別于下章的虛機(jī)部署方式)
4.2.1.1 .gitlab-ci.yml 腳本示例
# 定義一些變量, 下面各階段會(huì)使用
variables:
# 運(yùn)行的 jar 名稱
JAR_NAME: test-0.0.1-SNAPSHOT.jar
# jar 包存放位置,不能是 git 目錄,否則下一個(gè) stage 階段會(huì)清除文件, 這里默認(rèn)放到上一級(jí)了
JAR_PATH: ../
# 本次構(gòu)建的階段: test、package、deploy
stages:
- test
- package
- deploy
# 測(cè)試流水線
test:
stage: test
tags:
- lmx-runnser-4
only:
- main
script:
- echo "流水線成功運(yùn)行!"
# 打包
package:
stage: package
tags:
- lmx-runnser-4
only:
- main
script:
- echo "=============== 開始install任務(wù) ==============="
- pwd
- mvn clean
- mvn package
- rm -rf $JAR_PATH/$JAR_NAME
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 啟動(dòng)jar包
deploy:
stage: deploy
tags:
- lmx-runnser-4
only:
- main
script:
- echo "=============== 開始部署任務(wù) ==============="
- cd $JAR_PATH
- pwd
- ls
- ./test.sh
- echo "發(fā)布完成!"
- test.sh 腳本如下
#!/bin/bash
set -ex
pkill -9 java
# 注意:一定要寫上 2>&1 & 進(jìn)行重定向,否則任務(wù)會(huì)卡在 running 不動(dòng)
nohup java -Dfile.encoding=utf-8 -jar test-0.0.1-SNAPSHOT.jar > test.log 2>&1 &
exit 0
4.2.1.2 本章注意事項(xiàng)與問題
- jar 包存放位置
package階段,將 jar 包存放到了打包目錄的上級(jí)目錄,是因?yàn)榇虬玫?jar 文件在 git 目錄中,runner 的下一個(gè) stage 階段會(huì)清除這里的文件
。把 jar 包目錄移走就不會(huì)影響下一步的 deploy - 執(zhí)行啟動(dòng)命令后任務(wù)卡在 running 環(huán)節(jié)不動(dòng)
這是因?yàn)?runner 中執(zhí)行啟動(dòng)命令后沒有做重定向?qū)е?,需要在啟?dòng)參數(shù)后面追加> test.log 2>&1 &
命令重定向
4.2.2 方案二:向指定虛機(jī)服務(wù)器部署項(xiàng)目腳本示例
公司內(nèi)部項(xiàng)目部署,可能每個(gè)項(xiàng)目都有分派自己的虛機(jī)服務(wù)器,所以我們需要把 runner 中打好的 jar 包上傳到對(duì)應(yīng)虛機(jī)服務(wù)并進(jìn)行停起服務(wù)操作。 這里面會(huì)涉及到幾個(gè)知識(shí)點(diǎn)
sshpass 軟件進(jìn)行遠(yuǎn)程服務(wù)器 ssh 訪問; 或通過 rsa 秘鑰的方式創(chuàng)建服務(wù)鏈接
,前者會(huì)遇到一些權(quán)限、帶密碼登錄虛機(jī)、腳本調(diào)試等問題。 為了大家方便,小編已經(jīng)給大家做成變量的方式,大家僅需調(diào)整自己的變量參數(shù)即可。
示意流程圖
4.2.2.1 sshpass 方式的 .gitlab-ci.yml 腳本示例
- 準(zhǔn)備工作:
- 需要目標(biāo)虛機(jī) user、passwd、jar 存放路徑
- 目標(biāo)需求需要安裝 sshpass 軟件
安裝命令yum install sshpass
- 目標(biāo)虛機(jī)上需要給 user 授權(quán)sudo免密登錄
root 用戶輸入命令vi /ect/sudoers
然后輸入i
回車進(jìn)入編輯模式,追加如下參數(shù)gitlab ALL=(ALL) NOPASSWD:ALL)
然后按 ESC 鍵,輸入:wq
回車保存 - gitlab-runner 執(zhí)行 sshpass 命令如果報(bào)錯(cuò)
Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
則需要執(zhí)行
4.1.chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf
(或chmod 600 ~/.ssh/config,以操作系統(tǒng)配置為準(zhǔn))
4.2. 如果 4.1 命令執(zhí)行后無效,則可能是用戶的用戶組不正確,假設(shè)執(zhí)行命令的用戶是 root,則更改用戶組的命令為:chown root:root /etc/ssh/ssh_config.d/05-redhat.conf
,然后重新執(zhí)行 4.1 命令即可解決
#! /bin/bash
# 定義一些變量, 下面各階段會(huì)使用
variables:
# 運(yùn)行的 jar 名稱
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目錄,否則下一個(gè) stage 階段會(huì)清除文件, 這里默認(rèn)放到上一級(jí)了
JAR_PATH: ../
# 目標(biāo)虛機(jī)服務(wù)器用戶名
targetUsr: "gitlab"
# 目標(biāo)虛機(jī)服務(wù)器登錄密碼
targetPwd: "gitlab-passwpord"
# 目標(biāo)虛機(jī)服務(wù)器ip
targetHost: "172.222.206.141"
# 目標(biāo)虛機(jī)服務(wù)器端口【默認(rèn)22端口時(shí)可以不指定,小編服務(wù)器當(dāng)時(shí)中病毒了,所以后來改了端口號(hào),這里把指定端口號(hào)這種方式也提供給大家】
# 調(diào)整端口也可看小編另一篇文章[Liunx創(chuàng)建用戶與授權(quán)大招以及Linux修改SSH端口](https://blog.csdn.net/u012723183/article/details/129811221)
targetPort: 22
# 目標(biāo)虛機(jī)服務(wù)器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下兩項(xiàng)為啟動(dòng)參數(shù),按需調(diào)整,非必須
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
# 本次構(gòu)建的階段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都構(gòu)建,這里也可以改成 only 只有 xxx 分支構(gòu)建,按需調(diào)整
except:
- main
script:
# 調(diào)試過程中如果遇到問題,可以放開 set -ex 這樣就能打印出來命令了
#- set -ex
- echo "=============== 開始打包 ==============="
- pwd
# 執(zhí)行 maven 的清理、打包命令(如果是 gradle 調(diào)整對(duì)應(yīng)命令即可)
- mvn clean
- mvn package
# 刪除臨時(shí)存放目錄的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 將最新打包好的文件移動(dòng)到臨時(shí)目錄(原因看上一個(gè)章節(jié)注意事項(xiàng))
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
# 進(jìn)入到臨時(shí)目錄查看一下文件
- cd $JAR_PATH
- ls
# 開始上傳 jar 包到目標(biāo)服務(wù)器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 開始上傳 jar 包到目標(biāo)服務(wù)器 ==============="
# 通過sshpass命令拷貝 runner 上的 jar 包到目標(biāo)虛機(jī)服務(wù)器【命令示例:sshpass -p passwd scp -P 2203 test-0.0.1-SNAPSHOT.jar gitlab@101.55.206.139:/home/gitlab/】
- sshpass -p $targetPwd scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通過 sshpass 停起虛機(jī)上的應(yīng)用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# 查證問題的時(shí)候可以打印一下 -ex 命令,方便查證問題
# - set -ex
- echo "=============== 開始停起虛機(jī)上的應(yīng)用 ==============="
# 通過sshpass命令殺掉目標(biāo)服務(wù)器上即將啟動(dòng)的 jar 應(yīng)用進(jìn)程
- pid=$(sshpass -p $targetPwd ssh -P $targetPort ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 當(dāng)前運(yùn)行的 pid 為 ${pid}
- |
if [ ${pid} ]; then
echo "開始?xì)⑦M(jìn)程停服務(wù)"
sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "當(dāng)前無程序運(yùn)行"
fi
# 通過sshpass命令啟動(dòng) java 應(yīng)用
- echo "開始啟動(dòng)服務(wù)"
- sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "發(fā)布完成!當(dāng)前運(yùn)行的PID 為:" ${pid}
4.2.2.2 gitlab-ci/cd 模版制作【.gitlab-ci-template.yml】
實(shí)際工作中,項(xiàng)目會(huì)有很多,分部門分項(xiàng)目組,分 group 等等情況。 既然咱們實(shí)現(xiàn)了自動(dòng)化,旨在降低業(yè)務(wù)功能研發(fā)同學(xué)的工作成本,不應(yīng)該每個(gè)項(xiàng)目都寫這樣一個(gè)復(fù)雜的腳本。 所以寫一個(gè)公共的gitlab-ci模版就成為必要,把核心實(shí)現(xiàn)都在模版中動(dòng)態(tài)引入,研發(fā)人員只需要調(diào)整自己項(xiàng)目的動(dòng)態(tài)參數(shù) variables 即可實(shí)現(xiàn)自動(dòng)化部署
4.2.2.2.1 原理
其實(shí)就是類似 java 開發(fā)的面向?qū)ο笤恚?將一個(gè)大的復(fù)雜的方法,抽象出來公共實(shí)現(xiàn),動(dòng)態(tài)傳入數(shù)據(jù)即可。
-
第一步:先創(chuàng)建一個(gè)新工程,用于存放模版(此工程無需構(gòu)建,其實(shí)就是一個(gè)物理存放文件的路徑,后面會(huì)從這里引用模版)
-
第 二步:先將4.2.2.1 章節(jié)中 stages 階段提取到公共模版.gitlab-ci-template.yml 中【注意: 腳本一定是動(dòng)態(tài)綁定參數(shù)】
4.2.2.2.2 模版腳本【.gitlab-ci-template.yml】
- .gitlab-ci-maven-template.yml
待補(bǔ)充.....
- .gitlab-ci-template.yml
#include:
- local: '.gitlab-ci-maven-template.yml'
- local: '.gitlab-ci-gradle-template.yml'
# 本次構(gòu)建的階段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都構(gòu)建,這里也可以改成 only 只有 xxx 分支構(gòu)建,按需調(diào)整
except:
- main
script:
# 調(diào)試過程中如果遇到問題,可以放開 set -ex 這樣就能打印出來命令了
#- set -ex
- echo "=============== 開始打包 ==============="
- pwd
# 執(zhí)行 maven 的清理、打包命令(如果是 gradle 調(diào)整對(duì)應(yīng)命令即可)
- mvn clean
- mvn package
# 刪除臨時(shí)存放目錄的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 將最新打包好的文件移動(dòng)到臨時(shí)目錄(原因看上一個(gè)章節(jié)注意事項(xiàng))
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 遠(yuǎn)程虛機(jī)服務(wù)器上部署 jar 方案,準(zhǔn)備如下:
# 1、需要目標(biāo)虛機(jī) user、passwd、jar 存放路徑
# 2、目標(biāo)需求需要安裝 sshpass 軟件【yum install sshpass】
# 3、目標(biāo)虛機(jī)上需要給 user 授權(quán)sudo免密登錄【【vi /ect/sudoers】==》gitlab ALL=(ALL) NOPASSWD:ALL)】,否則后面停服命令將無法執(zhí)行
# 4、gitlab-runner 本機(jī)如果報(bào)錯(cuò) Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
# 4.1 則需要執(zhí)行 chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf (或chmod 600 ~/.ssh/config,以操作系統(tǒng)配置為準(zhǔn))
# 4.2 如果 4.1 命令執(zhí)行后無效,則可能是用戶的用戶組不正確,假設(shè)執(zhí)行命令的用戶是 root,則更改用戶組的命令為:chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新執(zhí)行 4.1
# 開始上傳 jar 包到目標(biāo)服務(wù)器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 開始上傳 jar 包到目標(biāo)服務(wù)器 ==============="
# 通過sshpass命令拷貝 runner 上的 jar 包到目標(biāo)虛機(jī)服務(wù)器【命令示例:sshpass -p passwd scp -P 2203 test-0.0.1-SNAPSHOT.jar gitlab@101.55.206.139:/home/gitlab/】
- sshpass -p $targetPwd scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通過 sshpass 停起虛機(jī)上的應(yīng)用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# 查證問題的時(shí)候可以打印一下 -ex 命令,方便查證問題
# - set -ex
- echo "=============== 開始停起虛機(jī)上的應(yīng)用 ==============="
# 通過sshpass命令殺掉目標(biāo)服務(wù)器上即將啟動(dòng)的 jar 應(yīng)用進(jìn)程
- pid=$(sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 當(dāng)前運(yùn)行的 pid 為 ${pid}
- |
if [ ${pid} ]; then
echo "開始?xì)⑦M(jìn)程停服務(wù)"
sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "當(dāng)前無程序運(yùn)行"
fi
# 通過sshpass命令啟動(dòng) java 應(yīng)用
- echo "開始啟動(dòng)服務(wù)"
- sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(sshpass -p $targetPwd ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "發(fā)布完成!當(dāng)前運(yùn)行的PID 為:" ${pid}
4.2.2.2.3 項(xiàng)目動(dòng)態(tài)腳本variables【.gitlab-ci.yml】
首先需要先引入上面做好的模版腳本,類似研發(fā)中的引包
#! /bin/bash
# 引入模版
include:
# 模版所在 project ,gitlab-instance-ecd28528為分組,ht-gitlab-ci為項(xiàng)目名稱
- project: 'gitlab-instance-ecd28528/ht-gitlab-ci'
# 模版文件
file: '.gitlab-ci-template.yml'
# 模版項(xiàng)目所在分支
ref: main
# 定義一些變量, 下面各階段會(huì)使用
variables:
# 運(yùn)行的 jar 名稱
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目錄,否則下一個(gè) stage 階段會(huì)清除文件, 這里默認(rèn)放到上一級(jí)了
JAR_PATH: ../
# 目標(biāo)虛機(jī)服務(wù)器用戶名
targetUsr: "gitlab"
# 目標(biāo)虛機(jī)服務(wù)器登錄密碼
targetPwd: "gitlab-passwpord"
# 目標(biāo)虛機(jī)服務(wù)器ip
targetHost: "172.222.206.141"
# 目標(biāo)虛機(jī)服務(wù)器端口
targetPort: 22
# 目標(biāo)虛機(jī)服務(wù)器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下兩項(xiàng)為啟動(dòng)參數(shù),按需調(diào)整,非必須
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
4.2.2.3 rsa密鑰SSH免密登錄方式的 .gitlab-ci.yml 腳本示例(更簡(jiǎn)單)
4.2.2.3.1 SSH 免密登錄
上面介紹的命令中,都是通過sshpass 軟件實(shí)現(xiàn)主控服務(wù)器(gitlab-runner)向目標(biāo)虛機(jī)服務(wù)器遠(yuǎn)程scp文件并執(zhí)行命令。 顯然操作起來,其命令過于復(fù)雜且不安全。 所以咱們通過配置 SSH 免密登錄之后來編輯腳本就更加簡(jiǎn)單且安全了。
1. 開始之前,先介紹一下,如何給一臺(tái)服務(wù)器設(shè)置 rsa 密鑰登錄
此過程與咱們本次要實(shí)現(xiàn)的 gitlab-runner免密登錄無關(guān)(在這里提前介紹是怕大家稍后配置 gitlab-runner免密時(shí)遇到一個(gè)多公鑰文件情況不知如何處理),屬于額外給大家介紹一下單純?cè)O(shè)置服務(wù)器 rsa 秘鑰登錄技巧。 點(diǎn)擊下面鏈接有詳細(xì)命令講解
菜鳥教程-設(shè)置 SSH 通過密鑰登錄
核心命令如下:
cat /root/.ssh/id_rsa.pub >> authorized_keys
chmod 600 authorized_keys
chmod 700 ~/.ssh
vi /etc/ssh/sshd_config -----按如下圖2方式調(diào)整
systemctl restart sshd ------重啟 sshd
sshd_config配置文件調(diào)整
下載id_rsa,然后打開本地 xshell/finalshell/winscp等 ssh連接工具,引入id_rsa文件即可,下圖為 finalshell 示例:
2. 下面講解 gitlab-runner 主控機(jī)操控遠(yuǎn)程受控機(jī)的SSH 免密登錄配置方式
原理:如下圖,是咱們 gitlab-ci的操作流程示意,我們上文中通過 sshpass 實(shí)現(xiàn) gitlab-runner 遠(yuǎn)程操控虛機(jī)命令
我們只需要將此過程實(shí)現(xiàn)免密登錄即可簡(jiǎn)化命令操作并且安全.
處理流程如下:
1) 在 gitlab-runner 服務(wù)器的 gitlab-runner 用戶下生成密鑰對(duì)
# 切換用戶
su gitlab-runner
# 生成密鑰對(duì)
ssh-keygen -t rsa
# 連續(xù)三次回車效果如圖
2) 如上圖,將生成好的公鑰文件/home/gitlab-runner/.ssh/id_rsa.pub
下載后上傳至目標(biāo)虛機(jī)服務(wù)器的/root/.ssh
目錄下,然后將id_rsa.pub內(nèi)容進(jìn)行追加到authorized_keys
當(dāng)中實(shí)現(xiàn)免密登錄。注意:如果你的目標(biāo)虛機(jī)做過 rsa 密鑰配置(4.2.2.3.1章第一點(diǎn)的介紹),則/root/.ssh下也會(huì)存在一個(gè)id_rsa.pub文件,這時(shí)大家只需要把 gitlab-runner的id_rsa.pub文件隨便放一個(gè)位置即可,因?yàn)橹饕哪康氖峭ㄟ^ id_rsa.pub 將公鑰信息載入authorized_keys,所以如果有多個(gè)公鑰文件也無所謂的。
# 將公鑰寫入 authorized_keys【 cat 后面可以指定你的公鑰路徑,如果你有多個(gè)公鑰,自行放置,我的是放在了/home/gitlab/.ssh下】
cat /home/gitlab/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
3)在 gitlab-runner服務(wù)器上測(cè)試一下遠(yuǎn)程免密登錄虛機(jī)
# -p 2203是指定 ssh 登錄端口號(hào)(默認(rèn)是 22 端口,大家想學(xué)習(xí)如何更改 ssh 端口號(hào)的也可看小編另一篇文章[Liunx創(chuàng)建用戶與授權(quán)大招以及Linux修改SSH端口](https://blog.csdn.net/u012723183/article/details/129811221))
ssh -p 2203 root@101.55.206.139
# 如果是默認(rèn)的 22 端口,命令可以簡(jiǎn)化如下
ssh root@101.55.206.139
4.2.2.3.2 SSH免密登錄的 gitlab-ci.yml腳本調(diào)整
1. 項(xiàng)目.gitlab-ci.yml 腳本調(diào)整
主要調(diào)整了用戶為 root 用戶,去掉了密碼,因?yàn)槊饷艿卿浟?/p>
#! /bin/bash
# 引入模版
include:
- project: 'gitlab-instance-ecd28528/ht-gitlab-ci'
file: '.gitlab-ci-template.yml'
ref: main
# 定義一些變量, 下面各階段會(huì)使用
variables:
# 運(yùn)行的 jar 名稱
JAR_NAME: "test-0.0.1-SNAPSHOT.jar"
# jar 包存放位置,不能是 git 目錄,否則下一個(gè) stage 階段會(huì)清除文件, 這里默認(rèn)放到上一級(jí)了
JAR_PATH: ../
# 目標(biāo)虛機(jī)服務(wù)器用戶名
targetUsr: "root"
# 目標(biāo)虛機(jī)服務(wù)器ip
targetHost: "101.55.206.139"
# 目標(biāo)虛機(jī)服務(wù)器端口
targetPort: 2203
# 目標(biāo)虛機(jī)服務(wù)器jar 包存放位置
targetUploadPath: "/home/gitlab/"
# 如下兩項(xiàng)為啟動(dòng)參數(shù),按需調(diào)整,非必須
APPLICATION_CONFIG: "-Dfile.encoding=utf-8"
JAVA_OPTIONS: "-Dspring.profiles.active=dev -server -Xms256m -Xmx1024m"
LOG: test.log
2. 模版腳本調(diào)整.gitlab-ci-template.yml
調(diào)整了 sshpass 命令為 ssh 命令,并且 scp 命令得到了簡(jiǎn)化
# 本次構(gòu)建的階段: package、upload、deploy
stages:
- package
- upload
- deploy
# 打包
package:
stage: package
tags:
- lmx-runnser-4
# 除了 main 分支都構(gòu)建,這里也可以改成 only 只有 xxx 分支構(gòu)建,按需調(diào)整
except:
- main
script:
# 調(diào)試過程中如果遇到問題,可以放開 set -ex 這樣就能打印出來命令了
#- set -ex
- echo "=============== 開始打包 ==============="
- pwd
# 執(zhí)行 maven 的清理、打包命令(如果是 gradle 調(diào)整對(duì)應(yīng)命令即可)
- mvn clean
- mvn package
# 刪除臨時(shí)存放目錄的文件
- rm -rf $JAR_PATH/$JAR_NAME
# 將最新打包好的文件移動(dòng)到臨時(shí)目錄(原因看上一個(gè)章節(jié)注意事項(xiàng))
- mv ./target/$JAR_NAME $JAR_PATH/$JAR_NAME
- cd $JAR_PATH
- ls
# 遠(yuǎn)程虛機(jī)服務(wù)器上部署 jar 方案,準(zhǔn)備如下:
# 1、需要目標(biāo)虛機(jī) user、passwd、jar 存放路徑
# 2、目標(biāo)需求需要安裝 sshpass 軟件【yum install sshpass】
# 3、目標(biāo)虛機(jī)上需要給 user 授權(quán)sudo免密登錄【【vi /ect/sudoers】==》gitlab ALL=(ALL) NOPASSWD:ALL)】,否則后面停服命令將無法執(zhí)行
# 4、gitlab-runner 本機(jī)如果報(bào)錯(cuò) Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
# 4.1 則需要執(zhí)行 chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf (或chmod 600 ~/.ssh/config,以操作系統(tǒng)配置為準(zhǔn))
# 4.2 如果 4.1 命令執(zhí)行后無效,則可能是用戶的用戶組不正確,假設(shè)執(zhí)行命令的用戶是 root,則更改用戶組的命令為:chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新執(zhí)行 4.1
# 開始上傳 jar 包到目標(biāo)服務(wù)器
upload:
stage: upload
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# - set -ex
- echo "=============== 開始上傳 jar 包到目標(biāo)服務(wù)器 ==============="
# 【設(shè)置免密登錄后】拷貝 runner 上的 jar 包到目標(biāo)虛機(jī)服務(wù)器【命令示例:scp -P 2203 test-0.0.1-SNAPSHOT.jar root@101.55.206.139:/home/gitlab/】
- scp -P $targetPort $JAR_NAME $targetUsr@$targetHost:$targetUploadPath
# 通過 sshpass 停起虛機(jī)上的應(yīng)用
deploy:
stage: deploy
tags:
- lmx-runnser-4
except:
- main
before_script:
# 進(jìn)入到 jar 包存放目錄
- cd $JAR_PATH
- ls
script:
# 查證問題的時(shí)候可以打印一下 -ex 命令,方便查證問題
# - set -ex
- echo "=============== 開始停起虛機(jī)上的應(yīng)用 ==============="
# 通過sshpass命令殺掉目標(biāo)服務(wù)器上即將啟動(dòng)的 jar 應(yīng)用進(jìn)程【命令示例:ssh -p 2203 -o StrictHostKeyChecking=no root@101.23.206.23 'ps -ef|grep 'test-0.0.1-SNAPSHOT.jar ' | grep -v "grep" | awk "{print \$2}"'】
- pid=$(ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo 當(dāng)前運(yùn)行的 pid 為 ${pid}
- |
if [ ${pid} ]; then
echo "開始?xì)⑦M(jìn)程停服務(wù)"
ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}" | xargs sudo kill -9'
else
echo "當(dāng)前無程序運(yùn)行"
fi
# 通過sshpass命令啟動(dòng) java 應(yīng)用
- echo "開始啟動(dòng)服務(wù)"
- ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'java -jar '$targetUploadPath$JAR_NAME' > '$LOG' 2>&1 & '
- pid=$(ssh -p $targetPort -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- echo "發(fā)布完成!當(dāng)前運(yùn)行的PID 為:" ${pid}
4.2.2.4 本章注意事項(xiàng)與問題
- gitlab-runner
執(zhí)行 sshpass
命令如果報(bào)錯(cuò)Bad owner or permissions on /etc/ssh/ssh_config.d/05-redhat.conf
- 需要root 執(zhí)行授權(quán)命令:
chmod 600 /etc/ssh/ssh_config.d/05-redhat.conf
- 有的 linux 操作系統(tǒng)沒有05-redhat.conf 文件,可能是~/.ssh/config,那么調(diào)整命令為
chmod 600 ~/.ssh/config
即可(小編當(dāng)時(shí)在這里折騰半天,具體原因是下面第二個(gè)問題 group )。
- 需要root 執(zhí)行授權(quán)命令:
- 如果上面 chmod 600 命令執(zhí)行后無效,則可能是用戶的用戶組不正確,假設(shè)執(zhí)行命令的用戶是 root,則更改用戶組的命令為:
chown root:root /etc/ssh/ssh_config.d/05-redhat.conf
,然后重新執(zhí)行 chmod 600 命令即可解決 - 執(zhí)行 sudo kill -9 停服命令報(bào)錯(cuò)問題(會(huì)有倆錯(cuò)誤記不清了,按照我這個(gè)搞就能好使)
目標(biāo)虛機(jī)上需要給 user 授權(quán)sudo免密登錄
root 用戶輸入命令vi /ect/sudoers
然后輸入i
回車進(jìn)入編輯模式,追加如下參數(shù)gitlab ALL=(ALL) NOPASSWD:ALL)
然后按 ESC 鍵,輸入:wq
回車保存,搞定! - 執(zhí)行過程中 sshpass 停服殺進(jìn)程命令以及啟動(dòng)服務(wù)命令中,會(huì)遇到幾個(gè)腳本錯(cuò)誤問題,主要是咱們?cè)?gitlab-ci 中編寫 shell 腳本的一些細(xì)節(jié)問題,這也是相比于 rsa 秘鑰方式復(fù)雜的地方,主要注意問題如下
- {print $2} $ 前面追加轉(zhuǎn)義符 {print \$2}
- sshpass 后面的 shell 命令用引號(hào)
'shell 命令'
包裝 ,所以命令本身如果有引號(hào)就要做特殊處理比如下面示例中的"test-0.0.1-SNAPSHOT.jar"
sshpass -p lmx@2023 ssh -o StrictHostKeyChecking=no gitlab@101.55.206.139 'ps -ef|grep "test-0.0.1-SNAPSHOT.jar" | grep -v "grep" | awk "{print \$2}"'
- 如果引用的內(nèi)容是變量形式,則還需要使用單引號(hào)處理,比如下面腳本的
'$JAR_NAME'
。小編當(dāng)時(shí)在這里耽誤了大半天時(shí)間,各種調(diào)試,所以一定要注意。
pid=$(sshpass -p $targetPwd ssh -o StrictHostKeyChecking=no $targetUsr@$targetHost 'ps -ef|grep '$JAR_NAME' | grep -v "grep" | awk "{print \$2}"')
- 比如上面這個(gè)獲取 pid 變量的參數(shù),要注意兩點(diǎn)
- pid=$(命令) 中,
pid=$
等號(hào)中間不能有空格
(真的太坑了,小編這里也耽誤很久) - 等號(hào)后面的命令一定要用
$(命令)
語法包裝 - 引用 pid 變量的時(shí)候語法是
${pid}
如案例中的if [ ${pid} ]; then
- pid=$(命令) 中,
4.2.2.5 docker 方式的 .gitlab-ci.yml 腳本示例(更簡(jiǎn)單)
待更新
4.2.3 通過分支、manual 等加入審批環(huán)節(jié)并區(qū)分生產(chǎn)環(huán)境部署
待更新,預(yù)計(jì) 3 月中旬更新
4.4 提交代碼驗(yàn)證項(xiàng)目的構(gòu)建與部署
1、查看構(gòu)建狀態(tài)
2、瀏覽器輸入自己的 test 接口,驗(yàn)證一下項(xiàng)目運(yùn)行情況
5、其他遇到的問題
5.1 gitlab 內(nèi)存不夠【gitlab.rb】
服務(wù)器要求:至少 2C8G, 建議 4C8G 或更高
報(bào)錯(cuò):fatal: The remote end hung up unexpectedly
解決:git config --global http.postBuffer 524288000
查看:git config --global --list
繼續(xù)報(bào)錯(cuò):fatal: Out of memory, malloc failed (tried to allocate 262144000 bytes)
解決(內(nèi)存不足,干脆刪掉):git config --global --unset http.postbuffer
寫的比較詳細(xì)的鏈接可參考,主要是調(diào)整 gitlab.rb 配置參數(shù)(我目前試了沒搞定)
5.2 sudo 命令執(zhí)行問題
報(bào)錯(cuò):sudo: /usr/libexec/sudo/sudoers.so 必須屬于用戶 ID 0(的用戶)
sudo: 在加載插件“sudoers_policy”時(shí)在 /etc/sudo.conf 第 14 行出錯(cuò)
問題原因:有人將/usr/bin/sudo的權(quán)限改為777或?qū)⒛夸?usr的權(quán)限授權(quán)給非root用戶了
解決辦法:
chmod 4755 /usr/bin/sudo
chown -R root:root /usr
5.3 deploy執(zhí)行服務(wù)器 sh 腳本卡在 running 不動(dòng)
# 注意:一定要寫上 2>&1 & 進(jìn)行重定向,否則任務(wù)會(huì)卡在 running 不動(dòng)
最終:nohup java -Dfile.encoding=utf-8 -jar test-0.0.1-SNAPSHOT.jar > test.log 2>&1 &
5.4 -p 端口號(hào)與 -P 端口號(hào)
注意 p 的大小寫不同
sshpass -p 端口號(hào)
ssh -p 端口號(hào)
scp -P端口號(hào)
5.5 gitlab自動(dòng)構(gòu)建(二次構(gòu)建)報(bào)錯(cuò)–fatal: git fetch-pack: expected shallow list
解決方案
- 查看 git版本:
git --version
- 更新安裝源
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
- 安裝或更新 git
#安裝git
yum install git
#更新git
yum update git
- 如果還是沒有更新,可用如下方案
升級(jí) git 版本
5.6 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
如果成功配置了 rsa 依然報(bào)錯(cuò) Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
原因是:gitlab-runner register 的用戶與 rsa 用戶不是一個(gè)導(dǎo)致文章來源:http://www.zghlxwxcb.cn/news/detail-402001.html
附:
Gitlab CI/CD 簡(jiǎn)單介紹
Gitlab CI/CD 介紹
Gitlab-Runner 相關(guān)命令
Liunx創(chuàng)建用戶與授權(quán)大招以及Linux修改SSH端口文章來源地址http://www.zghlxwxcb.cn/news/detail-402001.html
到了這里,關(guān)于純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!