首頁 > Java > java教程 > 主體

再不用Gitlab的CI/CD功能,你就out了

醉折花枝作酒筹
發布: 2021-07-30 17:12:12
轉載
3504 人瀏覽過

最近發現Gitlab的CI/CD功能也能實現自動化部署,而且用起來也挺簡單!如果你使用的是Gitlab作為Git倉庫的話,不妨試試它的CI/CD功能。本文還是以SpringBoot的自動化部署為例,實作下Gitlab的CI/DI功能。

SpringBoot實戰電商專案mall(50k star)網址:https://github.com/macrozheng/mall

安裝

透過Gitlab的CI/CD功能實現自動化部署,我們需要安裝Gitlab、Gitlab Runner、Maven這些服務。

安裝Gitlab

首先我們來安裝下Gitlab,對Gitlab安裝和使用不了解的朋友可以參考下《10分鐘搭建自己的Git倉庫》 。

使用以下指令執行Gitlab服務,這裡要注意的是新增了hostname屬性,這樣我們就可以透過網域名稱來存取Gitlab了(為了避免一些不必要的麻煩),GITLAB_ROOT_PASSWORD這個環境變數可以直接設定Gitlab中root帳號的密碼;

docker run --detach \
  --hostname git.macrozheng.com \
  --publish 10443:443 --publish 1080:80 --publish 1022:22 \
  --name gitlab \
  --restart always \
  --volume /mydata/gitlab/config:/etc/gitlab \
  --volume /mydata/gitlab/logs:/var/log/gitlab \
  --volume /mydata/gitlab/data:/var/opt/gitlab \
  -e GITLAB_ROOT_PASSWORD=12345678 \
  gitlab/gitlab-ce:latest
登入後複製

我們需要透過git.macrozheng.com這個網域來存取Gitlab,如果你沒有網域的話,可以透過修改本機的host檔案來實現;

192.168.7.134 git.macrozheng.com
登入後複製

由於我們的Gitlab運行在1080端口上,我們想要不加端口來訪問,可以使用Nginx來反向代理下,對Nginx不熟悉的朋友可以看下《Nginx的這些妙用,你肯定有不知道的! 》 ,在Nginx的設定資料夾中加入git.conf設定文件,內容如下:

server {
    listen       80; # 同时支持HTTP
    server_name  git.macrozheng.com; #修改域名

    location / {
        proxy_pass   http://192.168.7.134:1080; # 设置代理服务访问地址
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
登入後複製

之後我們就可以透過git.macrozheng.com這個網域來存取Gitlab了,輸入帳號密碼root:12345678即可登入;

再不用Gitlab的CI/CD功能,你就out了

將我們的SpringBoot應用程式碼上傳到Gitlab上去,這樣Gitlab就準備好了!這裡要注意的是,如果你在啟動Gitlab的時候沒有指定hostname的話,你的專案HTTP存取位址會是容器的ID,使用該位址會無法存取Git倉庫!

再不用Gitlab的CI/CD功能,你就out了

安裝Gitlab Runner

Gitlab只是個程式碼倉庫,想要實作CI/CD還要安裝gitlab-runner,gitlab-runner相當於Gitlab中任務的執行器,Gitlab會在需要執行任務時呼叫它。

先下載gitlab-runner的Docker映像,選用alpine-bleeding,這個版本非常小巧!

docker pull gitlab/gitlab-runner:alpine-bleeding
登入後複製

使用以下指令執行gitlab-runner;

docker run --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /mydata/gitlab-runner:/etc/gitlab-runner \
-d gitlab/gitlab-runner:alpine-bleeding
登入後複製

此時我們如果查看gitlab-runner的容器日誌的話,會發現如下錯誤,config.toml檔案找不到,這個問題不必擔心,當我們將gitlab-runner註冊到Gitlab時,會自動產生該檔案;

ERROR: Failed to load config stat /etc/gitlab-runner/config.toml: no such file or directory  builds=0
登入後複製

接下來我們需要把gitlab-runner註冊到Gitlab,開啟Project->Settings->CI/ CD功能,取得到runner註冊需要使用的位址和token;

再不用Gitlab的CI/CD功能,你就out了

接下來使用以下指令,進入gitlab-runner容器的內部;

docker exec -it gitlab-runner /bin/bash
登入後複製

在容器內使用以下指令註冊runner;

gitlab-runner register
登入後複製

註冊時會出現互動介面,提示你輸入註冊位址、token、執行器類型等訊息,ssh執行器能遠端執行Linux指令,非常好用,推薦使用這個!

再不用Gitlab的CI/CD功能,你就out了

註冊完成後,我們可以發現config.toml檔案已經生成,內容如下,以後想修改runner設定的時候,直接改這個檔案就行了。

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "docker-runner"
  url = "http://192.168.7.134:1080/"
  token = "c2kpV6tX6woL8TMxzBUN"
  executor = "ssh"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.ssh]
    user = "root"
    password = "123456"
    host = "192.168.7.134"
    port = "22"
登入後複製

在Gitlab的CI/CD設定中,我們可以發現,有個runner成功註冊了!

再不用Gitlab的CI/CD功能,你就out了

安裝Maven

SpringBoot專案打包需要依賴Maven,我們需要在伺服器上先安裝好它。

下載Maven的Linux安裝包,下載網址:https://maven.apache.org/down...

再不用Gitlab的CI/CD功能,你就out了

下載完成後使用如下命令解壓縮到指定目錄;

cd /mydata
tar -zxvf apache-maven-3.8.1-bin.tar.gz
登入後複製

修改/etc/profile文件,新增環境變數配置:

export MAVEN_HOME=/mydata/apache-maven-3.8.1
export PATH=$PATH:$MAVEN_HOME/bin
登入後複製

透過查看Maven版本來測試是否安裝成功。

mvn -v
登入後複製
Maven home: /mydata/apache-maven-3.8.1
Java version: 1.8.0_292, vendor: AdoptOpenJDK, runtime: /mydata/java/jdk1.8/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-957.el7.x86_64", arch: "amd64", family: "unix"
登入後複製

安裝JDK

CentOS上預設安裝的是JRE,使用Maven需要安裝JDK。

下載JDK 8,下載位址:https://mirrors.tuna.tsinghua...

再不用Gitlab的CI/CD功能,你就out了

下載完成後將JDK解壓縮到指定目錄;

cd /mydata/java
tar -zxvf OpenJDK8U-jdk_x64_linux_xxx.tar.gz
mv OpenJDK8U-jdk_x64_linux_xxx.tar.gz jdk1.8
登入後複製

在/etc/profile檔案中新增環境變數JAVA_HOME。

vi /etc/profile
# 在profile文件中添加
export JAVA_HOME=/mydata/java/jdk1.8
export PATH=$PATH:$JAVA_HOME/bin
# 使修改后的profile文件生效
. /etc/profile
登入後複製

使用

一切准备就绪,接下来通过Gitlab的CI/CD功能就可以实现SpringBoot应用的自动化部署了!

首先在项目的根目录下添加.gitlab-ci.yml文件,定义了两个任务,一个任务会将应用代码打包成Jar包并复制到指定目录,另一个任务会通过运行脚本run.sh打包应用的Docker镜像并运行;

# 打包任务
build-job:
  stage: build
  # 指定标签,只有具有该标签的runner才会执行
  tags:
    - docker
  script:
    # 使用Maven打包
    - mvn clean package
    # 将jar包、Dockerfile、运行脚本复制到指定目录
    - cp target/mall-tiny-gitlab-1.0-SNAPSHOT.jar /mydata/build/mall-tiny-gitlab-1.0-SNAPSHOT.jar
    - cp Dockerfile /mydata/build/Dockerfile
    - cp run.sh /mydata/build/run.sh

# 部署任务
deploy-job:
  stage: deploy
  tags:
    - docker
  script:
    # 进入指定目录并执行运行脚本
    - cd /mydata/build
    - chmod +x run.sh
    - ./run.sh
登入後複製

这里值得一提的是,默认情况下runner只会执行具有相同标签的Job,由于我们对Job和runner都设置了标签为docker,所以我们这里是可以执行的。如果你没有设置标签的话,需要在runner的编辑界面设置下让runner可以执行没有标签的Job;

再不用Gitlab的CI/CD功能,你就out了

由于我们的gitlab-runner采用的是ssh的执行器,它会登录到我们指定的服务器,执行我们在.gitlab-ci.yml中定义的script命令,在此之前还会先从Git仓库中获取代码,所以我们还需修改下服务器上的host文件;

vim /etc/hosts
192.168.7.134 git.macrozheng.com
登入後複製

接下来就是要把脚本提交到Git仓库上去,提交后会在Project->CI/CD->Pipelines中发现正在执行的任务;

再不用Gitlab的CI/CD功能,你就out了

打开Pipeline的详情页面,可以发现我们定义的两个任务都已经执行成功了;

再不用Gitlab的CI/CD功能,你就out了

打开Job的详情界面,我们可以看到任务执行过程中输出的日志信息;

再不用Gitlab的CI/CD功能,你就out了

如果你想手动执行Pipeline,而不是提交触发的话,可以在Pipelines页面点击Run Pipeline按钮即可;

再不用Gitlab的CI/CD功能,你就out了

运行成功后,可以通过如下地址访问项目:http://192.168.7.134:8088/swa...

再不用Gitlab的CI/CD功能,你就out了

总结

如果你用Gitlab作为Git仓库的话,使用它的CI/CD功能来实现自动化部署确实很不错!安装一个轻量级gitlab-runner,编写简单的.gitlab-ci.yml脚本文件即可实现。其实我们之前以及介绍过很多种自动化部署方案,比如Jenkins、Gogs+Drone、Gitlab CI/CD,我们可以发现一个共同点,这些方案都离不开Linux命令。 所以说要想玩转自动化部署,还是得先玩转Linux命令!

相关视频教程推荐:Java视频教程

以上是再不用Gitlab的CI/CD功能,你就out了的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:segmentfault.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!