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

Posted vingb2by

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 705105278/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

 

以上是关于Docker+Jenkins+Go完成自动化部署的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins自动部署

node项目自动化部署--基于Jenkins,Docker,Github自动化部署

Docker+Jenkins打造自动化测试以及部署升级环境

使用gogs,drone搭建自动部署

Drone-比Jenkins更轻量化的持续集成部署工具

从0到1体验Jenkins+Docker+Git+Registry实现CI自动化发布