飞道的博客

golang程序通过docker打包到harbor的方式进行jenkins自动化发布

505人阅读  评论(0)

需求描述:
公司内部的git仓库 golang 服务端代码需要以docker打包的方式发布到外网多台服务器中,作为api接口服务启动,然后nginx反向代理到这几台机器中
如果不以docker的方式启动直接编译发布启动也是可以的,以docker启动方式主要是为后续上k8s等类似的平台做技术铺垫
大概的思路:
1.jenkins拉取git代码通过rsync推送到远端服务器中
2.在远端搭建docker的仓库harbor服务器
3.通过jenkins的方式调取远端服务器中的脚本进行 doker 的打包并推送到harbor中,然后拉取harbor中的镜像启动服务

架构图

1.在远端服务器中安装docker,在其中一台服务器中安装harbor作为镜像服务器
# 安装docker
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce
环境准备
mkdir -p /data/www/vhosts/docker/storage/logs
chown -R apache.users /data/www/vhosts/docker/
2.修改docker配置(每个服务端的ip端最好不同)
mkdir /etc/docker
# vim /etc/docker/daemon.json


    
  1. {
  2. "graph": "/data/docker",
  3. "storage-driver": "overlay2",
  4. "insecure-registries": [ "registry.access.redhat.com", "quay.io", "172.30.0.122:1800"],
  5. "registry-mirrors": [ "https://q2gr04ke.mirror.aliyuncs.com"],
  6. "bip": "10.30.136.1/24",
  7. "exec-opts": [ "native.cgroupdriver=systemd"],
  8. "live-restore": true
  9. }

"bip": "10.30.162.1/24" 说明:
最好不要和公司内部或者vpc的网段冲突
服务器IP:1.2.17.136/172.30.0.70


对应
10.30.136.1/24
# 启动docker
systemctl start docker
systemctl enable docker
# 安装 harbor 仓库
参考:https://www.cnblogs.com/reblue520/p/13615972.html
修改harbor仓库的地址
hostname: 172.30.0.122
port: 1800
harbor_admin_password: pass

# 远程需要部署docker 安装包api接口的服务器上 通过apache用户登录docker harbor
# 生成config.json 这个秘钥文件,这样就可以在远程服务器中执行 pull push 命令而不需要输入账号密码直接执行了


    
  1. # more /data/www/.docker/config.json
  2. {
  3. "auths": {
  4. "172.30.0.122:1800": {
  5. "auth": "efadYXJib3IyMDIxYWd2W4="
  6. }
  7. }
  8. }

3.将apache用户添加可以运行docker的权限
sudo usermod -aG docker apache
4.编写远程脚本脚本
mkdir /usr/local/worksh/jeninks_task/
# cat  /usr/local/worksh/jeninks_task/vidiar_search_docker_build_restart.sh


    
  1. #!/bin/bash
  2. ENV= $1
  3. TAG= $2
  4. # 复制环境变量
  5. cd /data/www/vhosts/vidair-search.chinasoft.com/httpdocs
  6. cp .env. $ENV .env
  7. # 执行权限
  8. chmod 755 vidair-search.exe
  9. # 生成docker image
  10. cd /data/www/vhosts/vidair-search.chinasoft.com/httpdocs
  11. docker build -t 172.30.0.122:1800/todd/vidair-search: $TAG .
  12. # 推送到docker仓库
  13. cd /data/www/vhosts/vidair-search.chinasoft.com/httpdocs
  14. docker push 172.30.0.122:1800/todd/vidair-search: $TAG
  15. # 通知远程机器重新拉取image并且启动container
  16. docker pull 172.30.0.122:1800/todd/vidair-search: ${TAG}
  17. docker stop vidair-search
  18. docker rm -f vidair-search
  19. docker container run -p 3012:3001 -it -d -v /data/www/vhosts/docker/storage/logs:/app/storage/logs -v /nasplatform:/nasplatform -v /nasuser:/nasuser -v /tmpdata:/tmpdata --name=vidair-search 172.30.0.122:1800/todd/vidair-search: ${TAG}

# 添加可执行权限
chmod +x /usr/local/worksh/jeninks_task/vidiar_search_docker_build_restart.sh
chown -R apache.users /usr/local/worksh/jeninks_task

# Dockerfile
# more Dockerfile


    
  1. From centos
  2. RUN mkdir -p /app/storage/logs
  3. WORKDIR /app
  4. COPY vidair-search.exe /app/vidair-search.exe
  5. COPY .env /app/.env
  6. EXPOSE 3001
  7. CMD ["/app/vidair-search.exe"]

# 修改 Dockerfile 这样可以在不能启动 docker 容器成功的情况下进入容器中排查问题
# more Dockerfile


    
  1. From centos
  2. RUN mkdir -p /app/storage/logs
  3. WORKDIR /app
  4. COPY vidair-search.exe /app/vidair-search.exe
  5. COPY .env /app/.env
  6. EXPOSE 3001
  7. # CMD ["/app/vidair-search.exe"]
  8. CMD ["/bin/bash","-c","tail -f /dev/null"]

5.配置jenkins发布环境
git仓库相关配置


jekins shell脚本


    
  1. #!/bin/bash
  2. # 此脚本功能为根据构建时选择的参数,同步 /data/www/vhosts/vidair-search.chinasoft.com.prod 下的文件同步到远程中转机器
  3. # 2021.05.21 初始化脚本
  4. #非apache用户运行脚本,则退出
  5. if [ `whoami` != "apache" ]; then
  6. echo "only apache can run me"
  7. exit 1
  8. fi
  9. echo "xxx"
  10. ## 1.定义变量
  11. dir_name=bak.$(date +%Y-%m-%d-%H-%M-%S)
  12. project_dir=/data/www/vhosts/vidair-search.chinasoft.com.prod
  13. ## 2.备份代码函数
  14. function func_project_backup(){
  15. cp -a $project_dir/ /data/data_backup/vidair-search.chinasoft.com.prod_ $dir_name
  16. }
  17. #func_project_backup
  18. ## 3.判断代码发布目录变量是否为空
  19. if [ ! $project_dir ]; then
  20. echo "$project_dir IS NULL ,shell exit!!!!"
  21. exit 1
  22. fi
  23. ## 2.判断同步状态
  24. function func_rsync_status(){
  25. if [[ $? == 0 || $? == 23 ]]; then
  26. rsync_edit=1
  27. else
  28. rsync_edit=0
  29. echo "`date` 同步到本地目标失败! "
  30. exit 1
  31. fi
  32. }
  33. ## 4.同步到本地待发路径
  34. function func_rsync_project_local(){
  35. echo "xxxxxxxxxxxxxx同步待发目录开始xxxxxxxxxxxxxxxxxx"
  36. cd $WORKSPACE
  37. /usr/ local/bin/rsync -vau -progress --delete --exclude= '.git/' --exclude= '.gitignore' --exclude= '*.log' $WORKSPACE/ $project_dir/httpdocs/
  38. func_rsync_status
  39. echo "xxxxxxxxxxxxxx同步待发目录完成xxxxxxxxxxxxxxxxxx"
  40. }
  41. func_rsync_project_local
  42. # 执行编译
  43. cd $project_dir/httpdocs/ && chmod +x ./init.production.sh && ./init.production.sh production
  44. chown -R apache.users $project_dir/
  45. sleep 1
  46. ## 5.推送代码到远程中转机并发布(发布到线上)
  47. echo "------------------------------------ rsync start prod -----------------------------------------"
  48. chown -R apache.users $project_dir/
  49. sleep 1
  50. /bin/bash /usr/ local/worksh/jeninks_task/online_video.vidair-search.chinasoft.com.prod.sh
  51. echo "------------------------------------ rsync done prod -----------------------------------------"
  52. ## 7.通过插件执行远程服务器中的脚本生成docker镜像,然后推送到仓库中,最后推送到目标服务器中,并启动

涉及的  init.production.sh 脚本内容


    
  1. #!/bin/bash -l
  2. ENV= $1
  3. # 复制环境变量
  4. cp .env. $ENV .env
  5. # 处理依赖
  6. go mod tidy
  7. go mod vendor
  8. # 构建启动程序
  9. GOARCH=amd64 GOOS=linux go build -ldflags "-s -w" -o vidair-search.exe main.go
  10. # 执行权限
  11. chmod 755 vidair-search.exe

发布代码脚本
# cat /usr/local/worksh/jeninks_task/online_video.vidair-search.chinasoft.com.prod.sh


    
  1. #!/bin/bash
  2. #############################################
  3. ## 设置变量和GET请求过来的变量
  4. ## GET请求传过来的文件所在目录,目录路径写全路径了
  5. #dir=$1
  6. passfile= "/data/www/.rsync/pass.oneline-video.vidair-search.chinasoft.com.prod"
  7. # 非apache用户运行脚本,则退出
  8. if [ `whoami` != "apache" ]; then
  9. echo " only apache can run me"
  10. exit 1
  11. fi
  12. # 判断同步状态
  13. function func_rsync_status(){
  14. if [[ $? == 0 || $? == 23 ]]; then
  15. rsync_edit=1
  16. else
  17. rsync_edit=0
  18. echo "`date` 同步到目标失败! "
  19. exit 1
  20. fi
  21. }
  22. # 判断目录是否为空函数
  23. function func_is_empty_dir(){
  24. return `ls -A $1|wc -w`
  25. }
  26. # 代码发目录
  27. project_dir= "/data/www/vhosts/vidair-search.chinasoft.com.prod/"
  28. # 判断待发目录是否为空,为空则退出
  29. if func_is_empty_dir $project_dir
  30. then
  31. echo " $project_dir is empty , exit!!!!"
  32. exit 1
  33. else
  34. echo " $project_dir 可以发布"
  35. fi
  36. ## 设置变量,目标服务器
  37. server_ip_list= "1.1.1.1 1.1.1.2"
  38. # src directory
  39. src_directory= "vidair-search.chinasoft.com.prod"
  40. # dst directory
  41. dst_directory= "vidair-search.chinasoft.com"
  42. exclude_list= "--exclude=.svn --exclude=.git --exclude=.gitignore --exclude=*.log --exclude=.gitattributes --exclude=.env"
  43. function vidair_rsyn_prod()
  44. {
  45. # rsync ip_list
  46. for ip in ${server_ip_list}
  47. do
  48. echo "####################rsync ${ip} start################################"
  49. rsync -zavP --bwlimit=1000 ${exclude_list} --password-file= ${passfile} /data/www/vhosts/ ${src_directory}/ apache@ ${ip}::apache/data/www/vhosts/ ${dst_directory}/
  50. func_rsync_status
  51. echo "################### rsync ${ip} end #######################"
  52. done
  53. }
  54. vidair_rsyn_prod
  55. exit 0


转载:https://blog.csdn.net/reblue520/article/details/117377486
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场