Docker+Jenkins+Go完成自动化部署
(不知道为什么图片压缩那么小,看不清楚的话就请右键图片->在新标签页打开)
安装所需的包。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