1
votes

rsync ne trouve pas le répertoire local lors de l'envoi via SSH sur le pipeline

Utilisation de pipelines bitbucket pour pousser vers notre télécommande à partir du processus de construction que vous obtenez du pipeline.

Ceci est un extrait du fichier bitbucket-pipelines.yml

ssh -A -tt -i /root/.ssh/pipelines_id -o StrictHostKeyChecking=no -p 22007 {USER}@{HOST} 'rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 "$PWD" {USER}@{HOST}:/home/{USER}'

La connexion elle-même fonctionne, et elle exécute la commande correctement une fois qu'elle est distante sur le serveur ...

INFO: Executing the pipe...
INFO: Using default ssh key
INFO: Executing command on {HOST}
ssh -A -tt -i /root/.ssh/pipelines_id -o StrictHostKeyChecking=no -p 22007 {USER}@{HOST} 'rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 /opt/atlassian/pipelines/agent/build/ {USER}@{HOST}:home/{USER}'
bash: rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 /opt/atlassian/pipelines/agent/build/ {USER}@{HOST}:home/{USER}: No such file or directory
Connection to {HOST} closed.

J'ai essayé pour exécuter la même commande localement à partir du répertoire de ma machine

- pipe: atlassian/ssh-run:0.2.2
        variables:
          SSH_USER: $PRODUCTION_USER
          SERVER: $PRODUCTION_SERVER
          COMMAND: '''rsync -zrSlh -e "ssh -p 22007" --stats --max-delete=0 $BITBUCKET_CLONE_DIR/ $PRODUCTION_USER@$PRODUCTION_SERVER:home/$PRODUCTION_USER'''
          PORT: '22007'

mais cela ne fait que dupliquer le répertoire personnel de la télécommande.

Cela me ressemble il recherche le répertoire source sur le serveur et ne regarde pas le conteneur docker de bitbucket (ou les fichiers sur ma machine locale avec pwd).

Si j'essaye d'exécuter le commande sans le '' alors il échoue car il utilise le port 22 par défaut. J'ai également essayé de décaler la commande dans un script bash et d'utiliser MODE: 'Script' qui est un modèle acceptable pour le plugin , mais je ne peux pas utiliser mes variables d'environnement dans le fichier sh .


0 commentaires

3 Réponses :


1
votes

Si tout ce que vous ne voulez pas faire est de copier les fichiers du pipeline vers le serveur de production, vous devriez le rsync-deploy , au lieu du ssh-run. Votre configuration de canal ressemblera à peu près à ce qui suit:

script:
  - pipe: atlassian/rsync-deploy:0.3.2
    variables:
      USER: $PRODUCTION_USER
      SERVER: $PRODUCTION_USER
      REMOTE_PATH: 'home/$PRODUCTION_USER'
      LOCAL_PATH: 'build'
      SSH_PORT: '22007'

Assurez-vous de configurer correctement vos clés SSH dans les pipelines (voici un lien vers nos documents pour configurer les clés SSH https://confluence.atlassian.com/bitbucket/use-ssh -keys-in-bitbucket-pipelines-847452940.html )


2 commentaires

Salut Alexander, merci pour le commentaire. J'utilisais rsync-deploy avant, mais il a défini --delete-after , ce qui n'est pas bon pour nous car nous ne voulons pas tout supprimer sur le serveur après la synchronisation. Cela a déjà été mentionné here , mais la solution pour forcer le pipeline à échouer n'était pas appropriée. Vous aviez mentionné que vous envisageriez si --delete-after devrait être facultatif, et je pense que cela devrait vraiment être [1/2]


car nous avons besoin de synchroniser les fichiers avec le répertoire personnel ainsi que le répertoire www , donc --delete-after supprime tous les répertoires supplémentaires et les fichiers dot qui existent dans la maison annuaire (ce qui briserait évidemment les sites Web vers lesquels nous poussons). [2/2]



0
votes

J'ai trouvé un autre moyen de contourner cela au lieu d'avoir besoin d'un plugin, à la place j'exécute une rsync comme action de script

image: atlassian/default-image:latest

- rsync -rltDvzCh --max-delete=0 --stats --exclude-from=excludes -e 'ssh -e none -p 22007' $BITBUCKET_CLONE_DIR/ $PRODUCTION_USER@$PRODUCTION_SERVER:/home/$PRODUCTION_USER

Il semble que -e none code> est un ajout important, tout comme le chargement dans l'image atlassian, car il ne parvient pas à trouver la fonction rsync , sinon. J'ai trouvé ces informations sur ce message sur la communauté Atlassian.


0 commentaires

0
votes

Cela semble fonctionner assez bien pour moi

image: node:10.15.3

pipelines:
  default:
    - step:
        name: <project-path>
        script:
        - apt-get update && apt-get install -y rsync
        - ssh-keyscan -H $SSH_HOST >> ~/.ssh/known_hosts
        - cd $BITBUCKET_CLONE_DIR
        - rsync -r -v -e ssh . $SSH_USER@$SSH_HOST:/<project-path>
        - ssh $SSH_USER@$SSH_HOST 'cd <project-path> && npm install'
        - ssh $SSH_USER@$SSH_HOST 'pm2 restart 0'

Remarque: évitez d'utiliser sudo cmd dans les scripts de pipeline


0 commentaires