1 前言
DevOps想要更好的理解,自己搭建一套CICD流水线体验后就清晰明了了,在网上大多数案例的演示环境过于庞大,如:
- gitlab + gitlab-runner/jenkins + harbor + server
- k8s + kubesphere (集成DevOps基于jenkins)
- k3s + rancher(基于jenkins)
这些基础环境就让人望而止步,我使用6核32G黑苹果搭建了三个晚上,被坑得头破血流。
本文的CICD,仅需一台1核2G最低配服务器,并依赖公有的资源完成CICD的演示和练习。
- github + github actions + dockerhub + aliyunECS(1核2G)
2 准备条件
- github账号
- dockerhub账号
- 1台可以被公网访问的服务器(我这里使用的aliyun最低配1核2G,ContOS7系统)
3 dockerhub配置
dockerhub配置简单,先处理
- Create Repository:输入项目名,这里产生的是:dockerhubUserName/projectName,设置public(本次演示为公有仓库)
4 github配置
- 新建仓库,输入项目名projectName
- 点击Actions -> set up a workflow yourself
修改main.yml为actions-ci.yml(这步非必须)
提交到主分支,这时候主分支会多出.github/workflows文件夹,里面有刚创建的actions-ci.yml
重点在于CI文件理解,建议先看10分钟actions官方文档
配置secrets,避免明文暴露dockerhub以及服务器的相关账户密码
- 需要设置6个密钥
- dockerhub相关密钥,这里为了将Dockerfile打的镜像push到之前创建好的dockerhub仓库
- DOCKER_PASSWORD:123456
- DOCKER_REGISTRY:projectName
- DOCKER_USERNAME:zhangsan
- 服务器相关密钥,这里为了将部署脚本通过scp传输到服务器,再使用ssh远程命令服务器去拉dockerhub镜像并运行
SERVER_HOST:106.xx.xx.199
SERVER_PASS:123456
SERVER_USER:root
-
更改actions-ci.yml文件
name: Jave8 CICD with Actions # 触发条件,当指定分支push代码时触发 on: push: branches: - develop # 环境变量 env: IMAGE_NAME: projectName APP_JAR_DIR: target/projectName-0.0.1-SNAPSHOT.jar # 任务列表,测试步骤暂时空缺 jobs: # 自动化单元测试 test: runs-on: ubuntu-latest steps: - run: echo "测试成功" # maven编译打包,和Dockerfile制作镜像,push到dockerhub仓库 compile-build: needs: test runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: actions/setup-java@v1 with: java-version: 1.8 - run: |- mvn package -U -Dcodegen.skip -Dmaven.test.skip=true mv $APP_JAR_DIR app.jar docker build -f Dockerfile -t $IMAGE_NAME . - uses: elgohr/Publish-Docker-Github-Action@master with: name: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REGISTRY }} username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} tags: "latest,${{ env.STATE_RELEASE_VERSION }}" # 将deploy.sh通过scp传输到服务器,并使用ssh远程操作进行部署 deploy: needs: compile-build runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: garygrossgarten/github-action-scp@release with: local: deploy.sh remote: deploy.sh host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} password: ${{ secrets.SERVER_PASS }} - uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USER }} password: ${{ secrets.SERVER_PASS }} port: 22 script: |- chmod +x deploy.sh sh deploy.sh rm -rf deploy.sh
2个现有工具的使用
- scp: https://github.com/garygrossgarten/github-action-scp
- ssh: https://github.com/appleboy/ssh-action
Dockerflie:
FROM java:8 ADD app.jar app.jar CMD ["java","-jar","app.jar"]
deploy.sh:
#! bin/bash # 外部传给内部的变量脚本 app_name="projectName" port="8888" docker_username="zhangsan" echo "对容器存活进行判断" if test -n "$(docker ps -a |grep $app_name)" ; then echo "停止并且删除容器和上版本镜像" docker stop $app_name docker rm $app_name docker rmi $docker_username/$app_name:latest else echo "未检查到$app_name容器运行" fi echo "获取最新的镜像" docker pull $docker_username/$app_name:latest echo "启动服务" # 有需要添加的环境变量随时添加 docker run -itd\ -e TZ="Asia/Shanghai"\ -e SERVER_PORT=$port\ -p $port:$port\ --name $app_name $docker_username/$app_name:latest
5 演示
使用IDE拉取项目代码,创建develop分支,并修改push
查看github actions的实时可视化CICD步骤和日志
CICD平均时长为2分30秒左右,个人项目的使用以及算很快了
访问服务
-
项目仓库完整基础文件
参考: