1. 程式人生 > >Gitlab + Jenkins 構建,釋出一個基於Go的Gin測試專案

Gitlab + Jenkins 構建,釋出一個基於Go的Gin測試專案

### 部署Go專案簡介 > 對於golang的釋出,之前一直沒有一套規範的釋出流程,來看看之前釋出流程: #### 方案一 ``` • 開發者本地環境需要將環境變數檔案改為正式環境配置 • 編譯成可執行檔案 • 傳送給運維 • (運維)將檔案覆蓋為線上 • (運維)重啟程序 (可謂“又臭又長”) ``` #### 方案二 ``` 開發者將程式碼commit到gitlab上交給運維同學 (運維)pull程式碼 (運維)編譯成可執行檔案 (運維)覆蓋線上檔案 (運維)重啟程序 ``` > 這種對於運維屬於重度依賴,而運維同學又需要去關心程式碼的編譯,增加了運維同學的工作了。 > > > > 以上兩種方案都是之前專案中發生過的,對於發版來說可謂是一種“噩夢”,易出錯,流程長,運維要是不在根本無法操作。 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609068353657-181c94ba-d236-48d7-9a33-3e49533689e5.png) ### 部署GitLab環境 **部署gitlab請看我前面寫的文章** https://www.cnblogs.com/you-men/p/13126530.html ### 部署Jenkins環境 #### 環境清單 ``` * CentOS 7.3 * git-2.9.5.tar.gz * Jenkins 2.203.war * apache-tomcat-9.0.12.tar.gz * jdk-8u151-linux-x64.tar.gz * apache-maven-3.5.4-bin.tar.gz ``` #### 初始化 ``` mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/CentOS-* /etc/yum.repos.d/backup curl -o /etc/yum.repos.d/163.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo &>/dev/null curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo yum -y install ntpdate ntpdate -b ntp1.aliyun.com setenforce 0 sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config systemctl stop firewalld systemctl disable firewalld sed -i '/^GSSAPIAu/ s/yes/no/' /etc/ssh/sshd_config sed -i '/^#UseDNS/ {s/^#//;s/yes/no/}' /etc/ssh/sshd_config ``` #### 下載git.tar包安裝 ``` # Jenkins支援的git最低版本是1.8,使用rpm安裝版本是1.8,這裡採用原始碼安裝使用2.9版本 # git官網下載最新版本GIT: # https://mirrors.edge.kernel.org/pub/software/scm/git/ # 安裝git 依賴包 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker rpm -e git --nodeps # 解除安裝掉老版本git tar xvf git-2.9.5.tar.gz -C /usr/local/src/ cd /usr/local/src/git-2.9.5/ make prefix=/usr/local/git all make prefix=/usr/local/git install # 修改/etc/bashrc配置檔案末尾加入下面一行環境變數(建議針對使用者生效,否則使用其他使用者時候容易出問題) tail -1 /etc/bashrc export PATH=$PATH:$HOME/bin:/usr/local/git/bin source /etc/bashrc # 測試是否安裝成功 git --version git version 2.9.5 ``` #### JDK環境部署 ``` # jenkins對jdk版本有要求,不能用jdk9和10,且需要將系統自帶的java環境清楚掉 # jdk下載地址 # http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html # 解除安裝系統自帶的java環境 [root@jenkins-8 git-2.9.5]# rpm -qa |grep jdk [root@jenkins-8 git-2.9.5]# java bash: java: 未找到命令 # 解壓安裝jdk tar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/ cd /usr/local/ mv jdk1.8.0_151/ jdk # 修改/etc/bashrc配置檔案,末尾加入下面一行環境變數. tail -2 /etc/bashrc JAVA_HOME=/usr/local/jdk export PATH=$PATH:$JAVA_HOME/bin source /etc/bashrc java -version # 儘量不要用openjdk java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) ``` #### 部署jenkins ``` # war包部署 # cp jenkins.war /usr/local/tomcat/webapps/ # 停掉tomcat在啟動一遍 # 將Jenkins的war放到tomcat的webapps下面,重啟一下tomcat自己就解壓了,但是訪問可能有點慢 # 也可以通過jar包直接啟動jenkins java \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=12345 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname="192.168.8.2 " \ -jar jenkins-2.138.3.war & # 也可以用jenkins的rpm包安裝 wget https://pkg.jenkins.io/redhat-stable/jenkins-2.222.1-1.1.noarch.rpm rpm -ivh jenkins-2.150.1-1.1.noarch.rpm # Jenkins配置 grep -v "#" /etc/sysconfig/jenkins | grep -v "^$" JENKINS_HOME="/var/lib/jenkins" JENKINS_JAVA_CMD="" JENKINS_USER="root" JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port=12345 \ -Dcom.sun.management.jmxremote.authenticate=false \ -Dcom.sun.management.jmxremote.ssl=false \ -Djava.rmi.server.hostname="149.129.38.117" " JENKINS_PORT="8080" JENKINS_LISTEN_ADDRESS="" JENKINS_HTTPS_PORT="" JENKINS_HTTPS_KEYSTORE="" JENKINS_HTTPS_KEYSTORE_PASSWORD="" JENKINS_HTTPS_LISTEN_ADDRESS="" JENKINS_DEBUG_LEVEL="5" JENKINS_ENABLE_ACCESS_LOG="no" JENKINS_HANDLER_MAX="100" JENKINS_HANDLER_IDLE="20" JENKINS_ARGS="" # 如果啟動報錯一般是你java不是openjdk的,修改下java路徑即可 vim /etc/init.d/jenkins candidates=" /etc/alternatives/java /usr/lib/jvm/java-1.8.0/bin/java /usr/lib/jvm/jre-1.8.0/bin/java /usr/lib/jvm/java-1.7.0/bin/java /usr/lib/jvm/jre-1.7.0/bin/java /usr/bin/java /usr/local/jdk/bin/java # 加上你的Java路徑即可 " ``` ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304802-3edc7535-6e97-40d1-8083-200f269998ab.png) ``` cat /root/.jenkins/secrets/initialAdminPassword # 這個密碼以後可能會用到最後記下來,這個檔案往後初始化就沒有了 2775b0adf72e42a5bdea22297b81dd82 # 2> 複製密碼上面進入下一步會出現一個頁面安裝外掛圖2, # 我們不弄太複雜,就安裝推薦的外掛, # 安裝時間較長,請準備良好的網路環境,可能需要FQ ``` ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304827-e091c9c4-924c-4f16-aafb-cd1c3a8e274b.png) ``` /# 可能因為網路波動+jenkins源是國外的,會安裝失敗,重試幾次, # 如果還不行換伺服器,比如雲伺服器,或者換源,圖3 ``` ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304827-5d3f5919-2dac-4570-9535-693350e8c784.png) ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304910-8d07fbd5-92fb-425e-b049-ca13fb80adb1.png) **至此,就可以開始使用Jenkins了** ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304818-a5158246-07ad-4b9e-8d20-c5de5f0f1fbb.png) ![image](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609063304874-deec7c0b-9043-4de3-b3f5-09de54513b93.png) ** ** ### 建立配置Gitlab專案 #### 新建project ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609067639877-8f8f2eaf-1db0-4b25-af34-0b9088d7f41e.png) #### Gitlab倉庫新增jenkins主機的公鑰 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609072838863-dc49b622-a3db-4684-9295-38e9584fef2b.png) #### 關掉Gitlab預設的Devops管道 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609072739416-aab5f304-3ea4-485b-9c0d-0232f3e90f04.png) ### 建立配置jenkins專案 #### 建立jenkins專案 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609072893846-e90c8652-f7b7-4818-9af1-82096e6ec20d.png) #### 填寫gitlab的git地址 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609072930391-b2420deb-25b6-47df-8d21-ee7703a1b440.png) #### 新增jenkins憑據 **此處憑據寫jenkins的私鑰** **![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609073032630-117cfe94-8b62-4e99-8c5f-0d1cf2a7f006.png)** #### 儲存測試jenkins專案拉取 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609073077752-c4c11113-1add-43fb-86ad-ea6b33d4a959.png) ### jenkins配置go環境和外掛 #### 安裝go環境 ``` tar xf go1.15.6.linux-amd64.tar.gz -C /usr/local/ mkdir /home/app tail -6 /etc/profile export GOROOT=/usr/local/go export GOPATH=/home/app/GoProject export GOBIN=$GOPATH/bin export PATH=$PATH:$GOROOT/bin export PATH=$PATH:$GOPATH/bin export GOPROXY=https://goproxy.cn,direct source /etc/profile golang1.13可以直接進行 # 七牛雲 go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct # 阿里雲 go env -w GO111MODULE=on go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct ``` > GOROOT:Go安裝後的根目錄,解壓的時候解壓Go安裝包的路徑,安裝過程中會由安裝程式自動寫入系統環境變數中。Go語言自帶的類庫。 > > > > GOBIN:Go的二進位制檔案存放目錄。 > > > > GOPATH:Go的工作空間(自己定義的goProject目錄)工作空間是一個目錄層次結構,根目錄包含三個子目錄: > > > > src:包含Go原始檔(例如:.go、.c、.h、.s 等) > > > > pkg:包含包物件,編譯好的庫檔案(例如:.a) > > > > bin:包含可執行命令(為了方便,可以把此目錄加入到 系統的 PATH 變數中,在環境變數 PATH 後追加 %GOPATH%\bin) > > > > PATH:需要將%GOBIN% 加在 PATH 變數的最後,方便在命令列下執行。 **驗證Go結果** ``` [root@jenkins src]# go version go version go1.15.6 linux/amd64 ``` #### 建立go測試程式碼 ``` [root@jenkins ~]# mkdir -p /home/app/GoProject/src [root@jenkins src]# git clone [email protected]:root/go_test1.git [root@jenkins src]# cd /home/app/GoProject/src/go_test1 [root@jenkins test1]# go mod init go_test1 [root@jenkins test1]# cat main.go package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.JSON(200,gin.H{ "message": "Hello World", }) }) r.Run(":10080") } [root@jenkins go_test1]# go run main.go [root@jenkins ~]# curl localhost:10080 {"message":"Hello World"} ``` #### 上傳程式碼到gitlab專案 ``` [root@jenkins go_test1]# git add . [root@jenkins go_test1]# git config --global user.email "[email protected]" [root@jenkins go_test1]# git config --global user.name "admin" [root@jenkins go_test1]# git commit -m "add main.go v0.1" [master 8492f92] add main.go v0.1 3 files changed, 57 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go [root@jenkins go_test1]# git push Counting objects: 5, done. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 2.36 KiB | 0 bytes/s, done. Total 5 (delta 0), reused 0 (delta 0) To 192.168.43.235:root/go_test1.git 4dbaa3a..8492f92 master -> master ``` ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609078454912-4c61dd50-2b57-4659-9392-d9dc67f52a81.png) #### 配置jenkins的Go全域性工具 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609078833373-7cd8886e-e6b7-4759-9242-dad56d39dcc3.png) #### 配置jenkins構建引數 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609082092653-27ff49da-a13e-438a-af73-55569f74d86e.png) #### 構建Go專案並執行測試 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609082114920-7744ff9e-4cdb-4203-b019-9cfbadd67220.png) ### 配置Nginx反代訪問服務 #### 安裝配置Nginx ``` yum -y install nginx vim /etc/nginx/nginx.conf location / { proxy_pass http://localhost:10080; } nginx ``` #### 驗證服務 ![image.png](https://cdn.nlark.com/yuque/0/2020/png/2579212/1609082461111-9339f8a4-f488-4c23-bcf8-3ca2222803