首先基础环境为
image.png
示例共有两个项目 一个为k8s集群中的环境变量项目,另一个为springboot微服务项目

1环境变量项目的自动部署

先看gitlab-ci的内容

image: gongdear/alpine-ssh:latest
stages:
  - deploy-test
  - deploy-demo
before_script:
  # 预先装 ssh-agent
  # 2019-09-19 使用已经安装ssh-agent的镜像
  # - 'which ssh-agent || ( apk update && apk add openssh-client)'
  # 启动服务
  - eval $(ssh-agent -s)
  # 将私钥写入deploy.key 文件
  - echo "$SSH_PRIVATE_KEY" > deploy.key
  # 配置较低权限
  - chmod 0600 deploy.key
  # 注入密钥
  - ssh-add deploy.key
  - mkdir -p ~/.ssh
  - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
recreate-configmap-test:
  stage: deploy-test
  script:
    # 连接远程服务器并执行拉取代码 重新创建测试环境的 configmap
    - ssh root@$DEPLOY_SERVER -tt "cd /data/envdeploy && git pull && cd test && ./recreate_config_map.sh"
  only:
    - test-ci
recreate-configmap-demo:
  stage: deploy-demo
  script:
    # 连接远程服务器并执行拉取代码 重新创建测试环境的 configmap
    - ssh root@$DEPLOY_SERVER -tt "cd /data/envdeploy  && git pull && cd demo && ./recreate_config_map.sh"
  only:
    - demo-ci

如果提交到测试环境分支test-ci 就执行测试环境的重建脚本
如果提交到演示环境分支demo-ci 就执行演示环境的重建脚本

这里的前提是alpine-ssh:latest这个镜像可以ssh到远程机器上去执行脚本,所以如何定制这个镜像是重点

Dockerfile:

FROM alpine
RUN which ssh-agent || ( apk update && apk add openssh-client)

其实这里就简单基于alpine镜像 在每次ci的时候去安装ssh也可以,但是实际效果很差,这一步要执行很久,所以我就定制了一个安装好ssh的镜像。

2springboot微服务项目的部署

这个项目我的思路跟上面一样,想定制一个有jdk和maven可以编译代码,又有docker环境可以push到harbor私服的镜像,但这一步遇到了很多坑

坑1 基于官方的maven:3-jdk-8镜像装了一个docker,编译没问题,但调用docker时遇到了错误 docker ps指令
image.png
说docker可能没启动?
image.png
docker -v有内容
docker ps不可以
基于maven:3-jdk-8镜像安装一个docker19.03.2总是失败。。。
查了一通文档,感觉应该是docker版本不一致导致的,这个镜像里docker版本确实不是19.03.2 那么直接pull一个最新的镜像
docker pull docker:19.03.2
查看了一下这又是基于alpine的,先试一下能不能成功调用docker ps
image.png
可以执行,那么说明基于这个镜像进行编译docekr镜像和push都应该是没问题的,那现在的方案就变为基于这个镜像安装一个jdk和maven了。
1 先安装jdk

FROM docker:19.03.2

RUN apk update && apk add openjdk8 curl busybox tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone && apk del tzdata && rm -rf /tmp/* /var/cache/apk/*

image.png
第一步很顺利,openjdk8看起来是装好了,来试一下
image.png
image.png
jdk成功安装,可喜可贺
然后基于这个新的镜像装maven。。。

2 安装maven

FROM gongdear/docker-jdk8

ENV MAVEN_VERSION 3.6.2
ENV MAVEN_HOME /usr/local/maven/default-maven
ENV MAVEN_DOWNLOAD_URL http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/${MAVEN_VERSION}/binaries/apache-maven-${MAVEN_VERSION}-bin.tar.gz
RUN apk add --no-cache bash tar wget ca-certificates unzip \
    && mkdir -p  ${MAVEN_HOME} \
    && wget ${MAVEN_DOWNLOAD_URL} \
    && tar -zxf apache-maven-${MAVEN_VERSION}-bin.tar.gz -C ${MAVEN_HOME} --strip-components=1 \
    && ln -s ${MAVEN_HOME}/bin/mvn /usr/local/bin/mvn \
    && apk del tar wget ca-certificates unzip \
    && rm -rf   apache-maven-${MAVEN_VERSION}-bin.tar.gz \
                ${MAVEN_HOME}/bin/*.bat \
                /tmp/*
CMD ["bash"]

image.png

好了 再试一下maven可以用了不

image.png

image.png

好了 非常完美的一个镜像,可以继续后面的ci大工程了

宝剑锋从磨砺出,梅花香自苦寒来.