Lors de l'exécution d'une build pour le référentiel git giantswarm/docs-content
dans CircleCI, j'aimerais pousser un commit vers un autre référentiel giantswarm/docs
.
Je l'ai dans la section deployment
de circle.yml
:
git config credential.helper cache
git config user.email "<some verified email>"
git config user.name "Github Bot"
git clone --depth 1 https://${GITHUB_PERSONAL_TOKEN}:[email protected]/giantswarm/docs.git
cd docs/
git commit --allow-empty -m "Trigger build and publishing via docs-content"
git Push -u Origin master
Cette échoue dans la toute dernière commande avec ce message d'erreur:
ERROR: The key you are authenticating with has been marked as read only.
fatal: Could not read from remote repository.
Le GITHUB_PERSONAL_TOKEN
la variable d'environnement est définie sur le jeton d'accès personnel d'un utilisateur, qui a été créé avec la portée repo
pour accéder au référentiel privé giantswarm/docs
. De plus, j'ai ajouté l'utilisateur à une équipe disposant des autorisations d'administrateur pour ce dépôt.
Cette série de commandes fonctionne très bien lorsque je l'exécute dans une nouvelle machine virtuelle Ubuntu. Une idée pourquoi ce n'est pas le cas sur CircleCI?
Merci à l'indice de ALi Amin J'ai maintenant cette solution de travail:
version: 2
jobs:
build:
machine: true
steps:
- run:
name: Clone docs
working_directory: ~/workdir
command: |
git clone --depth 1 https://${DOCS_GITHUB_TOKEN}@github.com/giantswarm/docs.git
- deploy:
name: Trigger docs deployment
working_directory: ~/workdir/docs
command: |
git config credential.helper 'cache --timeout=120'
git config user.email "<email>"
git config user.name "Deployment Bot"
git commit --allow-empty -m "Trigger deployment"
# Push quietly to prevent showing the token in log
git Push -q https://${DOCS_GITHUB_TOKEN}@github.com/giantswarm/docs.git master
Quelques notes:
git clone
est le premier.git
suivantes doivent être exécutées dans le répertoire clone. working_directory
simplifie beaucoup cela.DOCS_GITHUB_TOKEN
est un jeton d'accès personnel avec une portée repo
pour le référentiel cible.J'ai utilisé
git Push -q https://${GITHUB_PERSONAL_TOKEN}@github.com/<user>/<repo>.git master
et ça a marché. Mettez-le à jour pour être:
# Push changes
git config credential.helper 'cache --timeout=120'
git config user.email "<email>"
git config user.name "<user-name>"
git add .
git commit -m "Update via CircleCI"
# Push quietly to prevent showing the token in log
git Push -q https://${GITHUB_PERSONAL_TOKEN}@github.com/giantswarm/docs.git master
Bien que l'incorporation du jeton dans la commande fonctionne pour ce cas, il peut ne pas fonctionner pour tous les cas et ne répond pas à la question.
D'autres cas incluraient des scripts qui n'exposent pas un accès direct à la commande git
. Ils comptent sur le GH_TOKEN
variable étant définie et vous ne pourriez pas l'injecter comme dans l'exemple.
Cela ne répond pas à la question:
Une idée pourquoi ce n'est pas le cas sur CircleCI?
Sur le forum de support CircleCI, il y a une réponse à ce sujet:
L'exécution de git Push entraîne "ERREUR: la clé avec laquelle vous vous authentifiez a été marquée en lecture seule".
La clé de déploiement avec laquelle le projet est configuré, par défaut lorsque vous ajoutez un projet sur CircleCI, n'a qu'un accès en lecture, donc une clé avec des autorisations d'écriture doit être configurée pour être utilisée, afin d'éviter le message d'erreur ci-dessus. Veuillez vous assurer qu'une clé utilisateur ou une clé de déploiement en lecture-écriture a été configurée pour le projet
https://circleci.com/docs/2.0/gh-bb-integration/#creating-a-github-deploy-key
Après avoir suivi ce processus, vous devriez avoir une clé de déploiement avec des autorisations d'écriture qui autorise le Push.