gitlab之gitlab-ci和gitlab-runner<二>
1、使用
该版未接入k8s,下一篇会写接入k8s。
配置项目使用gitlab-ci和gitlab-runner,在项目的根目录中添加.gitlab-ci.yml文件,用于触发pipeline。
.hosts目录里面是四个文件:.personal_ips、.daily_ips、staging_ips、prod_ips,存放的是每个环境的ip列表,每行一个ip。
.scripts目录里面是要执行的脚本:deploy、start、start_prod 、test
需要提前准备基础镜像,由于要用到docker,所以这里采用的是docker作为基础镜像,如果构建java或python则需要相应的基础镜像。准备好镜像后,还需要为镜像准备免交互的秘钥对。生成一个秘钥对然后将私钥集成到基础镜像里面,制作方法如下:
这样做的原因:由于采用的是alpine,所以使用ssh-add总是失败,所以就放弃了,可能是我没有找对方法吧。
首先要确保制作的这个镜像只能用于公司内部使用,因为里面包含了私钥,所以不要上传到公网,上传到公司的私有仓库进行使用。
制作秘钥对:
#ssh-keygen
一直回车
找一台安装有docker的服务器,运行容器
# docker run -d -it docker.io/docker:stable
找到容器连进去:
# docker ps
# docker exec -it 3e3b5d693c77 sh 安装openssh git
# apk add --no-cache openssh git && rm -rf /var/cache/apk/* 将生成的秘钥copy近容器:
#scp 10.10.1.11:~/.ssh/id_rsa ~/.ssh 退出容器control +p +q 将制作好的容器提交为镜像:
# docker commit 3e3b5d693c77 fastesp/docker:stable 后面的名字自己定义,前面要加上自己私有仓库的地址,我这里是fastest,你的地址可能是10.10.1.11:5000.你的标签就是这样:10.10.1.11:5000/base_image/docker:stable
将之前创建的公钥加入到需要免密交互的服务器上面的authorized_keys文件即可。
基础镜像创建完成,接下来创建.gitlab-ci.yml文件:
# This file is a template, and might need editing before it works on your project.
# Official docker image.
image: fastop/docker:stable
services:
- docker:dind stages:
- build
- deploy before_script:
- docker info
- docker login -u fastop -p tianyu01234 ##########ENV prepare############
.personal_pre: &personal_ssh
before_script:
- ssh-keyscan $PERSONAL_HOSTS > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- /bin/sh .scripts/test $CI_COMMIT_REF_SLUG .personal_tag: &personal_env
environment:
name: $CI_COMMIT_REF_SLUG
url: http://dog.dd.com
only:
- monkey
- dog
tags:
- fuck .daily_pre: &daily_ssh
before_script:
- ssh-keyscan $DAILY_HOSTS > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- /bin/sh .scripts/test daily
.daily_tag: &daily_env
environment:
name: dev
url: http://daily.dd.com
only:
- develop
tags:
- fuck .staging_pre: &staging_ssh
before_script:
- ssh-keyscan $STAGING_HOSTS > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- /bin/sh .scripts/test staging
.staging_tag: &staging_env
environment:
name: stagimg
url: http://staging.dd.com
only:
- staging
tags:
- staging .prod_pre: &prod_ssh
before_script:
- ssh-keyscan $PROD_HOSTS > ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
- /bin/sh .scripts/test prod
.prod_tag: &prod_env
environment:
name: production
url: http://prod.dd.com
only:
- /v[0-9|\.]+/
except:
- branches
###########buid jobs#############
daily_build:
stage: build
script:
- docker build --pull -t "fastest/spin-kube-demo:daily" .
- docker push fastest/spin-kube-demo:daily
<<: *daily_env
staging_build:
stage: build
script:
- docker build --pull -t "fastest/spin-kube-demo:staging" .
- docker push fastest/spin-kube-demo:staging
<<: *staging_env personal_build:
stage: build
script:
- docker build --pull -t "fastest/spin-kube-demo:$CI_COMMIT_REF_SLUG" .
- docker push fastest/spin-kube-demo:$CI_COMMIT_REF_SLUG
<<: *personal_env prod_build:
stage: build
script:
- export VERSION=`git tag -l| tail -1`
- docker build --pull -t "fastop/spin-kube-demo:$VERSION" .
- docker tag fastop/spin-kube-demo:$VERSION fastop/spin-kube-demo:latest
- docker push fastop/spin-kube-demo:$VERSION
- docker push fastop/spin-kube-demo:latest
<<: *prod_env
when: manual #########deploy job##############
personal_deploy:
<<: *personal_ssh
stage: deploy
script:
- /bin/sh .scripts/deploy $CI_COMMIT_REF_SLUG
dependencies:
- personal_build
<<: *personal_env daily_deploy:
<<: *daily_ssh
stage: deploy
script:
- /bin/sh .scripts/deploy daily
dependencies:
- daily_build
<<: *daily_env staging_deploy:
<<: *staging_ssh
stage: deploy
script:
- /bin/sh .scripts/deploy staging
dependencies:
- staging_build
<<: *staging_env prod_deploy:
<<: *prod_ssh
stage: deploy
script:
- /bin/sh .scripts/deploy prod
dependencies:
- prod_build
<<: *prod_env
when: manual
这里分了四个环境,当然也可以根据需求删减,personal、daiy、staging、production
environment: 是配置在deploy这个stage里面的,用于后面Environments可以做版本回滚。
详细配置参考:https://docs.gitlab.com/ce/ci/yaml/README.html#special-yaml-features
gitlab-runner配置:
项目-->settings-->CI/CD-->Variables
设置一些环境变量
可以在这里设置自己需要的变量,这些变量可以直接在.gitlab-ci.yml文件里面直接使用。
deploy:
#!/bin/bash
#script for triger deploy stage #personal env function
personal_deploy(){
personal_hosts=`cat .hosts/.personal_ips`
for i in $personal_hosts
do
ssh root@$i 'bash -C -s' < .scripts/start $CI_COMMIT_REF_SLUG
done
} #daily env function
daily_deploy(){
daily_hosts=`cat .hosts/.daily_ips`
for i in $daily_hosts
do
ssh root@$i 'bash -C -s' < .scripts/start "daily"
done
} #staging env function
staging_deploy(){
staging_hosts=`cat .hosts/.staging_ips`
for i in $staging_hosts
do
ssh root@$i 'bash -C -s' < .scripts/start "staging"
done
} #prod env function
prod_deploy(){
prod_hosts=`cat .hosts/.prod_ips`
for i in $prod_hosts
do
ssh root@$i 'bash -C -s' < .scripts/start_prod $VERSION
done
} case $1 in $CI_COMMIT_REF_SLUG)
personal_deploy
;;
daily)
daily_deploy
;;
$VERSION)
prod_deploy
;;
*)
echo "ERROR PARA"
echo "Usage:$0 $CI_COMMIT_REF_SLUG|daily|$VERSION"
esac
start:
#!/bin/bash
#start script tag=$1
start(){
docker pull fastest/spin-kube-demo:$tag
cd /data/project
docker-compose -f docker-compose-$tag\.yml down
docker-compose -f docker-compose-$tag\.yml up -d
}
start
需要在对应的服务器上面创建/data/project目录,然后创建docker-compose-$tag.yml文件,$tag就是对应的环境,例如:daily
start_prod:
#!/bin/bash
#start script tag=$1 start_prod(){
docker pull fastop/spin-kube-demo:latest
cd /data/project
docker-compose -f docker-compose.yml down
docker-compose -f docker-compose.yml up -d
}
start_prod
test:
#!/bin/bash
#script for triger deploy stage #personal env function
personal_deploy(){
personal_hosts=`cat .hosts/.personal_ips`
for i in $personal_hosts
do
ssh root@$i 'echo test'
done
} #daily env function
daily_deploy(){
daily_hosts=`cat .hosts/.daily_ips`
for i in $daily_hosts
do
ssh root@$i 'echo test'
done
} #staging env function
staging_deploy(){
staging_hosts=`cat .hosts/.staging_ips`
for i in $staging_hosts
do
ssh root@$i 'echo test'
done
} #prod env function
prod_deploy(){
prod_hosts=`cat .hosts/.prod_ips`
for i in $prod_hosts
do
ssh root@$i 'echo test'
done
} case $1 in $CI_COMMIT_REF_SLUG)
personal_deploy
;;
daily)
daily_deploy
;;
prod)
prod_deploy
;;
*)
echo "ERROR PARA"
echo "Usage:$0 $CI_COMMIT_REF_SLUG|daily|prod"
esac
每次提交代码就会自动触发构建并自动发布,production的构建发布需要手动点击按钮,这个是when: manual实现的。
类似金丝雀的发布策略,是通过控制服务的ip列表实现的。比如博客中写的deploy 10%、deploy 50%,就是通过分割服务器ip列表实现的。
参考:
https://docs.gitlab.com/ce/ci/yaml/README.html#special-yaml-features
gitlab之gitlab-ci和gitlab-runner<二>的更多相关文章
- 在gitlab上setup CI
安装gitlab runner docker pull gitlab/gitlab-runner 启动gitlab runner docker run -d --name gitlab-runner ...
- 如何搭建基于Docker的gitlab服务器集成CI/CD实现DEVOPS(完整版)
From this lesson you will learn about 1,How to install and configure a docker based gitlab server 2, ...
- gitlab自动化部署CI案例
参考: https://blog.csdn.net/hxpjava1/article/details/78514999 (简单操作) https://blog.csdn.net/wh211212/ ...
- gitlab+jenkins+tomcat CI/CD 部署
整个项目的框架为: gitlab的安装与使用(Centos7) gitlab的安装 新建yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] nam ...
- git学习------>在CenterOS系统上安装GitLab并自定义域名访问GitLab管理页面
目前就职的公司一直使用SVN作为版本管理,现在打算尝试从SVN迁移到Git.安排我来预言并搭建好相关的环境以及自己尝试使用Git.今天我就尝试在Center OS系统上安装GitLab,现在在此记录一 ...
- 使用docker安装gitlab,两台电脑gitlab库相互迁移
原文来自合伙呀 https://hehuoya.com/2019/09/30/gitlab-docker/ Docker for gitlab brew cask install docker do ...
- Docker DevOps实战:GitLab+Jenkins(1)- GitLab容器搭建、使用SourceTree pull/push项目
GitLab容器搭建 # 创建GitLab容器# --restart always #重启,容器自动重启# --privileged=true #容器内使用root权限 [root@localhost ...
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...
- 使用gitlab, jenkins搭建CI(持续集成)系统(1) -- 准备环境
1. 环境设计 搭建一个从开发到测试知道发布上线可以自动换完成的CI系统.这个系统中包含4个环境. 开发(dev)环境: 码农使用. 测试(test)环境: 测试人员使用. 预发布(prepublis ...
- KubeSphere CI/CD+GitLab+Harbor将Spring Boot项目部署至Kubernetes
上一篇文章分享了如何在 KubeSphere 对公共的代码仓库 GitHub 和镜像仓库 DockerHub 创建流水线,本文将继续使用 KubeSphere,基于 Harbor 和 GitLab 创 ...
随机推荐
- LCA tarjan+并查集POJ1470
LCA tarjan+并查集POJ1470 https://www.cnblogs.com/JVxie/p/4854719.html 不错的一篇博客啊,让我觉得LCA这么高大上的算法不是很难啊,嘻嘻嘻 ...
- HDU1025贫富平衡
做01背包做到的这个LIS,常见的n2会超时,所以才有nlogn可行 先来介绍一下n2 dp[i] 表示该序列以a[i]为结尾的最长上升子序列的长度 所以第一层循环循环数组a,第二层循环循环第i个元素 ...
- UNIGUI接收普通消息和被动回复用户消息
接收普通消息和被动回复用户消息 用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复 ...
- Android-Java-synchronized静态方法&字节码文件对象
上一篇博客 Android-Java-同步方法-synchronized,中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客 ...
- MVC简介与三层架构
感谢博客园团队日夜辛苦的付出 感谢阅读我文章的每位读者 1.MVC简介 MVC最早于1978年提出,是软件工程中的一种软件架构模式,这时距离微软在1985年推出Window1.0还有7年之久,当时的M ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- openvSwitch 基本命令
建立ovs接口连接两个namespace组成二层网络 环境搭建拓扑 br0 +--------------------------------------+ +--+ +--+ +---+ | tap ...
- CentOS 7 - 配置服务实现开机自启动
新建系统服务描述文件 cd /etc/systemd/system sudo vim myapp.service 添加以下配置: [Unit] # 这里添加你的服务描述 Description=mya ...
- Linux系统磁盘与分区管理(7)
Linux最传统的磁盘文件系统(filesystem)使用的是EXT4格式,所以要了解文件系统就得要由认识EXT4开始,而文件系统是创建在硬盘上面的,因此我们得了解硬盘的物理组成才行,下面我们回来详细 ...
- 预防和避免死锁的方法及银行家算法的java简单实现
预防死锁 (1) 摒弃"请求和保持"条件 基本思想:规定所有进程在开始运行之前,要么获得所需的所有资源,要么一个都不分配给它,直到所需资源全部满足才一次性分配给它. 优点:简单.易 ...