您如何使用gitlab-ci作业推送到gitlab存储库?

时间:2018-07-22 14:02:37

标签: git python-2.7 gitlab gitlab-ci gitlab-ci-runner

我是不熟悉GitLab CI / CD作业的人,但是我试图建立一个Python脚本,当将其推送到GitLab时,它会触发CI / CD作业来运行它,并调用一个内部函数来再次推送到GitLab只要满足某些条件。因此,例如,假设我有以下内容:

def hasFileInDirectory():
    # checks if the current directory has at least 1 other file in it
    if (1 or more files exist):
        print 'Great! You have enough files!';
    else:
        print 'Oh no! You need more files! Let me create one!';
        createFile('missingFile'+str(random.randint(0,1000000)+'.txt');
        os.system('git add -A');
        os.system('git commit -m "Automatically added new file..."');
        os.system('git push origin HEAD:master --force');

如果我自己从命令行运行此函数,则该函数似乎运行得很好,但是,它似乎无法在GitLab CI / CD作业中运行。我得到的输出是:

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxx@gitlab.com/path_to/my_repository.git/': The requested URL returned error: 403

当我致电git push时会发生此错误,所以我想知道如何解决此问题。我真的很感谢您的帮助!

2 个答案:

答案 0 :(得分:5)

GitLab CI运行程序还不能推送回购协议:存在proposal in progress here

与此同时,您可以use an SSH URL,并使用:

  • 通过GitLab中的“设置”>“ CI / CD管道” Web界面,将SSH私钥定义为秘密变量,
  • SSH密钥的公共部分存储为同一Web UI的部署密钥“设置”>“存储库”>“部署密钥”部分。

或者,作为mentioned here,您可以在个人资料的“设置”中使用“个人访问令牌”。

  

我使用范围api创建了令牌并在管道中进行配置。
  在gitlab控制台中打开项目,转到“设置”>“ CI / CD”>“秘密变量”,创建一个值为key(在配置文件中生成)的变量。
  我将“ $ {CI_JOB_TOKEN}”替换为变量“ $ {VAR01}”。

使用gitlab-ci.yml

script:
   - url_host=`git remote get-url origin | sed -e "s/https:\/\/gitlab-ci-token:.*@//g"`
   - git remote set-url origin "https://gitlab-ci-token:${CI_TAG_UPLOAD_TOKEN}@${url_host}"

CI_TAG_UPLOAD_TOKEN是Secret变量

答案 1 :(得分:2)

我们最终使用的命令是:

git tag my-new-tag
git push --repo=git@YOUR_REPO_URL:YOUR_GROUP/YOUR_PROJECT.git --tags

默认情况下,我们得到:

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@YOUR_REPO_URL:YOUR_FORK/YOUR_PROJECT.git/': The requested URL returned error: 403`

的原因是因为CI转轮执行GIT中的命令使用HTTPS协议与令牌通过@VonC指出,不支持推。

我们已经配置了转轮共享一个体积与/root/.ssh目录。因此,使用git协议和适当的ssh配置我们能够推使用Gitlab CI转轮GIT中的命令。

编辑

gitlab浇道exectuded如下(I除去清楚的目的无用参数)

docker exec -it gitlab-runner.service gitlab-runner register \
  --non-interactive \
  --name `hostname` \
  --url "some-gitlab-url" \
  ...
  --executor "docker" \
  --limit "1" \
  --docker-image "debian" \
  --docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
  --docker-volumes "/fs1/runner/builds:/builds" \
  --docker-volumes "/fs1/runner/cache:/cache" \
  --docker-volumes "/fs1/runner/profile:/root" \

因此,/root目录在我们所有的跑步者共享。因此一旦与正确配置/root/.ssh/适当键和这些键具有向右push至gitlab,它将如上所述工作。