让 TravisCI 提交并推送带有标签(发布)的修改后的文件

Getting TravisCI to commit and push a modified file with Tags (releases)

今天早些时候,阿索斯爵士(非常感谢您)在一个单独的问题上帮助了我,这对我帮助很大。

我现在被困在一个点上,我想修改一个简单的文本文件并将其包含在我的推送中。所以基本上我想将修改后的文本文件添加到提交中,并将其作为提交推送,并将其内部版本号标记作为发布。希望我说得有道理。

到目前为止,我尝试执行此操作的代码是

#!/bin/bash
YEAR=$(date +"%Y")
MONTH=$(date +"%m")
git config --global user.email "${GIT_EMAIL}"
git config --global user.name "${GIT_NAME}"
git config --global push.default simple
export GIT_TAG=v2.$YEAR-$MONTH.$TRAVIS_BUILD_NUMBER
git fetch --tags
msg="Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
echo "$msg" >> $TRAVIS_BUILD_DIR/build.txt
git add -A
if git tag $GIT_TAG -a -m "$msg" 2>/dev/null; then
git tag $GIT_TAG -a -m "Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG} HEAD:master && git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG} --tags HEAD:master
ls -aR
else echo Tag already exists!; fi

Athos 爵士早些时候给我的 if ... else ... 代码可以 100% 工作,如果标签存在,它会拾取它,然后如果它不存在则推送或不推送它确实存在。

我只是坚持现在让 Travis 包含简单的 build.txt 文件,我将 $TRAVIS_BUILD_DIR 附加到其中。

有趣的是,如果我像这样添加到我的 travis.yml 部署选项:

file: - build.txt

Travis 将 build.txt 文件与版本一起推送,但未提交该文件。我知道我正在做并且在这里遗漏了一些非常愚蠢的东西但是放轻松我是 Travis 的新手。

更新:

现在我修改了我的 bash 脚本如下,删除了在 if 语句中添加的额外标记。这现在可以工作并将修改后的 build.txt 文件推送到 repo。但是,一旦完成,Travis 便会使用 untagged-cc6ebe6dbcbb13bc599c 开始其他构建,现在它让 Travis 陷入循环,继续构建、构建和构建。我认为 Travis 会把我逼疯的,我知道我有些逻辑错误。

    #!/bin/bash
    YEAR=$(date +"%Y")
    MONTH=$(date +"%m")
    git config --global user.email "${GIT_EMAIL}"
    git config --global user.name "${GIT_NAME}"
    git config --global push.default simple
    export GIT_TAG=v2.$YEAR-$MONTH.$TRAVIS_BUILD_NUMBER
    git fetch --tags
    msg="Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
    if git tag $GIT_TAG -a -m "$msg" 2>/dev/null; then
    echo "$msg" >> $TRAVIS_BUILD_DIR/build.txt
    git add $TRAVIS_BUILD_DIR/build.txt
    git commit -m "Update build version file with $TRAVIS_BUILD_NUMBER"
$TRAVIS_BUILD_NUMBER"
    git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG} HEAD:master && git push https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG} --tags HEAD:master
    ls -aR
    else echo Tag already exists!; fi

我想我必须在早上用我的 travis.yml 重新审视这个问题并努力做事 before_deploy 然后使用 deploy 进行最后的推送。我想我已经弄明白为什么我要让 Travis 不停地循环了。今晚已将其禁用,这样 Travis 就不会整晚都精神错乱了。

您正在 git 中添加文件,但在推送之前未提交:

msg="Tag...
echo "$msg" >> $TRAVIS_BUILD_DIR/build.txt
git add $TRAVIS_BUILD_DIR/build.txt
git commit -m "Update build version file"
if git tag ...

如果你有多个 sub-builds 运行 这个脚本,你应该在 if git tag 内提交,这样你就不会得到多个(未推送的)提交:

msg="Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
if git tag $GIT_TAG -a -m "$msg" 2>/dev/null; then
    echo "$msg" >> $TRAVIS_BUILD_DIR/build.txt
    git add $TRAVIS_BUILD_DIR/build.txt
    git commit -m "Update build version file"
    git push ...
else ...

(另请注意,您 运行ning git 标记两次,一次在 if 语句中,然后再次在 if 中;没有必要到 re-tag,if 条件也同时标记。

我终于弄清楚了我的逻辑错误,并在这里解释一下,希望这对以后的人有所帮助。非常感谢 Athos 爵士在这一切上引导我朝着正确的方向前进,非常感谢您的先生。

首先,我对文件进行了修改,并在 before_deploy 中进行了提交:travis.yml 的部分导致 TravisCI 旋转成一个连续的循环,并创建了所有标记为 untagged-randomnumbers

我现在通过对脚本中的文件进行任何修改解决了这个问题:Travis.yml

的部分

所以,考虑到这只是一个测试容器,我有一个名为 changefile.sh 的脚本,如下所示:

#!/bin/bash
YEAR=$(date +"%Y")
MONTH=$(date +"%m")
git config --global user.email "${GIT_EMAIL}"
git config --global user.name "${GIT_NAME}"
git config --global push.default simple
export GIT_TAG=V2.$YEAR-$MONTH.$TRAVIS_BUILD_NUMBER
msg="Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
echo "$msg" >> $TRAVIS_BUILD_DIR/build.txt
git add $TRAVIS_BUILD_DIR/build.txt
git commit -m "Update build version file with $TRAVIS_BUILD_NUMBER"

接下来我有一个名为 deploy.sh 的脚本,如下所示:

#!/bin/bash
YEAR=$(date +"%Y")
MONTH=$(date +"%m")
git config --global user.email "${GIT_EMAIL}"
git config --global user.name "${GIT_NAME}"
git config --global push.default simple
git remote add origin https://${GH_TOKEN}@github.com/${TRAVIS_REPO_SLUG}.git
export GIT_TAG=V2.$YEAR-$MONTH.$TRAVIS_BUILD_NUMBER
git fetch --tags
msg="Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
if git tag $GIT_TAG -a -m "$msg" 2>/dev/null; then
git tag $GIT_TAG -a -m "Tag Generated from TravisCI for build $TRAVIS_BUILD_NUMBER"
git push origin master && git push origin master --tags
ls -aR
else echo Tag already exists!; fi

我的travis.yml(简化版)现在看起来像这样:

language: php
sudo: required
dist: trusty
env:
  global:
    - secure: lotsofrandomnumbers
    - GIT_NAME: Travis CI
    - GIT_EMAIL: builds@travis-ci.org
    - TRAVIS_REPO_SLUG: mygitusername/myreposlug
    - GIT_BRANCH: master
matrix:
  fast_finish: true
php:
  - '5.6'
cache:
  - apt
install:
  # do some stuff here
script:
  # do some more stuff here
  - ./changefile.sh
before_deploy:
  - ./deploy.sh
deploy:
  provider: releases
  api_key:
    secure: ${GH_TOKEN}
  file:
  # add files to the release - specify them individually instead of a git add . or git add -A
  - "test.txt"
  skip_cleanup: true
  on:
    repo: mygitusername/myreposlug
    tags: false
    all_branches: true
notifications:
    email: false

这现在实现了我想要的 100%,并且不会导致 TravisCI 陷入循环。

Travis 现在首先在我的 master 分支上构建,使用标签和修改后的文件推出发布,然后 TravisCI 将进行后续构建(显然是非常正常的 Travis 行为),在我的例子中,Travis 中标记为V2.whatever 版本号,但涉及与主版本相同的提交号。

这是运行第二次构建测试,但实际上并没有推送任何标签、提交或更改,因此不再让 TravisCI 进入连续循环。您将看到第二个构建以消息 "Skipping a deployment with the releases provider because this is not a tagged commit" 结束,而您的第一个构建将退出并显示一条消息 "Deploying application"