(不知道為什么圖片壓縮那么小,看不清楚的話就請右鍵圖片->在新標簽頁打開)
安裝所需的包。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
獲取密碼
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