jenkins部署go项目

docker安装jenkins

docker run -u root  -d  -p 8888:8080 -v /docker/jenkins_home:/var/jenkins_home --privileged=true  --name jenkins    jenkins/jenkins:latest
 
run:
	docker run -u root -d 	-p 8088:8080 	-p 50000:50000 \
	--privileged=true -e TZ="Asia/Shanghai" \
	-v /Users/chen/data/docker/jenkins:/var/jenkins_home \
	-v /var/run/docker.sock:/var/run/docker.sock \
	-v /usr/local/bin/docker:/usr/bin/docker \
	--name jenkins \
	jenkins/jenkins:lts

说明:
-v /Users/chen/data/docker/jenkins:/var/jenkins_home 挂载jenkins的home目录,jenkins安装的插件,拉取的项目代码都在这个目录里
-v /var/run/docker.sock:/var/run/docker.sock-v /usr/local/bin/docker:/usr/bin/docker 挂载这两个文件就能在docker容器内访问宿主机上的docker。官方文档里有说明

容器内安装必备软件

#等待3分钟后,我们进入Jenkins容器内    
 docker exec -it jenkins /bin/bash
#更新                          
apt-get update
#安装GCC跟VIM :                
apt install vim            
apt install gcc

jenkins安装插件

系统管理=》插件管理

查询pipeline,docker pipeline

构建自动化项目

创建凭据

点击添加凭据

获取凭据id记录下来

创建流水线任务

配置流水数据

创建后面脚本中需要用到的参数

我这创建了四个参数:

  • 部署环境:profile
  • 服务部署ip:host
  • 连接服务器端口:port
  • 连接服务器用户名:username
  • 部署服务端口:expose_port
选择git地址及用户

  • 1是项目的git地址
  • 2是刚刚配置的凭据
  • 3是git代码分支
  • 4是脚本路径(一般是Jenkinsfile,这个目录需要在跟目录下)

创建Jenkinsfile

Jenkinsfile就是我们需要运行的阶段视图具体写法,Jenkinsfile创建在根目录

pipeline {
    agent any

    environment {
        PROJECT = 'go-demo'
        REPOSITROY_URL = 'docker域名'+'/godemo'
        VERSION = '1.0.0'
    }

    stages {
        stage('登录docker') {
            steps {
                withCredentials([usernamePassword(credentialsId: 刚刚我们生成的凭据, passwordVariable: 'PASSWORD', usernameVariable: 'USERNAME')]) {
                    sh "docker login docker服务器 --username=${USERNAME} --password=${PASSWORD}"
                }
            }
        }

        stage('打包镜像') {
            steps {
                   sh 'docker build -t ${REPOSITROY_URL}:${VERSION} .'
            }
        }

        stage('上传镜像') {
            steps {
                sh 'docker push ${REPOSITROY_URL}:${VERSION}'
            }
        }
        stage('部署服务') {
            steps {
                sh runCommand() + "sudo docker stop ${PROJECT}-${params.profile} || true"
                sh runCommand() + "sudo docker rm ${PROJECT}-${params.profile} || true"
                sh runCommand() + "sudo docker rmi ${REPOSITROY_URL}:${VERSION} || true"
                sh runCommand() + dockerRun()
            }
        }
    }
}

String runCommand() {
    def command = "sshpass  ssh -p ${params.port} -o \"StrictHostKeyChecking no\" ${params.username}@${params.host} "
    echo "command: ${command}"
    return "${command}";
}

String dockerRun() {
    String dockerRun = "sudo docker run --name ${PROJECT}-${params.profile} -p ${params.expose_port}:${params.expose_port} -d --network host ${REPOSITROY_URL}:${VERSION} "
    return dockerRun;
}

创建Dockerfile

FROM golang:alpine

# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64 \
    GOPROXY=https://goproxy.cn,direct

# 移动到工作目录:/build
WORKDIR /build
# 时区设置成当前时区
RUN apk add --no-cache tzdata
ENV TZ="UTC"
# 将代码复制到容器中
COPY . .
RUN go mod tidy
# 将我们的代码编译成二进制可执行文件  可执行文件名为 app
RUN go build -o app .

# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist

# 将二进制文件从 /build 目录复制到这里
RUN cp /build/app .

# 声明服务端口
EXPOSE 8081

ENTRYPOINT ["/dist/app"]

项目目录:

构建项目

遇到的问题

  1. 一直不拉取git,不走Jenkinsfile

    原因是插件安装有问题,需要去建议插件安装pipeline

  2. 部署服务不成功

    1. 需要注意加空格

  1. root@172.30.14.202: Permission denied (publickey)

    原因:由于远程连接的服务器没有当前服务器的公钥(publickey)

    解决:

    1. 进入服务器,在进jenkins服务器

      docker exec -it jenkins bash
      
    2. 获取公钥

      ls -a
      cd .ssh/
      cat id_rsa.pub
      
    3. 进入目标服务器,添加供钥,把公钥加在文件末尾即可

      ls -a
      cd .ssh/
      vim authorized_keys
      
posted @ 2022-06-29 19:07  小学程序员  阅读(884)  评论(0编辑  收藏  举报