最近發現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安裝和使用不了解的朋友可以參考下《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即可登入;
將我們的SpringBoot應用程式碼上傳到Gitlab上去,這樣Gitlab就準備好了!這裡要注意的是,如果你在啟動Gitlab的時候沒有指定hostname的話,你的專案HTTP存取位址會是容器的ID,使用該位址會無法存取Git倉庫!
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-runner容器的內部;
docker exec -it gitlab-runner /bin/bash
在容器內使用以下指令註冊runner;
gitlab-runner register
註冊時會出現互動介面,提示你輸入註冊位址、token、執行器類型等訊息,ssh執行器能遠端執行Linux指令,非常好用,推薦使用這個!
註冊完成後,我們可以發現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成功註冊了!
SpringBoot專案打包需要依賴Maven,我們需要在伺服器上先安裝好它。
下載Maven的Linux安裝包,下載網址:https://maven.apache.org/down...
下載完成後使用如下命令解壓縮到指定目錄;
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"
CentOS上預設安裝的是JRE,使用Maven需要安裝JDK。
下載JDK 8,下載位址:https://mirrors.tuna.tsinghua...
下載完成後將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-runner采用的是ssh的执行器,它会登录到我们指定的服务器,执行我们在.gitlab-ci.yml中定义的script命令,在此之前还会先从Git仓库中获取代码,所以我们还需修改下服务器上的host文件;
vim /etc/hosts 192.168.7.134 git.macrozheng.com
接下来就是要把脚本提交到Git仓库上去,提交后会在Project->CI/CD->Pipelines中发现正在执行的任务;
打开Pipeline的详情页面,可以发现我们定义的两个任务都已经执行成功了;
打开Job的详情界面,我们可以看到任务执行过程中输出的日志信息;
如果你想手动执行Pipeline,而不是提交触发的话,可以在Pipelines页面点击Run Pipeline按钮即可;
运行成功后,可以通过如下地址访问项目:http://192.168.7.134:8088/swa...
如果你用Gitlab作为Git仓库的话,使用它的CI/CD功能来实现自动化部署确实很不错!安装一个轻量级gitlab-runner,编写简单的.gitlab-ci.yml脚本文件即可实现。其实我们之前以及介绍过很多种自动化部署方案,比如Jenkins、Gogs+Drone、Gitlab CI/CD,我们可以发现一个共同点,这些方案都离不开Linux命令。 所以说要想玩转自动化部署,还是得先玩转Linux命令!
相关视频教程推荐:Java视频教程
以上是再不用Gitlab的CI/CD功能,你就out了的詳細內容。更多資訊請關注PHP中文網其他相關文章!