¿Cómo empujar a otro repositorio en las acciones de github?

5 minutos de lectura

Avatar de usuario de Bjørn Olav Jalborg
Bjorn Olav Jalborg

En Github Actions, intento hacer algunos cambios en un repositorio diferente al repositorio al que pertenece el flujo de trabajo. Ver este código:

      - name: Generate API module
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |

          git clone https://user:$GITHUB_TOKEN@github.com/owner/my-repo # This works

          cd my-repo
          git config user.name "user"
          git config user.email "dev@example.com"

          git checkout -b api-version-$COMMIT

          touch new-file.sh
          git add new-file.sh
          git commit -m "Add new file"

          git remote -v # Prints:
          # origin ***github.com/owner/my-repo.git (fetch)
          # origin ***github.com/owner/my-repo.git (push)

          git push --set-upstream origin api-version-$COMMIT # This does not work
          git push --set-upstream https://user:$GITHUB_TOKEN@github.com/owner/my-repo api-version-$COMMIT # This does not work either

Puedo clonar el repositorio propietario/repositorio sin problemas. Puedo pagar la nueva rama, agregar el archivo y confirmar los cambios. El problema ocurre cuando trato de impulsar los cambios aguas arriba. Eso no funciona en absoluto, y me sale este error:

remote: Repository not found.
fatal: repository 'https://github.com/owner/my-repo/' not found

Supongo que tiene algo que ver con la autenticación. Él GITHUB_TOKEN es un token de acceso personal y tiene todos los permisos posibles.

¿Lo que da?

Hay una configuración extra para pasar en silencio $GITHUB_TOKEN en AUTHORIZATION header, que interactúa mal con otro repo git auth.

Debe eliminarlo antes de pasar a otro repositorio:

git config --unset-all http.https://github.com/.extraheader

Solución tomada de otro error de autenticación de subproceso SO al intentar copiar un repositorio con Github Actions

No estoy seguro si pudiste resolver eso todavía, pero pensé que publicaré uno posible solución para futuras personas que se encuentren con el mismo problema, al igual que yo. Tuve el mismo problema, que finalmente resultó ser la falta de permisos de edición en el repositorio al que estaba tratando de empujar. Desafortunadamente, el mensaje de error de GitHub (remote: Repository not found.) fue realmente inútil al señalar el problema real (supongo que es una cuestión de ofuscación por motivos de seguridad, pero entonces, si esa cuenta ya pudo clone el repositorio y tengo acceso de lectura a él, ¿cuál es el punto de ofuscación? Esto obviamente es un problema de autorización para un usuario ya autenticado 🤷🏻‍♂️). De cualquier manera, pude resolver esto por mi parte al obtener acceso de escritura al repositorio. Después de obtener los permisos necesarios, pude acceder con éxito a ese repositorio.

  • Nunca lo descubrí. Creé un monorepo para que funcione.

    –Bjorn Olav Jalborg

    8 de noviembre de 2021 a las 8:32

GITHUB_TOKEN es también una variable del sistema, consulte el documento aquí. Es posible que se encuentre con algún conflicto entre su secreto y el del sistema. Cambiar el nombre de su secreto a otra cosa podría funcionar.

  • Gracias, pero lamentablemente no. Mismo resultado si la variable tiene otro nombre.

    –Bjorn Olav Jalborg

    17 oct 2020 a las 10:15

  • ¿Estás seguro de que el token tiene todos los permisos necesarios?

    – Davide D´Alto

    4 de diciembre de 2020 a las 17:35

  • ¡Positivo, lo recreé varias veces! Nunca me di cuenta de lo que estaba mal. Lo que terminé haciendo fue fusionar todo el código en un repositorio.

    –Bjorn Olav Jalborg

    1 de febrero de 2021 a las 19:55


necesita crear un token de acceso privado de GitHub con permisos para repositorios y almacenarlo en un secreto, digamos ACTIONS_GITHUB_TOKEN en el repositorio en el que está ejecutando su flujo de trabajo/acción.

luego pase este token a la acción de pago:

push:
  runs-on: ubuntu-latest
  steps:
    - uses: actions/checkout@v3
      with:
        repository: <repo name>
        ref: 'master'
        token:  ${{ secrets.ACTIONS_GITHUB_TOKEN }}
    - name: setup git config
      run: |
        git config user.name "GitHub Actions Bot"
        git config user.email "<>"
    - <make changes and commit >
    - run: git push origin master

# .github/workflows/deploy.yml
name: Deploy GitHub Pages to external repository

on:
  # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#on
  #  push:
  #    branches: [ "main" ]
  push:
    tags:
      - "*"

jobs:
  build:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [18.x]

    steps:
      - uses: actions/checkout@v3

      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: yarn

      - name: Install dependencies
        run: yarn install --frozen-lockfile

      - name: Build website
        run: yarn build

      - name: Deploy to external repository
        uses: cpina/github-action-push-to-another-repository@main
        env:
          # 🏗️ <internal repository>, run GitHub Action.
          # 🎁 <external repository>, receiving Artifacts.
          #
          # Way 1: using Personal Access Token
          # @see https://cpina.github.io/push-to-another-repository-docs/setup-using-personal-access-token.html#setup-personal-access-token
          # 1.1 Generate Personal Access Token: <external repository>/<Avatar>/Settings/Developer settings/Personal access tokens/Generate new token
          #     Select `No expiration` and Check `✅️ repo    Full control of private repositories`, Generate and then Copy the Token
          # 1.2 Then make the token available to the GitHub Action: <internal repository>/Settings/Secrets/Actions/New repository secret
          #     Name: EXTERNAL_REPOSITORY_PERSONAL_ACCESS_TOKEN, Value Paste the Token
          API_TOKEN_GITHUB: ${{ secrets.EXTERNAL_REPOSITORY_PERSONAL_ACCESS_TOKEN }}
          # Way 2: using SSH deploy keys
          # @see https://cpina.github.io/push-to-another-repository-docs/setup-using-ssh-deploy-keys.html#setup-ssh-deploy-keys
          # 2.1 Generate an SSH key in terminal (Leave the passphrase empty)
          # 2.2 Add public key in the external repository: <external repository>/Settings/Deploy keys/Add deploy key
          #     Name: DEPLOY_PUBLIC_KEY, Value Paste the public key. Enable "✅️ Allow write access"
          # 2.3 Add private key in the source repository: <external repository>/Settings/Secrets/Actions/New repository secret
          #     Name: DEPLOY_PRIVATE_KEY, Value Paste the private key.
          # SSH_DEPLOY_KEY: ${{ secrets.DEPLOY_PRIVATE_KEY }}

        with:
          # GitHub Action output files
          source-directory: public/
          destination-github-username: <external org/user name>
          destination-repository-name: <external repository>
          user-email: <your email>
          # It defaults to `main`
          target-branch: "gh-pages"

      - name: Test get variable exported by push-to-another-repository
        run: echo $DESTINATION_CLONED_DIRECTORY

Avatar de usuario de Александр Савин
Александр Савин

Hay una acción para esto:

name: Push File(or Dir) to another repository

on: push

jobs:
  copy-file:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Push to another repo
      uses: dmnemec/copy_file_to_another_repo_action@main
      env:
        API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }} 
      with:
        source_file: 'test2.md'
        destination_repo: 'another_repo/release-test'
        destination_folder: 'test-dir' # optional
        user_email: 'example@email.com'# your email
        user_name: 'dmnemec'           # your login
        commit_message: 'A custom message for the commit'

https://github.com/dmnemec/copy_file_to_another_repo_action

¿Ha sido útil esta solución?