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"]
项目目录:
构建项目
遇到的问题
-
一直不拉取git,不走Jenkinsfile
原因是插件安装有问题,需要去建议插件安装pipeline
-
部署服务不成功
- 需要注意加空格
-
root@172.30.14.202: Permission denied (publickey)
原因:由于远程连接的服务器没有当前服务器的公钥(publickey)
解决:
-
进入服务器,在进jenkins服务器
docker exec -it jenkins bash
-
获取公钥
ls -a cd .ssh/ cat id_rsa.pub
-
进入目标服务器,添加供钥,把公钥加在文件末尾即可
ls -a cd .ssh/ vim authorized_keys
-