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

原文地址:https://www.cnblogs.com/VingB2by/p/12081157.html

时间: 2024-11-08 09:35:04

Docker+Jenkins+Go完成自动化部署的相关文章

centos7+docker+Jenkins+svn搭建自动化部署平台

centos7+docker+Jenkins+svn搭建自动化部署平台 1. centos7 参考链接:http://www.macrozheng.com/#/reference/linux_install tips 公司服务器配置(1T机械+256固态+i7的u) 需要我们把系统,环境(java,mysql,redis,docker等)装到固态上(速度快),我们的代码放到机械上.分区情况如下图 2. centos7中安装docker1.31.1 自行百度,此处无坑 3. centos7安装配置

Jenkins+Gitlab+Ansible自动化部署(六)

Pipeline Job实现Nginix+MySQL+PHP+Wordpress实现自动化部署交付(Jenkins+Gitlab+Ansible自动化部署(五)https://www.cnblogs.com/zd520pyx1314/p/10249094.html) 环境准备 编写ansible playbook脚本实现Wordpress远程部署 将wordpress源码与playbook部署脚本提交到gitlab仓库 编写pipeline job脚本实现Jenkins流水线持续交付流程 Jen

Linux-GitLab+Jenkins持续集成+自动化部署

GitLab+Jenkins持续集成+自动化部署 什么是持续集成? (1)Continuous integration (CI) 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员至少集成一次,也就意味着每天可能会发生多次集成.每次集成都通过自动化的构建(包括编译.发布.自动化测试)来验证,从而尽快地发现集成错误.许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件. (2)没有持续集成 项目做模块集成的时候,发现很多接口都不通==>浪费大量时间 需

Jenkins+Ansible+Gitlab自动化部署三剑客

最近一直在学习Ansible的一些playbook的写法, 所以一直没有怎么更新, 想到目前大家对诸如saltstack, docker, Ansible等自动化部署相关的工具很感兴趣, 但又苦于没有可学习的中文实例, 这里我就把我这几个月所接触到目前国外比较流行的部署经验给大家分享一下. 首先给大家介绍的是Ansible, 恩, 重要的问题说三遍, 不是Saltstack, Ansible作为一个python写的自动化部署工具, 确实较之前我所接触的Chef, saltstack, puppe

基于Jenkins+Gitlab的自动化部署实战

故事背景 一个中小型企业,是典型的互联网公司,当初期的时候可能运维只能标配到2~3人,此时随着公司的发展,项目会逐渐增多.前期部署项目可能都是手动的, 俗称"人肉部署",这简直是无比的痛苦,不能忍受的.这样开发的时间也会耽误,运维的时间也会耽误,全都浪费在这些重复性的工作上面,毫无价值可言, 这时候运维终于忍受不了,上了脚本.但是慢慢的发现项目依旧在增长,脚本每次还要更改给开发,效率低下,后来测试环境以及开发环境直接上了jeknins, 每台开发机器是jeknins agent端,自此

jenkins + pipeline构建自动化部署

一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息以steps的方式放在一个脚本里,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程,形成流水式发布,构建步骤视图化.简单来说,Pipeline适用的场景更广泛,能胜任更复杂的发布流程.举个例子,job构建工作在master节点,自动化测试脚本在slave节点,这时候je

Jenkins+Ansible+Gitlab自动化部署三剑客(二)--ansible

Ansible简介 Ansible是一个开源部署工具 开发语言:python 特点:SSH协议通讯,全平台,无需编译,模块化部署管理 作用:推送Playbook进行远程节点快速部署 Ansible与Chef,Saltstack的区别 Chef Ruby语言编写,C/S架构,配置需要Git依赖,Recipe脚本编写规范,需要编程经验 Saltstack Python语言编写,C/S架构,模块化配置管理,YAML脚本编写规范,适合大规模集群部署 Ansible Python语言编写,无Client,

Jenkins+Ansible+Gitlab自动化部署三剑客(五)--Jenkins 参数集成

Jenkins 参数集成 1.新建项目 2.添加选项 #!/bin/sh echo "Current deploy environment is $deploy_env" echo "The build is $version" echo "The paasword is $pass" if $bool then echo "Request is approved" else echo "Request is rej

Jenkins+Ansible+Gitlab自动化部署三剑客(八)--Jenkins ansible集成

Jenkins Ansible集成 准备工作 参考https://www.cnblogs.com/bk770466199/p/12259007.html完成以下准备工作 需要在jenkins服务器上,配置ansible2.5+python 3.6虚拟环境 配置jenkins.example.com主机到test.example.com主机的ssh免秘钥认证 配置ansible,创建testservers文件 1.新建项目 2.添加shell #!/bin/sh set +x source /ho