zoukankan      html  css  js  c++  java
  • 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

     

  • 相关阅读:
    c# 并行运算二
    c# 并行运算
    Task+http请求
    Task多线程
    SSO系统认证
    web系统权限设计
    AutoMapper的使用
    中间件
    express-middleware
    中间件概念
  • 原文地址:https://www.cnblogs.com/VingB2by/p/12081157.html
Copyright © 2011-2022 走看看