Flow cli使用常见问题

1、运行环境

需要安装Docker、Go语言环境,请根据对应系统进行安装。

2、 windows 系统双击运行,闪退

flow cli 不支持双击运行,请采用命令行方式运行。

3、windows 系统运行,报 missing Location in call to Time.In

Flowcli使用常见问题1

安装Go语言环境即可解决上述问题。

4、想自定义端口

无法支持,目前登录回调地址为127.0.0.1 80端口,不支持自定义端口。

5、开发环境80端口被占用或者无浏览器,如何使用Flow cli

目前Flow cli 是依赖~/.flow.json 文件,来进行鉴权,用户可以自己生成该文件,实现登录。文件内容如下:

{"userToken":{"access_token":"ACCESS_TOKEN","token_type":"Bearer","user_id":"USER_ID"},"organization":{"error":"","message":"","id":"","createdAt":"","updatedAt":"","creatorId":"","name":"","logo":"","location":"","category":"","description":"","website":"","background":"","contactPhone":"","desiredMemberCount":"","isDeleted":"","py":"","pinyin":"","isPublic":false,"defaultRoleId":"","defaultOrgRoleId":"","okrProgressMode":"","defaultTeamId":"","openId":"","source":""}}

请将ACCESS_TOKEN 以及USER_ID替换成用户自己的值,这两个值的获取方式如下:

访问云效流水线,登录之后,右键查看网页源代码,源代码中的tbUserId即为USER_ID,accessToken即为需要的ACCESS_TOKEN。

将上述内容替换后,写入到~/.flow.json即可。

6、运行报错,且没有日志

Flowcli使用常见问题2

如果出现上面错误,是由于步骤对应的镜像,不是公开Pull权限,云效没有权限pull镜像导致无法运行,请将step.yaml中定义的镜像改为公开pull权限,同时为了数据安全,请不要再镜像中存有敏感数据。

7、在自定义步骤中使用CI_COMMIT_REF_NAME 等系统环境变量

将步骤所在目录下的.step 目录中的entry.sh 替换为以下内容,重新发布步骤即可

#!/bin/bash

source /root/logger.sh
source /root/exec.sh
source /root/redline.sh

WORK_SPACE=/root/workspace
PLUGIN_DIR=/root/plugins
PROJECT_DIR=$WORK_SPACE/code
LOG_DIR=$WORK_SPACE/logs
TASK_DIR=$WORK_SPACE/task
CONTEXT_DIR=$WORK_SPACE/context
COMMAND_DIR=$WORK_SPACE/user_command.sh
ENV_DIR=$WORK_SPACE/env
TIMESTAMP=`date +%s`
DATETIME=`date +%Y-%m-%d-%H-%M-%S`
STEP_CONTEXT=$WORK_SPACE/stepContext
mkdir -p $PLUGIN_DIR

# 获取步骤参数
retry_times=0
while
  INFO Get: $TASK_URL >> $LOG_DIR
  curl --connect-timeout 20 --fail --insecure --location $TASK_URL >$TASK_DIR 2>>$LOG_DIR
  [[ $? != '0' || ! -s $TASK_DIR || $(grep '"successful":false' $TASK_DIR) != '' ]] && ((retry_times < 3))
do
    WRANING "获取参数失败,重试第 $retry_times 次.."
    WARNING RETRY... >> $LOG_DIR
    (( retry_times++ ));
done

# 将环境变量写入 context
cat $TASK_DIR | jq -r '.envVars // "{\"WORK_SPACE\":\"/root/workspace\"}"' | jq -r "to_entries|map(\"\(.key)='\(.value|tostring)'\")|.[]" > $CONTEXT_DIR

# 将 command 信息写入 user_command.sh
cat $TASK_DIR | jq -r '.command' > $COMMAND_DIR

if [[ ! -s $CONTEXT_DIR ]]; then
  ERROR "获取环境变量失败,请联系系统管理员解决"
  ERROR BUILD ERROR
  ERROR $BUILD_JOB_ID
  exit 1;
fi

source $CONTEXT_DIR
export $(cut -d= -f1 $CONTEXT_DIR)

if [[ -f $STEP_CONTEXT ]]; then
  source $STEP_CONTEXT
  export $(cut -d= -f1 $STEP_CONTEXT)
fi
# 如果获取 Credential 失败打印错误信息
if [[ -z "$ERROR" ]]; then
  SUCCESS 获取 Credential 成功
else
  ERROR $ERROR
fi

# 代码库路径
if [[ $source ]]; then
  INFO 使用工作路径$WORK_SPACE/$source
  PROJECT_DIR=$WORK_SPACE/$source
else
  WARNING "未指定工作路径,使用默认路径$PROJECT_DIR"
fi

if [[ ! -d $PROJECT_DIR ]]; then
  mkdir -p $PROJECT_DIR
fi

# 系统参数,和老版流水线保持一致
export PIPELINE_ID=$ENGINE_PIPELINE_ID
export PIPELINE_NAME=$ENGINE_PIPELINE_NAME
export BUILD_NUMBER=$ENGINE_PIPELINE_INST_NUMBER
export EMPLOYEE_ID=$operator
export PROJECT_DIR
export WORK_SPACE
export PLUGIN_DIR
export stepIdentifier
export STEP_CONTEXT

# 处理需要替换环境变量的变量
if [[ $PARAM_READY_TO_REPLACE_ENV ]]; then
  for PARAM_KEY in $PARAM_READY_TO_REPLACE_ENV;
  do
    echo $PARAM_KEY="${!PARAM_KEY}" >> $ENV_DIR
  done
  source $ENV_DIR
  export $(cut -d= -f1 $ENV_DIR)
fi

####################### 执行步骤脚本 #############################

if [[ -x /root/pre.sh ]]; then
    INFO 准备步骤
    step_exec /root/pre.sh
fi

INFO 执行步骤
step_exec /root/step.sh
exec_result=$?

if [[ "$exec_result" = "0" ]]; then
    SUCCESS 步骤运行成功
else
    if [[ -x /root/catch.sh ]]; then
        step_exec /root/catch.sh
    fi
    ERROR BUILD ERROR
    ERROR $BUILD_JOB_ID
    ERROR "步骤运行失败,返回码:$exec_result"
fi

if [[ -x /root/final.sh ]]; then
    step_exec /root/final.sh
fi

exit $exec_result