前言

阿里云的 CI/CD 工具流水线(Flow)用了有好几年了,使用起来还不错(主要原因还是配套基本齐全且白嫖)。

最近在群辉上部署了 Minio,故此希望将前端资源能够直接传入 Minio,找了一圈未找到能用的步骤,直接写一个。

创建自定义步骤(step)

参见官方文档:https://help.aliyun.com/document_detail/153811.html?spm=a2c4g.202430.0.0.21c51c2e5IaEXG#section-pv0-665-mep

下载安装

登录 Flow

1
flow login

注意:

flow login 命令在 linux 系统执行可能会遇到 listen tcp :80: bind: permission denied 这个是普通用户没有权限监听 80 端口,需要 root 权限,以及如果 80 端口占用应该也是不行的;

新建步骤

1
2
3
mkdir <your-step-sign>
cd <your-step-sign>
flow step init <your-step-sign> # 新建步骤

更换为你自己的步骤标识,注意:step 标识为整个云效唯一,若被其他步骤占用则无法创建成功。

这个命令会在本地``目录下创建如下文件:
1
2
3
4
5
6
7
.step
|- ..
|- entry.sh # 步骤需要的基础脚本
<your-step-sign>
|- Dockerfile # 用于构建步骤镜像
|- step.sh # 步骤执行脚本
|- step.yaml # 用于描述步骤所有信息的 yaml

集成 mc 客户端进步骤容器

官方文档参见:https://min.io/docs/minio/linux/reference/minio-mc.html

下载 ossutil 二进制文件,放到你的步骤目录

再创建一个配置文件 .mclconfig

1
2
3
4
[Credentials]
minioHost=MINIOHOST
accessKeyID=AKID
accessKeySecret=AKS

编辑 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FROM registry.cn-beijing.aliyuncs.com/rdc-builds/base:1.0
MAINTAINER khalid <khalidlife@163.com>

COPY .step/*.sh /root/
COPY uploadMinioMc/step.sh /root/step.sh

RUN chmod +x /root/*.sh

#拷贝 mc 二进制文件和配置文件进镜像
COPY uploadMinioMc/mc /usr/local/bin/mc
COPY uploadMinioMc/mcconfig/mcconfig.json /root/.mc/config.json
#修改二进制文件权限
RUN chmod +x /usr/local/bin/mc
#追加环境变量
ENV PATH=/usr/local/bin:$PATH


ENTRYPOINT [ "/root/entry.sh"]

实现 mc 鉴权和执行命令

编辑 step.yaml 实现步骤表单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
---
name: s3上传
sign: uploadMinioMc
description: 使用Minio-mc上传
#这里填镜像推送的"目的地"仓库地址,要求公开可访问,所以要注意镜像里不能包含敏感信息
#请自行修改
image: *********
items:
- label: endpoint
name: endpoint
type: input
- label: accessKeyID
name: accessKeyID
type: input
- label: accessKeySecret
name: accessKeySecret
type: input
- label: bucket
name: bucket
type: input
#要执行的相关命令
- label: 执行命令
name: command
type: shell
rules:
value: |
# input your command here
mc ls minio

编辑步骤 shell 文件 step.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
set -e

# 系统提供参数,从流水线上下文获取
echo [INFO] PIPELINE_ID=$PIPELINE_ID # 流水线ID
echo [INFO] PIPELINE_NAME=$PIPELINE_NAME # 流水线名称
echo [INFO] BUILD_NUMBER=$BUILD_NUMBER # 流水线运行实例编号
echo [INFO] EMPLOYEE_ID=$EMPLOYEE_ID # 触发流水线用户ID
echo [INFO] WORK_SPACE=$WORK_SPACE # /root/workspace容器中目录
echo [INFO] PROJECT_DIR=$PROJECT_DIR # 代码库根路径,默认为/root/workspace/code
echo [INFO] PLUGIN_DIR=$PLUGIN_DIR # 插件路径,默认为/root/workspace/plugins
echo [INFO] BUILD_JOB_ID=$BUILD_JOB_ID # build-service 任务ID

cd $PROJECT_DIR

#将用户在步骤表单填写的oss认证信息替换进 ossutil 配置文件
sed -i "s|AKID|${accessKeyID}|g" /root/.mc/config.json
sed -i "s|AKS|${accessKeySecret}|g" /root/.mc/config.json
sed -i "s|EP|${endpoint}|g" /root/.mc/config.json

#执行表单中用户填写的shell脚本
sh -ex $WORK_SPACE/user_command.sh

本地运行

1
flow step run <your-step-sign>

上线步骤

1
2
3
#在此命令之前一定要执行docker login命令
docker login --username=xxx registry.cn-hangzhou.aliyuncs.com
flow step publish <your-step-sign> # 发布镜像
这个命令会执行两个动作: 1. 将本地的 Dockerfile 构建成为 step.yaml 中的 docker 镜像并 push 到远端仓库。请确保本地已经安装了 Docker。 2. 将 step.yaml 描述的步骤原信息 publish 到云效的服务器。

使用flow step ls可以查看已经发布的步骤

云效配置

添加企业步骤

配置使用步骤

填写相关参数

编写操作 minio 的脚本

1
2
3
4
5
6
7
8
9
# input your command here
version=`cat package.json | jq -r '.version'`
name=`cat package.json | jq -r '.name'`

mc cp -r $PROJECT_DIR/public/ minio/${bucket}/${name}

#若需要带版本号则可以替换成以下命令
#mc cp -r $PROJECT_DIR/public/ minio/${bucket}/${name}/${version}