15 Commits

Author SHA1 Message Date
Timofey Kirillov
7aaf2cce6b Merge pull request #57 from werf/upd-readme
[1.1] docs: add notice about fetch-depth into README
2022-10-21 12:35:05 +03:00
Timofey Kirillov
95ff181e6a docs: add notice about fetch-depth into README
Signed-off-by: Timofey Kirillov <timofey.kirillov@flant.com>
2022-10-21 12:33:17 +03:00
Alexey Igrychev
c5e105e95e chore(readme): fix links
Signed-off-by: Alexey Igrychev <alexey.igrychev@flant.com>
2022-08-15 08:06:09 +01:00
Alexey Igrychev
8047e055e2 chore(readme): fix failed to load werf logo 2021-12-07 16:18:17 +01:00
Alexey Igrychev
7425cd9c3c Update README.md 2021-11-10 14:28:18 +01:00
Alexey Igrychev
4033ce9a92 Merge pull request #45 from werf/feat_use_trdl_binaries_1.1
feat: download binaries directly from the trdl repository (1.1)
2021-10-28 12:24:26 +01:00
Alexey Igrychev
6acc213146 feat: download binaries directly from the trdl repository 2021-10-27 22:25:32 +01:00
Alexey Igrychev
f507c4f344 ci(test): add Test workflow 2021-10-27 22:24:02 +01:00
Alexey Igrychev
93f4252af6 build: update dependencies and lint configuration 2021-10-27 22:21:14 +01:00
Alexey Igrychev
bd74d436c7 Output envs loaded by the dotenv instead of printing a source file content 2021-03-18 17:15:21 +00:00
Alexey Igrychev
4e62aa309e [readme] Update links to werf documentation 2021-03-10 16:20:24 +00:00
Alexey Igrychev
697f06e4a1 [readme] Add "Versioning" section 2021-03-10 15:46:06 +00:00
Alexey Igrychev
47e7c4a185 [readme] Fix the "Working with container registry" section for v1.1 2021-03-10 15:31:41 +00:00
Alexey Igrychev
7c8622c3d6 [readme] Update channels, werf release cycle and compatibility promise link 2021-03-10 15:01:01 +00:00
Alexey Igrychev
156c73b693 [readme] Add "Working with container registry" section 2021-03-10 14:59:08 +00:00
21 changed files with 228379 additions and 356943 deletions

View File

@@ -1,6 +1,6 @@
{
"plugins": ["@typescript-eslint"],
"extends": ["plugin:github/es6"],
"plugins": ["@typescript-eslint", "github"],
"extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended","plugin:github/recommended"],
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 9,
@@ -13,43 +13,10 @@
"eslint-comments/no-use": "off",
"import/no-namespace": "off",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "error",
"@typescript-eslint/no-require-imports": "error",
"@typescript-eslint/array-type": "error",
"@typescript-eslint/await-thenable": "error",
"@typescript-eslint/ban-ts-ignore": "error",
"camelcase": "off",
"@typescript-eslint/camelcase": "error",
"@typescript-eslint/class-name-casing": "error",
"@typescript-eslint/explicit-function-return-type": ["error", {"allowExpressions": true}],
"@typescript-eslint/func-call-spacing": ["error", "never"],
"@typescript-eslint/generic-type-naming": ["error", "^[A-Z][A-Za-z]*$"],
"@typescript-eslint/no-array-constructor": "error",
"@typescript-eslint/no-empty-interface": "error",
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-extraneous-class": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-misused-new": "error",
"@typescript-eslint/no-namespace": "error",
"@typescript-eslint/no-non-null-assertion": "warn",
"@typescript-eslint/no-object-literal-type-assertion": "error",
"@typescript-eslint/no-unnecessary-qualifier": "error",
"@typescript-eslint/no-unnecessary-type-assertion": "error",
"@typescript-eslint/no-useless-constructor": "error",
"@typescript-eslint/no-var-requires": "error",
"@typescript-eslint/prefer-for-of": "warn",
"@typescript-eslint/prefer-function-type": "warn",
"@typescript-eslint/prefer-includes": "error",
"@typescript-eslint/prefer-interface": "error",
"@typescript-eslint/prefer-string-starts-ends-with": "error",
"@typescript-eslint/promise-function-async": "error",
"@typescript-eslint/require-array-sort-compare": "error",
"@typescript-eslint/restrict-plus-operands": "error",
"semi": "off",
"@typescript-eslint/semi": ["error", "never"],
"@typescript-eslint/type-annotation-spacing": "error",
"@typescript-eslint/unbound-method": "error"
"i18n-text/no-en": "off",
"sort-imports": "off"
},
"env": {
"node": true,

43
.github/workflows/test.yaml vendored Normal file
View File

@@ -0,0 +1,43 @@
name: Test
on:
push:
jobs:
channel:
name: By channel
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install
uses: ./install
- run: werf version
version:
name: By version
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macOS-latest, windows-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Install
uses: ./install
with:
version: v1.1.23+fix50
- run: werf version

View File

@@ -1,30 +1,42 @@
<p align="center">
<img src="https://github.com/werf/werf/raw/master/docs/images/werf-logo.svg?sanitize=true" style="max-height:100%;" height="175">
<img src="https://werf.io/assets/images/werf-logo.svg?sanitize=true" style="max-height:100%;" height="175">
</p>
___
This action set allows you to organize CI/CD with GitHub Actions and [werf](https://github.com/werf/werf). The set consists of several independent and complex actions:
- [werf/actions/converge](https://github.com/werf/actions/tree/master/converge)
- [werf/actions/build-and-publish](https://github.com/werf/actions/tree/master/build-and-publish)
- [werf/actions/build](https://github.com/werf/actions/tree/master/build)
- [werf/actions/publish](https://github.com/werf/actions/tree/master/build)
- [werf/actions/deploy](https://github.com/werf/actions/tree/master/deploy)
- [werf/actions/dismiss](https://github.com/werf/actions/tree/master/dismiss)
- [werf/actions/run](https://github.com/werf/actions/tree/master/run)
- [werf/actions/cleanup](https://github.com/werf/actions/tree/master/cleanup)
- [werf/actions/converge](https://github.com/werf/actions/tree/v1.1/converge)
- [werf/actions/build-and-publish](https://github.com/werf/actions/tree/v1.1/build-and-publish)
- [werf/actions/build](https://github.com/werf/actions/tree/v1.1/build)
- [werf/actions/publish](https://github.com/werf/actions/tree/v1.1/build)
- [werf/actions/deploy](https://github.com/werf/actions/tree/v1.1/deploy)
- [werf/actions/dismiss](https://github.com/werf/actions/tree/v1.1/dismiss)
- [werf/actions/run](https://github.com/werf/actions/tree/v1.1/run)
- [werf/actions/cleanup](https://github.com/werf/actions/tree/v1.1/cleanup)
Each action combines all the necessary steps in itself and logic may be divided into environment setup and launching the corresponding command.
**Ready-to-use GitHub Actions Workflows** for different CI/CD workflows are available [here](https://werf.io/documentation/advanced/ci_cd/github_actions.html#complete-set-of-configurations-for-ready-made-workflows).
**Ready-to-use GitHub Actions Workflows** for different CI/CD workflows are available [here](https://werf.io/v1.1-alpha/documentation/guides/github_ci_cd_integration.html#complete-set-of-configurations-for-ready-made-workflows).
> Also, there is another action — [werf/actions/install](https://github.com/werf/actions/tree/master/install). With this action a user can just install werf and use binary within job steps for own purposes
> Also, there is another action — [werf/actions/install](https://github.com/werf/actions/tree/v1.1/install). With this action a user can just install werf and use binary within job steps for own purposes
## Versioning
When using actions, select the version corresponding to the `MAJOR.MINOR` version of werf:
```yaml
# run converge with actual werf version for 1.1 alpha channel
- uses: werf/actions/converge@v1.1
# run converge with actual werf version for 1.2 alpha channel
- uses: werf/actions/converge@v1.2
```
## Environment setup in details
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for 1.1 alpha channel (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations
@@ -77,6 +89,21 @@ Any werf option can be defined with environment variables:
WERF_TAG_CUSTOM_TAG2: tag2
```
## Working with container registry
Due to the fact that the new GitHub container registry (`ghcr.io`) does not currently support removal, all actions default to the old one (`docker.pkg.github.com`).
If necessary, the user can define an arbitrary container registry using the `WERF_REPO` and `WERF_REPO_IMPLEMENTATION` environment variables.
```yaml
- uses: werf/actions/converge@v1.1
env:
WERF_REPO: "gcr.io/company/app"
WERF_REPO_IMPLEMENTATION: "gcr"
```
To learn how to work with the different container registries, see the corresponding [article in the werf documentation](https://werf.io/v1.1-alpha/documentation/reference/working_with_docker_registries.html).
## Examples
### converge
@@ -229,6 +256,23 @@ werf:
WERF_ENV: production
```
# FAQ
## werf always rebuilds images on new commit
Make sure to use `fetch-depth: 0` setting in the checkout action, like follows:
```
- name: Checkout code
uses: actions/checkout@v2
with:
fetch-depth: 0
```
By default fetch-depth set to `1` which disables git history when checking out code. werf cache selection algorithm uses git history to determine whether some image bound to some commit could be used as a cache when building current commit (current commit should be descendant to the cache commit).
Setting `fetch-depth` to `0` enables full fetch of git history and it is a **recommended** approach. It is also possible to limit fetch history with some decent number of commits, which would enable images caching limited to that number of commits, but this would have a negative impact on cache reproducibility.
# License
Apache License 2.0, see [LICENSE](LICENSE)

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ The action combines all the necessary steps in itself and logic may be divided i
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ The action combines all the necessary steps in itself and logic may be divided i
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ The action combines all the necessary steps in itself and logic may be divided i
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ The action combines all the necessary steps in itself and logic may be divided i
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

File diff suppressed because one or more lines are too long

View File

@@ -3,7 +3,7 @@
</p>
___
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

File diff suppressed because one or more lines are too long

3950
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,29 @@
{
"name": "werf-actions",
"version": "1.1.0",
"version": "1.1.1",
"description": "",
"main": "lib",
"dependencies": {
"@actions/core": "^1.2.6",
"@actions/github": "2.x",
"@actions/tool-cache": "1.x",
"dotenv": "8.2.x",
"ncc": "^0.3.6",
"semver": "^7.3.2",
"@actions/core": "^1.6.0",
"@actions/github": "^5.0.0",
"@actions/tool-cache": "^1.7.1",
"dotenv": "10.0.x",
"semver": "^7.3.5",
"string-argv": "^0.3.1",
"superagent": "^3.8.3",
"superagent": "^6.1.0",
"tmp": "^0.2.1",
"typescript-string-operations": "^1.4.0",
"ws": ">=3.3.1"
"ws": ">=8.2.3"
},
"devDependencies": {
"@types/node": "^12.19.1",
"@types/semver": "^7.3.4",
"@types/superagent": "^4.1.10",
"@types/tmp": "^0.2.0",
"@typescript-eslint/parser": "^2.8.0",
"eslint": "^5.x",
"eslint-plugin-github": "^2.0.0",
"@typescript-eslint/eslint-plugin": "^5.1.0",
"@typescript-eslint/parser": "^5.1.0",
"eslint": "^7.32.0",
"eslint-plugin-github": "^4.3.2",
"js-yaml": "^3.13.1",
"node-fetch": ">=2.6.1",
"prettier": "^1.19.1",

File diff suppressed because one or more lines are too long

View File

@@ -9,7 +9,7 @@ The action combines all the necessary steps in itself and logic may be divided i
### werf binary setup
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://github.com/werf/werf#backward-compatibility-promise)).
By default, all actions setup actual werf version for [1.1 alpha channel](https://werf.io/releases.html) (more details about channels, werf release cycle and compatibility promise [here](https://werf.io/installation.html#all-changes-in-werf-go-through-all-stability-channels)).
Using the `channel` input the user can switch the release channel.
> This is recommended approach to be up-to-date and to use actual werf version without changing configurations

64559
run/index.js

File diff suppressed because one or more lines are too long

View File

@@ -12,9 +12,9 @@ import * as dotenv from 'dotenv'
import * as werf from './werf'
import {ValidateWerfVersion} from './common'
const WERF_API_GET_CHANNEL_VERSION_URL_METHOD =
'https://werf.io/api/getChannelVersionURL'
const WERF_API_GET_VERSION_URL_METHOD = 'https://werf.io/api/getVersionURL'
const WERF_TUF_SERVER_URL = 'https://tuf.werf.io'
const CACHE_TOOL_NAME = 'werf'
const CACHE_TOOL_DIR = 'werf-tools'
export class Manager {
private readonly channel: string
@@ -32,24 +32,44 @@ export class Manager {
ValidateWerfVersion(this.version)
}
if (process.platform.toString() === 'win32') {
this.os = 'windows'
} else {
this.os = process.platform.toString()
const platform = process.platform.toString()
switch (platform) {
case 'linux':
case 'darwin':
this.os = platform
break
case 'win32':
this.os = 'windows'
break
default:
throw new Error(String.Format(`The platform ${platform} not supported`))
}
this.arch = process.arch
const arch = process.arch
switch (arch) {
case 'x64':
this.arch = 'amd64'
break
case 'arm64':
this.arch = 'arm64'
break
default:
throw new Error(String.Format(`The architecture ${arch} not supported`))
}
}
public async Install(): Promise<void> {
const actualBinaryUrl = await this._getActualBinaryUrl()
const binaryName = actualBinaryUrl.substring(
actualBinaryUrl.lastIndexOf('/') + 1
)
const cachedPath = cache.find(
'werf',
CACHE_TOOL_NAME,
Manager._toolVersionCacheID(actualBinaryUrl)
)
if (cachedPath) {
this.binaryPath = path.join(cachedPath, 'werf')
this.binaryPath = path.join(cachedPath, binaryName)
} else {
this.binaryPath = await this._downloadAndCache(actualBinaryUrl)
}
@@ -62,16 +82,8 @@ export class Manager {
const tmpFile = tmp.fileSync()
const tmpFilePath = tmpFile.name
await this.Exec(['ci-env', 'github', '--as-env-file', '-o', tmpFilePath])
dotenv.config({path: tmpFilePath})
fs.readFile(tmpFilePath, null, function(err, contents) {
if (err) {
console.error(err)
} else {
console.log(contents.toString())
}
})
const res = dotenv.config({path: tmpFilePath})
console.log(res.parsed)
tmpFile.removeCallback()
}
@@ -103,35 +115,29 @@ export class Manager {
}
private async _getActualBinaryUrl(): Promise<string> {
if (this.version !== '') {
const version = this.version.slice('v'.length)
return this._constructReleaseUrl(version)
}
const url = `${WERF_TUF_SERVER_URL}/targets/channels/${werf.MAJOR_MINOR_GROUP}/${this.channel}`
try {
let url: string
let query: {}
if (this.version !== '') {
url = WERF_API_GET_VERSION_URL_METHOD
query = {
version: this.version,
os: this.os,
arch: this.arch
}
} else {
url = WERF_API_GET_CHANNEL_VERSION_URL_METHOD
query = {
group: werf.MAJOR_MINOR_GROUP,
channel: this.channel,
os: this.os,
arch: this.arch
}
}
const resp = await request.get(url).query(query)
return resp.body.data.toString()
const resp = await request
.get(url)
.buffer(true)
.parse(request.parse['application/octet-stream'])
const version = resp.body.toString().trim()
return this._constructReleaseUrl(version)
} catch (err) {
if (err.response && err.response.error) {
let errMessage = err.response.error.message
if (err.response.text) {
errMessage = String.Format('{0}\n{1}', errMessage, err.response.text)
errMessage = String.Format(
'{0}: {1}\n{2}',
url,
errMessage,
err.response.text
)
}
throw Error(errMessage)
@@ -141,19 +147,32 @@ export class Manager {
}
}
private _constructReleaseUrl(version: string): string {
let ext = ''
if (this.os === 'windows') {
ext = '.exe'
}
return String.Format(
'{0}/targets/releases/{1}/{2}-{3}/bin/werf{4}',
WERF_TUF_SERVER_URL,
version,
this.os,
this.arch,
ext
)
}
private async _downloadAndCache(binaryUrl: string): Promise<string> {
const binaryName = binaryUrl.substring(binaryUrl.lastIndexOf('/') + 1)
const downloadedBinaryPath = await cache.downloadTool(binaryUrl)
const parsedDownloadedBinaryPath = path.parse(downloadedBinaryPath)
const cacheDownloadToolDir = parsedDownloadedBinaryPath.dir
const tmpWerfVersionBinaryPath = path.join(cacheDownloadToolDir, 'werf.tmp')
const werfVersionDir = path.join(
const cacheDownloadToolDir = path.dirname(downloadedBinaryPath)
const tmpWerfVersionBinaryPath = path.join(
cacheDownloadToolDir,
parsedDownloadedBinaryPath.name
)
const werfVersionBinaryPath = path.join(
werfVersionDir,
String.Format('werf{0}', parsedDownloadedBinaryPath.ext)
`${binaryName}.tmp`
)
const werfVersionDir = path.join(cacheDownloadToolDir, CACHE_TOOL_DIR)
const werfVersionBinaryPath = path.join(werfVersionDir, binaryName)
// werf-x.x.x -> werf.tmp
// werf.tmp -> werf-x.x.x/werf
@@ -167,7 +186,7 @@ export class Manager {
await cache.cacheDir(
werfVersionDir,
'werf',
CACHE_TOOL_NAME,
Manager._toolVersionCacheID(binaryUrl)
)