国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

這篇具有很好參考價(jià)值的文章主要介紹了純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

純手工搭建 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 保存修改并退出文件
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

  • 啟動(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
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

2.2 設(shè)置管理員帳戶密碼

  1. 獲取管理員帳戶默認(rèn)密碼
    bash cat /etc/gitlab/initial_root_password
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
  2. 登錄 GitLab
    在本地瀏覽器中訪問云服務(wù)器的公網(wǎng) IP,進(jìn)入 GitLab 登錄界面。使用 root 帳戶及已獲取的登錄密碼進(jìn)行登錄
  3. 修改管理員帳戶密碼
    由于保存默認(rèn)密碼的文件將在首次配置運(yùn)行24小時(shí)后自動(dòng)刪除,請(qǐng)盡快修改 root 帳戶登錄密碼。選擇頁面右上角的用戶頭像,在彈出菜單中選擇 Perferences。在 “User Settings” 頁面中,選擇左側(cè)導(dǎo)航欄的 Password。在頁面中輸入目前使用密碼,新密碼及確認(rèn)新密碼后,單擊 Save Password 即可。如下圖所示:
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
  • 創(chuàng)建項(xiàng)目與Add SSH Key 屬于工具的使用,這里不贅述了,大家可以自行驗(yàn)證。
    也可轉(zhuǎn)此文章:SSH Key的操作

3、Gitlab-Runner 安裝

3.1 先安裝必要軟件

  1. 安裝 Git
    # 安裝 git
    yum -y install git
    # 查看是否安裝成功
    git --version
    # 如果版本是 1.8*,那就再更新一下 git 版本,否則后面 gitlab-runner 第二次 stage 階段會(huì)報(bào)錯(cuò)
    yum update git
    
  2. 安裝 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*
    
  3. 安裝 maven 3.6.3
    • maven 官方下載地址
      純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
    • 將下載好的maven安裝包放在磁盤的 /usr/local/ 目錄下,如下圖:
      純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
    • 解壓apache-maven-3.6.3-bin.tar.gz文件。如下圖:純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
    • 將解壓后的文件夾改成一個(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 
      
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
  4. 安裝 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

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

  • 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

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
2、回到 gitlab 查看 runne
gitlab 頁面如下,部分信息可以再次修改
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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ǔ)充…
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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ī)部署方式)

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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)與問題
  1. jar 包存放位置
    package階段,將 jar 包存放到了打包目錄的上級(jí)目錄,是因?yàn)榇虬玫?jar 文件在 git 目錄中,runner 的下一個(gè) stage 階段會(huì)清除這里的文件。把 jar 包目錄移走就不會(huì)影響下一步的 deploy
  2. 執(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ù)即可。

示意流程圖

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

4.2.2.1 sshpass 方式的 .gitlab-ci.yml 腳本示例
  • 準(zhǔn)備工作:
    1. 需要目標(biāo)虛機(jī) user、passwd、jar 存放路徑
    2. 目標(biāo)需求需要安裝 sshpass 軟件
      安裝命令 yum install sshpass
    3. 目標(biāo)虛機(jī)上需要給 user 授權(quán)sudo免密登錄
      root 用戶輸入命令 vi /ect/sudoers
      然后輸入 i 回車進(jìn)入編輯模式,追加如下參數(shù) gitlab ALL=(ALL) NOPASSWD:ALL)
      然后按 ESC 鍵,輸入 :wq 回車保存
    4. 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ù)即可。

  1. 第一步:先創(chuàng)建一個(gè)新工程,用于存放模版(此工程無需構(gòu)建,其實(shí)就是一個(gè)物理存放文件的路徑,后面會(huì)從這里引用模版)
    純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

  2. 第 二步:先將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
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
sshd_config配置文件調(diào)整
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
下載id_rsa,然后打開本地 xshell/finalshell/winscp等 ssh連接工具,引入id_rsa文件即可,下圖為 finalshell 示例:
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

2. 下面講解 gitlab-runner 主控機(jī)操控遠(yuǎn)程受控機(jī)的SSH 免密登錄配置方式

原理:如下圖,是咱們 gitlab-ci的操作流程示意,我們上文中通過 sshpass 實(shí)現(xiàn) gitlab-runner 遠(yuǎn)程操控虛機(jī)命令
我們只需要將此過程實(shí)現(xiàn)免密登錄即可簡(jiǎn)化命令操作并且安全.
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

處理流程如下:

1) 在 gitlab-runner 服務(wù)器的 gitlab-runner 用戶下生成密鑰對(duì)

# 切換用戶
su gitlab-runner
# 生成密鑰對(duì)
ssh-keygen -t rsa
# 連續(xù)三次回車效果如圖

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
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

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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)與問題
  1. 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 )。
  2. 如果上面 chmod 600 命令執(zhí)行后無效,則可能是用戶的用戶組不正確,假設(shè)執(zhí)行命令的用戶是 root,則更改用戶組的命令為:
    chown root:root /etc/ssh/ssh_config.d/05-redhat.conf,然后重新執(zhí)行 chmod 600 命令即可解決
  3. 執(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 回車保存,搞定!

  4. 執(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)
      1. pid=$(命令) 中, pid=$ 等號(hào)中間不能有空格(真的太坑了,小編這里也耽誤很久)
      2. 等號(hào)后面的命令一定要用 $(命令)語法包裝
      3. 引用 pid 變量的時(shí)候語法是 ${pid}如案例中的 if [ ${pid} ]; then

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)
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例
2、瀏覽器輸入自己的 test 接口,驗(yàn)證一下項(xiàng)目運(yùn)行情況
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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 &
純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

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

純手工搭建 GitaLab與Gitlab-CI/CD--附 gitlab-ci.yml示例

解決方案

  • 查看 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)致

附:

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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • DevOps系列文章 之 SpringBoot整合GitLab-CI實(shí)現(xiàn)持續(xù)集成

    DevOps系列文章 之 SpringBoot整合GitLab-CI實(shí)現(xiàn)持續(xù)集成

    在企業(yè)開發(fā)過程中,我們開發(fā)的功能或者是修復(fù)的BUG都需要部署到服務(wù)器上去,而這部分部署操作又是重復(fù)且繁瑣的工作,GitLab-CI 持續(xù)集成為我們解決了這一痛點(diǎn),將重復(fù)部署的工作自動(dòng)化,大大的節(jié)省了程序員們的寶貴時(shí)間。本文詳細(xì)講述了 GitLab-CI 持續(xù)集成的安裝、部署

    2024年02月13日
    瀏覽(23)
  • gitlab-ci.yml關(guān)鍵字(五)tags 、only 、when

    gitlab-ci.yml關(guān)鍵字(五)tags 、only 、when

    使用Tags用于選擇Runner的標(biāo)簽列表 我們?cè)趧?chuàng)建Runner 時(shí)可以給該Runner打上特定的標(biāo)簽,那后續(xù)流水線中的job如果需要使用特定標(biāo)簽的Runner執(zhí)行時(shí),就需要使用tags來標(biāo)記 比如這里有兩個(gè)標(biāo)簽的Runner 也可以對(duì)當(dāng)前的runner進(jìn)行一些配置上的設(shè)置 使用only / except 來控制何時(shí)創(chuàng)建

    2024年02月03日
    瀏覽(43)
  • error: unable to unlink old ‘.gitlab-ci.yml‘: Permission denied

    #gitlab-runner 執(zhí)行代碼git pull origin xxx 更新時(shí)候報(bào) error: unable to unlink old ‘.gitlab-ci.yml’: Permission denied 問題環(huán)境:centos 部署gitlab-runner 執(zhí)行腳本方式 選的shell 產(chǎn)生問題的原因:gitlab-runner程序進(jìn)程占用鎖定了.gitlab-ci.yml 解決方法:gitlab-runner stop 停止服務(wù)后,切換到 執(zhí)行g(shù)itlab-runn

    2024年02月10日
    瀏覽(23)
  • k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD

    k8s部署gin-vue-admin框架、gitlab-ci、jenkins pipeline 、CICD

    測(cè)試環(huán)境使用的jenkins 正式環(huán)境使用的gitlab-ci 創(chuàng)建yaml文件 啟動(dòng)服務(wù) 配置jenkins 配置nginx jenkins機(jī)器上的dockerfile yaml其它都一樣除了svc,因?yàn)閟vc需要綁定slb地址 啟動(dòng) 配置dockerfile 配置nginx 結(jié)果圖 原文

    2024年02月08日
    瀏覽(25)
  • 從0到1搭建屬于自己的Gitlab CI/CD平臺(tái)

    從0到1搭建屬于自己的Gitlab CI/CD平臺(tái)

    MCNU云原生 ,文章首發(fā)地,歡迎微信搜索關(guān)注,更多干貨,第一時(shí)間掌握! CI和CD是軟件開發(fā)中常用的縮寫,分別代表持續(xù)集成(Continuous Integration)和持續(xù)交付/持續(xù)部署(Continuous Delivery/Continuous Deployment)。它們是實(shí)現(xiàn)高效軟件交付流程的關(guān)鍵概念,Gitlab CI/CD是目前市場(chǎng)上應(yīng)

    2024年02月09日
    瀏覽(28)
  • 【基于 GitLab 的 CI/CD 實(shí)踐】01、GitLab CI/CD 基礎(chǔ)概念

    【基于 GitLab 的 CI/CD 實(shí)踐】01、GitLab CI/CD 基礎(chǔ)概念

    目錄 一、為什么要做 CI/CD ? 1.1 背景-傳統(tǒng)的應(yīng)用開發(fā)發(fā)布模式 問題 1.2 持續(xù)集成與持續(xù)交付 持續(xù)集成(CI) 持續(xù)交付(CD) 持續(xù)部署(CD) 1.3 CI/CD 的價(jià)值體現(xiàn) 1.4 推薦常用的 CI/CD 工具 Jenkins GitLab 二、GitLab CI/CD 功能簡(jiǎn)介 2.1 GitLab 內(nèi)置持續(xù)集成功能 持續(xù)集成(CI) 連續(xù)交付(

    2024年02月16日
    瀏覽(49)
  • gitlab CI/CD 安裝 gitlab runner

    gitlab CI/CD 安裝 gitlab runner

    一、為什么需要安裝gitlab runner ? 極狐GitLab Runner 是在流水線中運(yùn)行作業(yè)的應(yīng)用,與極狐GitLab CI/CD 配合運(yùn)作。 說白了就是你部署的一個(gè)agent。 二、如何安裝? 1.介紹通過helm部署github runner 2.helm添加倉庫 helm repo add gitlab https://charts.gitlab.io 3.拉取chars helm pull gitlab/gitlab-runner -- 拉

    2024年02月14日
    瀏覽(32)
  • Gitlab CI/CD概述

    Gitlab CI/CD概述

    CI/CD 是一種持續(xù)開發(fā)軟件的方法,可以不斷的進(jìn)行構(gòu)建、測(cè)試和部署代碼迭代更改。這種迭代有助于減少基于錯(cuò)誤或失敗的版本進(jìn)行開發(fā)新代碼的可能性。使用這種方法,從新代碼開發(fā)到部署,可以減少人工干預(yù)甚至不用干預(yù)。 達(dá)到持續(xù)的方法主要是: 持續(xù)集成 , 持續(xù)交付

    2024年02月12日
    瀏覽(22)
  • 【基于 GitLab 的 CI/CD 實(shí)踐】03、GitLab Pipeline 實(shí)踐(上)

    【基于 GitLab 的 CI/CD 實(shí)踐】03、GitLab Pipeline 實(shí)踐(上)

    目錄 一、GitLab Pipeline 流水線語法有哪些?流水線參數(shù)列表 如何檢查語法錯(cuò)誤?流水線語法檢測(cè) 二、Pipeline 基礎(chǔ)語法 job script before_script after_script stages 未定義 stages ?定義 stages 控制 stage 運(yùn)行順序 ? .pre .post stage variables 綜合實(shí)例(一) tags allow_failure when manual 手動(dòng) delayed 延遲

    2024年02月17日
    瀏覽(31)
  • 【基于 GitLab 的 CI/CD 實(shí)踐】02、gitlab-runner 實(shí)踐

    【基于 GitLab 的 CI/CD 實(shí)踐】02、gitlab-runner 實(shí)踐

    目錄 一、gitlab-runner 簡(jiǎn)介 1.1 要求 1.2 特點(diǎn) 二、GitLab Runner 安裝 2.1 使用 GItLab 官方倉庫安裝 2.2 使用 deb/rpm 軟件包 2.3 在容器中運(yùn)行 GitLab Runner 三、GitLab Runner 注冊(cè) 3.1 GitLabRunner 類型 3.2 獲取 runner token 獲取?shared?類型 runner token ? ?獲取?group?類型的 runner token ? ?獲取?speci

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包