Docker+Jenkins+Go完成自動化部署


安裝docker

(不知道為什么圖片壓縮那么小,看不清楚的話就請右鍵圖片->在新標簽頁打開)

安裝所需的包。yum-utils提供了yum-config-manager 效用,並device-mapper-persistent-data和lvm2由需要 devicemapper存儲驅動程序。

yum install -y yum-utils \ device-mapper-persistent-data \ lvm2

使用以下命令設置穩定存儲庫。

yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo

安裝DOCKER CE

yum install docker-ce docker-ce-cli containerd.io

啟動docker

systemctl start docker

檢查

docker version

 

安裝Jenkins

下載jenkins.war包

mkdir jenkins

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

安裝jdk環境

yum install -y java-1.8.0-openjdk-devel.x86_64

后台運行jenkins

nohup java -jar jenkins.war --httpPort=8080 &> jenkins.log &

檢查

java -version

 

配置jenkins

登錄jenkins

http://ip:8080

 
獲取密碼

cat /var/lib/jenkins/secrets/initialAdminPassword

把取到的內容復制到網頁中

等待配置下載完成並根據指引完成

 
添加插件

系統管理->插件管理->可選插件

安裝下面兩個插件

Build Authorization Token Root Plugin

Go Plugin

選擇直接安裝然后等待完成后重啟,等待安裝完成

 
設置GitHub access toekn

登錄GitHub->點擊右上角自己的頭像->Developer settings->Personal access tokens->Generate new token

按照圖片內容設置hook,然后點擊Generate token

會返回到上一層頁面,會有一串新的token出現,復制並保存下來,最好先保存在某個文件中或者當成某個文件名

 
設置GitHub webhook

登錄GitHub->進入對應的項目->Settings->Webhooks->Add webhook

Payload URL:http://ip:8080/github-webhook/

Content type:application/json

Sercet:上一步獲得的token

選擇Just the push event

打勾Active

 

修改系統配置

系統管理->系統配置

找到GitHub

添加GitHub Server

名稱隨便

API URL:https://api.github.com

憑據:

添加->jenkins

類型:Secret text

Secret:上兩步獲得的token

ID:可以選擇自己的Github賬戶名

描述:github access token

點擊添加->在下拉欄找到並選擇

點擊連接測試,如果有問題檢查步驟

點擊保存

 

新建項目

選擇新建任務

任務名稱自由填寫

選擇構建一個自由風格的軟件項目

打勾GitHub項目

項目URL填寫GitHub項目主頁網址即可

 
源碼管理

 

選擇Git

Repository URL:git clone使用的 web URL,選擇HTTPS模式

Credentials:

添加一個新憑據

類型選擇Usename with password

用戶名是Github登錄賬號

密碼是Github登錄密碼

源碼庫瀏覽器選擇githubweb

URL填寫GitHub項目主頁網址

 
構建觸發器

打勾GitHub hook trigger for GITScm polling

輪詢可以不打勾,填寫具體規則可以上網查詢,我填寫的是H 5 * * *(注意空格),即每天五點進行構築

 
構築環境

打勾Use secret text or file

變量不填寫

憑據可以直接選擇github access token,如果沒有可以同第二步修改系統配置部分一樣設置,雖然之后會出現兩個

打勾 Set up Go programming language tools並選擇對應Go版本

如果沒有請檢查是否安裝插件

 
構築

選擇執行Shell,命令輸入

chmod 777 ./build
./build

 

保存即可

 

上傳文件並檢查構築

准備三個文件

main.go

package main
​
import (
    "net/http"
)
​
func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Here is the home page."))
    })
    http.ListenAndServe(":80", nil)
}

build.sh

#!/bin/bash
​
IMAGE="go_gp:latest"
​
# 編譯鏡像
docker build -t $IMAGE .
​
docker stop go_gp
​
docker run -d --name=go_gp --rm -p 80:80 $IMAGE
​
# 清理
docker rmi $IMAGE

Dockerfile(注意大小寫)

#鏡像
FROM golang:1.12.14
#將服務器的go工程代碼加入到docker容器中
​
RUN mkdir -p /src/GP
​
COPY . /src/GP
​
WORKDIR /src/GP
​
RUN go build main.go
​
RUN chmod 777 main
​
CMD ["./main"]

然后push上項目檢測一下

push完畢后會看到jenkins開始構築,可以進入控制台看輸出,第一次構築因為要下載go的鏡像,會比較慢,success后輸入ip查看已經是有正常顯示了

 

上傳鏡像

除了可以自己制作鏡像,也可以上傳鏡像到雲,然后直接pull下來,就不用每次都構築了。

這里我選用的是騰訊雲,創建使用起來也很簡單,阿里雲、DockerHub以及其他的都是類似的,可以類推。

登錄騰訊雲->雲產品->容器服務->鏡像倉庫->我的鏡像

先新建一個命名空間,然后再新建一個鏡像,點名稱進入,左上角會有一個使用指引

根據使用指引先在服務器上登錄騰訊雲

然后修改build.sh

#!/bin/bash
​
IMAGE="ccr.ccs.tencentyun.com/go_gp/go_gp:latest"
​
# 編譯鏡像
docker build -t $IMAGE .
​
docker stop go_gp
​
docker run -d --name=go_gp --rm -p 80:80 $IMAGE
​
#docker tag go_gp $IMAGES
​
# 上傳鏡像 (請提前登錄好,docker login 只需登錄一次)
docker push $IMAGE
​
# 清理
docker rmi $IMAGE

再次上傳,然后查看,成功!

問題匯總

所有問題都是在jenkins控制台可以檢查看到,一路遇到的問題蠻多的,處理了兩三天好累,重點是如何搜索找到重點並自我分析,真的是一次學習了,雖然又要實習一直惦記着,回來就做這個真的好累...

build文件運行權限不足
+ ./build
/tmp/jenkins9038043293867322353.sh: line 2: ./build: Permission denied

這個問題是因為拉去下來的build文件沒有權限,加上一行chmod 777 ./build解決

 

docker連接不到docker daemon

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.40/containers/create: dial unix /var/run/docker.sock: connect: permission denied.

這個問題是因為jenkins用戶沒有sudu權限,可以修改build文件在每個docker命令前加上sudo

我選擇的是修改用戶組,這樣就不用修改build文件了

在服務器上輸入

sudo groupadd docker
sudo gpasswd -a $USER docker
newgrp docker
 

push驗證失敗

denied: requested access to the resource is denied

這個是因為命令是以jenkins的名義執行的,因此無法直接在jenkins賬戶完成登錄,使用root賬戶完成登錄,將/root/目錄下的.docker目錄復制到/var/lib/jenkins,修改文件夾權限

#參照騰訊雲使用指引
docker login xxx
cp /root/.docker /var/lib/jenkins
cat /root/.docker/config.json
#復制內容
vim /var/lib/jenkins/config.json
#粘貼然后:wq保存退出
#修改權限
chown -R jenkins.jenkins .docker
 

鏡像運行出錯

standard_init_linux.go:211: exec user process caused "no such file or directory"

這個是自己的疏漏,一開始以為是什么亂七八糟的問題,上網查了很久,最后在檢查之后發現是配置中忘了把Set Go打勾了,把這個勾上就成功了

 

容器設置失敗

docker: Error response from daemon: Conflict. The container name "/go-test" is already in use by container "6c48161cfeb858d0a53b9ca2ddd9440638f2bce6609698085d447d04e50a1725". You have to remove (or rename) that container to be able to reuse that name.

這個是因為docker run了相同名字的容器導致的出錯,需要先docker stop <運行中的容器ID>,再docker rm <運行的容器ID>,然后再重新構築或者docker run即可

 
PS:中途用到學習了最后沒用上的Shell命令記錄
#刪除./src
#rm -rf ./src
#創建./src文件夾
#if [ ! -d src  ];then
#  mkdir src
#else
#  echo src has exist
#fi
#mv * ./src !(.src/)
#遍歷當前目錄下文件並移動到./src文件夾
#for f in $(ls .)
#do
#    #echo $f
#    if [ $f != "src"  ]
#    then
#        mv -f $f ./src
#    fi
#done

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM