Skip to content
Merged
Show file tree
Hide file tree
Changes from 14 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,11 @@ jobs:

steps:
# To use this repository's private action, you must check out the repository
- name: Checkout
-
name: Checkout
uses: actions/checkout@v3
- name: Test action step
-
name: Test action step
uses: ./ # Uses an action in the root directory
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/test_pat.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
name: test-pat

on:
pull_request:
push:
# manual trigger
workflow_dispatch:

jobs:
test-implementation-job:

runs-on: ubuntu-latest

steps:
# To use this repository's private action, you must check out the repository
-
name: Checkout
uses: actions/checkout@v3
-
name: Test action step PAT
uses: ./ # Uses an action in the root directory
with:
github_token: ${{ secrets.SOURCE_REPO_PAT }}
source_repo_path: ${{ secrets.SOURCE_REPO_PATH_TEST }} # <owner/repo>, should be within secrets
is_dry_run: true
6 changes: 4 additions & 2 deletions .github/workflows/test_ssh.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@ jobs:

steps:
# To use this repository's private action, you must check out the repository
- name: Checkout
-
name: Checkout
uses: actions/checkout@v3
- name: Test action step ssh
-
name: Test action step ssh
uses: ./ # Uses an action in the root directory
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
Expand Down
9 changes: 7 additions & 2 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
######################################
FROM alpine:3.17.0 as dev

ARG GH_CLI_VER=2.15.0
ARG GH_CLI_VER=2.21.1

# install packages
RUN apk add --update --no-cache bash make git zsh curl tmux musl openssh git-lfs
RUN apk add --update --no-cache bash make git zsh curl tmux musl openssh git-lfs vim

RUN wget https://github.com/cli/cli/releases/download/v${GH_CLI_VER}/gh_${GH_CLI_VER}_linux_386.tar.gz -O ghcli.tar.gz
RUN tar --strip-components=1 -xf ghcli.tar.gz
Expand All @@ -17,6 +17,11 @@ RUN echo "set-option -g default-shell /bin/zsh" >> /root/.tmux.conf
# install oh-my-zsh
RUN sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

ADD src/*.sh /bin/
RUN chmod +x /bin/entrypoint.sh \
&& chmod +x /bin/sync_template.sh \
&& chmod +x /bin/sync_common.sh

RUN mkdir -p /root/.ssh \
&& ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts

Expand Down
16 changes: 9 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,7 @@ You will receive a pull request within your repository if there are some changes
| github_token | Token for the repo. Can be passed in using `$\{{ secrets.GITHUB_TOKEN }}` | `true` | |
| source_repo_path | Repository path of the template | `true` | |
| upstream_branch | The target branch | `true` | `main` |
| source_repo_ssh_private_key | `[optional]` private ssh key for the source repository. E.q. useful if using a private template repository. [see](#private-template-repository)| `false` | |
| source_repo_github_token | `[optional]` separate github token to interact with the source repository. | `false` | `$\{{ inputs.github_token }}` |
| source_repo_ssh_private_key | `[optional]` private ssh key for the source repository. [see](#private-template-repository)| `false` | |
| pr_branch_name_prefix | `[optional]` the prefix of branches created by this action | `false` | `chore/template_sync` |
| pr_title | `[optional]` the title of PRs opened by this action. Must be already created. | `false` | `upstream merge template repository` |
| pr_labels | `[optional]` comma separated list. [pull request labels][pr-labels]. Must be already created. | `false` | |
Expand All @@ -89,7 +88,8 @@ If you have a private template repository.

#### Using github app

You can create and use a [GitHub App](https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps) to handle the access to your private repository. To generate a token for your app you can use a separate action like [tibdex/github-app-token](https://github.com/tibdex/github-app-token).
You can create and use a [GitHub App][github-app] to handle the access to your private repository.
To generate a token for your app you can use a separate action like [tibdex/github-app-token][github-app-token].

```yaml
jobs:
Expand All @@ -105,10 +105,9 @@ jobs:
private_key: ${{ secrets.PRIVATE_KEY }}

- name: actions-template-sync
uses: AndreasAugustin/[email protected].0-draft
uses: AndreasAugustin/[email protected].5-draft
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
source_repo_github_token: ${{ steps.generate_token.outputs.token }}
github_token: ${{ steps.generate_token.outputs.token }}
source_repo_path: <owner/repo>
upstream_branch: <target_branch> # defaults to main
pr_labels: <label1>,<label2>[,...] # optional, no default
Expand Down Expand Up @@ -143,7 +142,7 @@ jobs:

## Ignore Files

Create a `.templatesyncignore` file. Just like writing a `.gitignore` file, follow the [glob pattern](https://en.wikipedia.org/wiki/Glob_(programming))
Create a `.templatesyncignore` file. Just like writing a `.gitignore` file, follow the [glob pattern][glob-pattern]
in defining the files and folders that should be excluded from syncing with the template repository.

It can also be stored inside `.github` folder.
Expand Down Expand Up @@ -212,3 +211,6 @@ specification. Contributions of any kind welcome!
[pr-labels]: https://docs.github.com/en/issues/using-labels-and-milestones-to-track-work/managing-labels
[devto-example]: https://dev.to/andreasaugustin/github-actions-template-sync-1g9k
[github-example]: https://github.com/AndreasAugustin/teaching/blob/main/docs/git/git_action_sync.md
[github-app]: https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps#about-github-apps
[glob-pattern]: https://en.wikipedia.org/wiki/Glob_(programming)
[github-app-token]: https://github.com/tibdex/github-app-token
3 changes: 0 additions & 3 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@ inputs:
default: 'main'
source_repo_ssh_private_key:
description: '[optional] private ssh key for the source repository. E.q. useful if using a private template repository.'
source_repo_github_token:
description: '[optional] Separate github token to interact with the source repository. Using $\{{ inputs.github_token }} by default.'
pr_branch_name_prefix:
description: '[optional] the prefix of branches created by this action'
default: 'chore/template_sync'
Expand All @@ -40,7 +38,6 @@ runs:
image: 'src/Dockerfile'
env:
GITHUB_TOKEN: ${{ inputs.github_token }}
SOURCE_REPO_GITHUB_TOKEN: ${{ inputs.source_repo_github_token }}
SOURCE_REPO_PATH: ${{ inputs.source_repo_path }}
UPSTREAM_BRANCH: ${{ inputs.upstream_branch }}
SSH_PRIVATE_KEY_SRC: ${{ inputs.source_repo_ssh_private_key }}
Expand Down
2 changes: 1 addition & 1 deletion src/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
FROM alpine:3.17.0

ARG GH_CLI_VER=2.15.0
ARG GH_CLI_VER=2.21.1

# TODO(anau) change user
ARG GITHUB_URL="https://github.com/AndreasAugustin/actions-template-sync"
Expand Down
20 changes: 8 additions & 12 deletions src/entrypoint.sh
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,9 @@ set -x
# shellcheck source=src/sync_common.sh
source sync_common.sh

[ -z "${GITHUB_TOKEN}" ] && {
err "Missing input 'github_token: \${{ secrets.GITHUB_TOKEN }}'.";
exit 1;
};

if [[ -z "${SOURCE_REPO_GITHUB_TOKEN}" ]]; then
echo "::debug::Missing input 'source_repo_github_token: \${{ input.source_repo_github_token }}'. Using github_token as default."
SOURCE_REPO_GITHUB_TOKEN="${GITHUB_TOKEN}"
if [[ -z "${GITHUB_TOKEN}" ]]; then
err "Missing input 'github_token: \${{ secrets.GITHUB_TOKEN }}'.";
exit 1;
fi

if [[ -z "${SOURCE_REPO_PATH}" ]]; then
Expand All @@ -23,7 +18,7 @@ fi

SOURCE_REPO_HOSTNAME="${HOSTNAME:-github.com}"

# In case of private template repository this will be overwritten
# In case of ssh template repository this will be overwritten
SOURCE_REPO_PREFIX="https://${SOURCE_REPO_HOSTNAME}/"

function ssh_setup() {
Expand All @@ -46,6 +41,10 @@ function ssh_setup() {
# Forward to /dev/null to swallow the output of the private key
if [[ -n "${SSH_PRIVATE_KEY_SRC}" ]] &>/dev/null; then
ssh_setup
else
# gh auth login --git-protocol "https" --hostname "${SOURCE_REPO_HOSTNAME}"
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not working, if GITHUB_TOKEN env variable is set, the command throws.
@msiebeneicher is it possible that you use another gh version? I do not understand why this is happening

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The order here looks mandatory. Also it is not possible to use gh auth status here because gh wants to check a github.com auth by default which is not possible in a github enterprise setup. A working solution for my setup is this:

else
  git config --global "credential.https://${SOURCE_REPO_HOSTNAME}.helper" "!gh auth git-credential"
  gh auth login --git-protocol "https" --hostname "${SOURCE_REPO_HOSTNAME}" --with-token <<< "${GITHUB_TOKEN}"
fi

Copy link
Author

@AndreasAugustin AndreasAugustin Jan 2, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

related to docs gh auth status should also work on other hosts (GitHub enterprise), but seems not?

Related to your working solution
Screenshot 2023-01-02 at 17 45 54
n. Sad but it does not work on github.com https://github.com/AndreasAugustin/actions-template-sync/actions/runs/3823961230/jobs/6505672841

hmmm if it is not a gh --version issue, I guess it is a runner issue (or some magic with the former github app to token action)

Tested on https://github.com/AndreasAugustin/actions-template-sync/tree/chore/auto_test_2
with
Screenshot 2023-01-02 at 17 48 52

Update
we need to change gh auth status --hostname <hostname>

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

weird - for me it's running fine with gh 2.15.0:

image

So back to the idea of unsetting the default github_token and using an own env var for it?

Copy link
Author

@AndreasAugustin AndreasAugustin Jan 3, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes weird, just tested on my machine within a docker container also with version 2.15.0 (actually within the sync action 2.21.1 is used).

image

It is an alpine image, but also on my arch based system I receive the same error with that small test. Hmmm maybe the hostname?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aha! maybe the hostname is the issue. Related to https://cli.github.com/manual/gh_help_environment
GH_TOKEN, GITHUB_TOKEN (in order of precedence): an authentication token for github.com API requests. Setting this avoids being prompted to authenticate and takes precedence over previously stored credentials.

It states there explicitly github.com.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UPDATE
confirmed! It is the hostname variable

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@msiebeneicher with the changes I just made, the tests are working within github.com. Can you please test them in your env?
Hopefully finally it is a working solution!

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The last solution works also in my environment 🥳
good catch! Do you want to clean up the code before merge?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The last solution works also in my environment partying_face good catch! Do you want to clean up the code before merge?

think the code is cleaned up, but I will check.
That was a funny and hard issue...

gh auth setup-git --hostname "${SOURCE_REPO_HOSTNAME}"
gh auth status
fi

export SOURCE_REPO="${SOURCE_REPO_PREFIX}${SOURCE_REPO_PATH}"
Expand All @@ -60,9 +59,6 @@ function git_init() {
git config --global --add safe.directory /github/workspace
git lfs install

git config --global "credential.https://${SOURCE_REPO_HOSTNAME}.helper" "!gh auth git-credential"
gh auth login --git-protocol "https" --hostname "${SOURCE_REPO_HOSTNAME}" --with-token <<< "${GITHUB_TOKEN}"

echo "::endgroup::"
}

Expand Down
6 changes: 2 additions & 4 deletions src/sync_template.sh
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ echo "::group::Pull template"
debug "create new branch from default branch with name ${NEW_BRANCH}"
git checkout -b "${NEW_BRANCH}"
debug "pull changes from template"
gh auth login --git-protocol "https" --hostname "${SOURCE_REPO_HOSTNAME}" --with-token <<< "${SOURCE_REPO_GITHUB_TOKEN}"

# TODO(anau) eventually make squash optional
git pull "${SOURCE_REPO}" --allow-unrelated-histories --squash --strategy=recursive -X theirs
echo "::endgroup::"
Expand Down Expand Up @@ -104,11 +104,9 @@ echo "::endgroup::"

push_and_create_pr () {
if [ "$IS_DRY_RUN" != "true" ]; then
echo "::group::final gh auth login before creating pull request"
gh auth login --git-protocol "https" --hostname "${SOURCE_REPO_HOSTNAME}" --with-token <<< "${GITHUB_TOKEN}"
echo "::endgroup::"

echo "::group::push changes and create PR"
debug "push changes"
git push --set-upstream origin "${NEW_BRANCH}"

gh pr create \
Expand Down