Compare commits
11 Commits
v202007021
...
v202007141
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
282f386ced | ||
|
|
cf3d098c7a | ||
|
|
71a43cffca | ||
|
|
735b1d3c28 | ||
|
|
61c2f4ac26 | ||
|
|
c6f5906aa1 | ||
|
|
216045d0eb | ||
|
|
de2c7907a1 | ||
|
|
162e340368 | ||
|
|
dc659980cd | ||
|
|
1f37634adc |
1
.github/workflows/ci.yml
vendored
1
.github/workflows/ci.yml
vendored
@@ -1,6 +1,7 @@
|
|||||||
name: CI
|
name: CI
|
||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
workflow_dispatch:
|
||||||
jobs:
|
jobs:
|
||||||
CI:
|
CI:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
22
README.md
22
README.md
@@ -1,10 +1,22 @@
|
|||||||
# actions-sync
|
# Actions Sync
|
||||||
|
|
||||||
Sync GitHub Action repositories from https://www.github.com to your GHES instance.
|
<p align="center">
|
||||||
|
<img src="docs/arrow.png">
|
||||||
|
</p>
|
||||||
|
|
||||||
## Non air-gapped GHES instances
|
This is a standalone Go tool to allow you to sync from [GitHub](https://www.github.com) to a [GitHub Enterprise instance](https://github.com/enterprise). GitHub Enterprise is referred to as `GHES` throughout this document.
|
||||||
|
|
||||||
When there are machines which have access to both the public interenet and the the GHES instance run `actions-sync sync`.
|
* Current status: **ready for production use**
|
||||||
|
* Download from: [releases page](https://github.com/actions/actions-sync/releases/)
|
||||||
|
* Build status: 
|
||||||
|
|
||||||
|
It is designed to work when:
|
||||||
|
* The GitHub Enterprise instance is seperate from the rest of the internet.
|
||||||
|
* The GitHub Enterprise instance is connected to the rest of the internet.
|
||||||
|
|
||||||
|
## Connected instances
|
||||||
|
|
||||||
|
When there are machines which have access to both the public internet and the GHES instance run `actions-sync sync`.
|
||||||
|
|
||||||
**Command:**
|
**Command:**
|
||||||
|
|
||||||
@@ -35,7 +47,7 @@ When there are machines which have access to both the public interenet and the t
|
|||||||
--repo-name actions/setup-node
|
--repo-name actions/setup-node
|
||||||
```
|
```
|
||||||
|
|
||||||
## Air-gapped GHES instances
|
## Not connected instances
|
||||||
|
|
||||||
When no machine has access to both the public internet and the GHES instance:
|
When no machine has access to both the public internet and the GHES instance:
|
||||||
|
|
||||||
|
|||||||
BIN
docs/arrow.png
Normal file
BIN
docs/arrow.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.8 KiB |
@@ -21,34 +21,34 @@ trap "after_suite" SIGINT
|
|||||||
|
|
||||||
function test_pull() {
|
function test_pull() {
|
||||||
# Pull new repo
|
# Pull new repo
|
||||||
setup_src "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_src "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_cache
|
setup_cache
|
||||||
pull --repo-name "org/repo" "pulling new repo"
|
pull --repo-name "org/repo" "pulling new repo"
|
||||||
assert_cache_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "pulling new repo org/repo"
|
assert_cache_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "pulling new repo org/repo"
|
||||||
|
|
||||||
echo "all pull tests passed successfully"
|
echo "all pull tests passed successfully"
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_push() {
|
function test_push() {
|
||||||
# Push with a new change to master
|
# Push with a new change to main
|
||||||
setup_cache "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_cache "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
|
|
||||||
push "pushing new commit to master"
|
push "pushing new commit to main"
|
||||||
assert_dest_sha "org/repo" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:heads/master to new commit"
|
assert_dest_sha "org/repo" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:heads/main to new commit"
|
||||||
|
|
||||||
# Push a non-linear change
|
# Push a non-linear change
|
||||||
setup_cache "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_cache "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_dest "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_dest "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
|
|
||||||
push "pushing to an old commit to master"
|
push "pushing to an old commit to main"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "updating heads/master to an old commit"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "updating heads/main to an old commit"
|
||||||
|
|
||||||
# Push with no changes to master
|
# Push with no changes to main
|
||||||
setup_cache "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_cache "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
push "pushing no changes to master"
|
push "pushing no changes to main"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "leaving org/repo:heads/master at existing commit"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "leaving org/repo:heads/main at existing commit"
|
||||||
|
|
||||||
# Push multiple branches
|
# Push multiple branches
|
||||||
setup_cache "org/repo:heads/change:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
setup_cache "org/repo:heads/change:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
||||||
@@ -61,86 +61,86 @@ function test_push() {
|
|||||||
assert_dest_sha "org/repo" "heads/nochange" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "leaving org/repo:heads/nochange at existing commit"
|
assert_dest_sha "org/repo" "heads/nochange" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "leaving org/repo:heads/nochange at existing commit"
|
||||||
|
|
||||||
# Pushing multiple branches and tags
|
# Pushing multiple branches and tags
|
||||||
setup_cache "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
setup_cache "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
||||||
"org/repo:tags/v1:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
"org/repo:tags/v1:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
||||||
"org/repo:tags/v1:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
"org/repo:tags/v1:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
|
|
||||||
push "pushing multiple branches and tags"
|
push "pushing multiple branches and tags"
|
||||||
assert_dest_sha "org/repo" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:heads/master to new commit"
|
assert_dest_sha "org/repo" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:heads/main to new commit"
|
||||||
assert_dest_sha "org/repo" "tags/v1" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:tags/v1 to new commit"
|
assert_dest_sha "org/repo" "tags/v1" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org/repo:tags/v1 to new commit"
|
||||||
|
|
||||||
# Pushing multiple repositories
|
# Pushing multiple repositories
|
||||||
setup_cache "org1/repo1:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
setup_cache "org1/repo1:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
||||||
"org1/repo2:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
"org1/repo2:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
||||||
"org1/repo2:tags/v1:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
"org1/repo2:tags/v1:e9009d51dd6da2c363d1d14779c53dd27fcb0c52" \
|
||||||
"org2/repo1:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
"org2/repo1:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_dest "org1/repo1:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
setup_dest "org1/repo1:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
||||||
"org1/repo2:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
"org1/repo2:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
||||||
"org1/repo2:tags/v1:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
"org1/repo2:tags/v1:a5984bb887dd2fcdc2892cd906d6f004844d1142" \
|
||||||
"org2/repo1:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
"org2/repo1:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
|
|
||||||
push "pushing multiple repositories"
|
push "pushing multiple repositories"
|
||||||
assert_dest_sha "org1/repo1" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo1:heads/master to new commit"
|
assert_dest_sha "org1/repo1" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo1:heads/main to new commit"
|
||||||
assert_dest_sha "org1/repo2" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo2:heads/master to new commit"
|
assert_dest_sha "org1/repo2" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo2:heads/main to new commit"
|
||||||
assert_dest_sha "org1/repo2" "tags/v1" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo2:tags/v1 to new commit"
|
assert_dest_sha "org1/repo2" "tags/v1" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org1/repo2:tags/v1 to new commit"
|
||||||
assert_dest_sha "org2/repo1" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org2/repo1:tags/v1 to new commit"
|
assert_dest_sha "org2/repo1" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "updating org2/repo1:tags/v1 to new commit"
|
||||||
|
|
||||||
echo "all push tests passed successfully"
|
echo "all push tests passed successfully"
|
||||||
}
|
}
|
||||||
|
|
||||||
function test_sync() {
|
function test_sync() {
|
||||||
# Sync no change without cached
|
# Sync no change without cached
|
||||||
setup_src "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_src "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_cache
|
setup_cache
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing no changes without cache"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing no changes without cache"
|
||||||
|
|
||||||
# Sync a new commit without cache
|
# Sync a new commit without cache
|
||||||
setup_src "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_src "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_cache
|
setup_cache
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing a new commit without cache"
|
assert_dest_sha "org/repo" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing a new commit without cache"
|
||||||
|
|
||||||
# Sync no change with uncached
|
# Sync no change with uncached
|
||||||
setup_src "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_src "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_cache "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_cache "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing no changes with cache"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing no changes with cache"
|
||||||
|
|
||||||
# Sync a new commit with cache
|
# Sync a new commit with cache
|
||||||
setup_src "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_src "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_cache "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_cache "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_dest "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
sync --repo-name "org/repo" "syncing a new commit in an uncached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing a new commit with cache"
|
assert_dest_sha "org/repo" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing a new commit with cache"
|
||||||
|
|
||||||
# Sync a non-linear change without cache
|
# Sync a non-linear change without cache
|
||||||
setup_src "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_src "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_cache
|
setup_cache
|
||||||
setup_dest "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_dest "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
|
|
||||||
sync --repo-name "org/repo" "syncing an old commit in an uncached repo"
|
sync --repo-name "org/repo" "syncing an old commit in an uncached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing heads/master to an old commit without cache"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing heads/main to an old commit without cache"
|
||||||
|
|
||||||
# Sync a non-linear change with cache
|
# Sync a non-linear change with cache
|
||||||
setup_src "org/repo:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_src "org/repo:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
setup_cache "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_cache "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_dest "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_dest "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
|
|
||||||
sync --repo-name "org/repo" "syncing an old commit in an cached repo"
|
sync --repo-name "org/repo" "syncing an old commit in an cached repo"
|
||||||
assert_dest_sha "org/repo" "heads/master" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing heads/master to an old commit with cache"
|
assert_dest_sha "org/repo" "heads/main" "a5984bb887dd2fcdc2892cd906d6f004844d1142" "syncing heads/main to an old commit with cache"
|
||||||
|
|
||||||
# Sync to a different repo
|
# Sync to a different repo
|
||||||
setup_src "org/repo:heads/master:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
setup_src "org/repo:heads/main:e9009d51dd6da2c363d1d14779c53dd27fcb0c52"
|
||||||
setup_cache
|
setup_cache
|
||||||
setup_dest "org2/repo2:heads/master:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
setup_dest "org2/repo2:heads/main:a5984bb887dd2fcdc2892cd906d6f004844d1142"
|
||||||
|
|
||||||
sync --repo-name "org/repo:org2/repo2" "syncing org/repo aliased to org2/repo2"
|
sync --repo-name "org/repo:org2/repo2" "syncing org/repo aliased to org2/repo2"
|
||||||
assert_dest_sha "org2/repo2" "heads/master" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing org/repo aliased to org2/repo2"
|
assert_dest_sha "org2/repo2" "heads/main" "e9009d51dd6da2c363d1d14779c53dd27fcb0c52" "syncing org/repo aliased to org2/repo2"
|
||||||
|
|
||||||
echo "all sync tests passed successfully"
|
echo "all sync tests passed successfully"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ func getOrCreateGitHubRepo(ctx context.Context, client *github.Client, repoName,
|
|||||||
HasProjects: github.Bool(false),
|
HasProjects: github.Bool(false),
|
||||||
}
|
}
|
||||||
ghRepo, resp, err := client.Repositories.Create(ctx, orgName, repo)
|
ghRepo, resp, err := client.Repositories.Create(ctx, orgName, repo)
|
||||||
if resp.StatusCode == 422 {
|
if resp != nil && resp.StatusCode == 422 {
|
||||||
ghRepo, _, err = client.Repositories.Get(ctx, orgName, repoName)
|
ghRepo, _, err = client.Repositories.Get(ctx, orgName, repoName)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
2
test/fixtures/repo.git/HEAD
vendored
2
test/fixtures/repo.git/HEAD
vendored
@@ -1 +1 @@
|
|||||||
ref: refs/heads/master
|
ref: refs/heads/main
|
||||||
|
|||||||
Reference in New Issue
Block a user